22

Я хотел бы изменить цвета (фон, шрифт, передний план) моего xterm из командной строки. Я слышал, что это можно сделать с помощью escape-последовательностей ANSI.

Если это возможно:

  • Как это сделать?
  • Могу ли я использовать названия цветов или использовать их коды RGB?

6 ответов6

26

Обратите внимание, что современные Xterms поддерживают 32-битный цвет!

Простой пример Чтобы установить красивый темно-фиолетовый фон (эй, каждый на свой собственный) со значением # 53186f, вы делаете:

echo -ne "\033]11;#53186f\007"

Обратите внимание, что это мгновенно меняет цвет всего окна, а не только последующего текста. Это особенно удобно для того, чтобы сделать окно, очевидно, другим после ssh'ing для сервера (например). Поместите вышеуказанное «echo» в ваш .bashrc, и ваш терминал автоматически изменит цвета, когда вы войдете на этот сервер (но не изменится обратно, когда вы нажмете Ctrl-D)

В поисках этого вы можете потратить ЧАСЫ в сети - в большинстве документов говорится только о 16 оригинальных цветах ANSI.

Источники: http://www.steike.com/code/xterm-colors/ и http://rtfm.etla.org/xterm/ctlseq.html (см. "Элементы управления операционной системой")

Обратите внимание: приведенная выше escape-последовательность действительна для XTerms и может не работать для других реализаций "XTerm-подобных" оконных эмуляторов оконных терминалов, которые могут "выглядеть" как XTerm. Например, «gnome-terminal» или "konsole" имеют разные escape-последовательности или могут вообще не реализовывать изменение цвета.

22

Экранирующие последовательности ANSI состоят из последовательности символов, начинающихся с символа Escape, символа 27. Следующим символом часто (хотя и не всегда) является открытая квадратная скобка: [

Команда echo может отправлять escape-символы, если вы укажете -e и используете \e для escape.

Стандарт ANSI определяет 8 цветов плюс яркий режим, что дает в общей сложности 16 возможностей. Последовательность:

\e[<number>m

Где <number> является одним из:

Передний план:

  • 30 черный
  • 31 красный
  • 32 зеленых
  • 33 желтых
  • 34 синий
  • 35 пурпурный
  • 36 Cyan
  • 37 белых

Фон:

  • 40 черный
  • 41 красный
  • 42 зеленых
  • 43 желтых
  • 44 синий
  • 45 пурпурный
  • 46 голубой
  • 47 белых

  • 0 Сбросить все

  • 1 жирный

Итак, чтобы сделать передний план красным, а фон желтым:

$ echo -e "\e[31m\e[43m"

И для включения жирным шрифтом:

$ echo -e "\e[1m"

Конечно, вы можете объединить их все вместе:

$ echo -e "\e[31m\e[43m\e[1m"

Есть много других кодов выхода для других дел.

Например - очистить экран и переместить курсор в верхний левый угол:

$ echo -e "\e[2J\e[1;1H"

Что полезно при смене цвета:

$ echo -e "\e[31m\e[43m\e[1m\e[2J\e[1;1H"

Что изменит цвета, очистит экран и поместит курсор в верхний левый угол. Ну, почти сверху слева. Эхо вставляет возврат каретки, поэтому он движется вниз по линии. Вы можете добавить -n к echo, чтобы предотвратить это, если вы суетливы.

Если вы все испортили и не видите, что печатаете, вы можете сбросить цвета терминала до нормальных, нажав:

Ctrl+v [0 м Обратный

На что вы надеетесь это командная строка. Это будет зависать от неизвестной команды, но вы сможете увидеть, что вы делаете снова.

3

Да. Терминалы ANSI поддерживают коды выхода ANSI. Каждый Код Control Sequence Introducer(CSI) в следующем формате:

ESC[<<<CODE>>>

Символ Ascii 27 (символ ESC ) или 1b в шестнадцатеричном формате, за которым следует левая квадратная скобка, а затем буква, обозначающая действие, которое будет использоваться.

Обратите внимание, что список ; Отдельные параметры могут быть предоставлены непосредственно перед параметром <<<CODE>>> .

Теперь цвета используют подмножество кодов CSI кодов Select Graphic Rendition . Это в форме:

ESC[<<<SGR>>>m

Код SGR передается в качестве параметра CSI . К вашему вопросу относятся коды SGR 30-49. Коды 30-39 устанавливают цвет переднего плана. Коды 40-49 устанавливают цвет фона.

30 - Foreground Black
31 - Foreground Red
32 - Foreground Green
33 - Foreground Yellow
34 - Foreground Blue
35 - Foreground Magenta
36 - Foreground Cyan
37 - Foreground White

40 - Background Black
41 - Background Red
42 - Background Green
43 - Background Yellow
44 - Background Blue
45 - Background Magenta
46 - Background Cyan
47 - Background White

Коды 38 и 48 являются специальными кодами. Это те, которые позволяют вам использовать значения RGB. Формат для них:

ESC[38;2;<r>;<g>;<b>m (Foreground)
ESC[48;2;<r>;<g>;<b>m (Background)

Примечание: альтернативное использование включает \x1b[<3 or 4>8;5;<web safe color index>m . При таком использовании существует совершенно другая цветовая кодировка. Смотрите ссылку в верхней части этого ответа для получения дополнительной информации.

Коды 39 и 49 устанавливают цвета переднего плана и фона на их значения по умолчанию, которые определяются для каждого терминала.

На практике цвета 30-37 и 40-47 немного отличаются от того, что написано на их этикетках.

0 - Black
1 - Darker Red
2 - Darker Green
3 - Dark/Yellow or Brown (varies between terminals)
4 - Dark Blue
5 - Dark Magenta
6 - Dark Cyan
7 - Light Grey

Чтобы получить светлые цвета, вы используете SGI для жирного, 1 . Жирный вводит в заблуждение имя. Это не делает шрифт жирным. Это на самом деле увеличивает яркость текста. При жирном нанесении цвета становятся:

0 - Dark Grey
1 - Bright Red
2 - Bright Green
3 - Bright Yellow
4 - Bright Blue
5 - Bright Magenta
6 - Bright Cyan
7 - White

Примечание: последние два блока чисел цветов относятся как к переднему, так и к фону (<index> + (30 or 40)).

Чтобы удалить все стили (вернуться к стандартному / нормальному режиму), используйте SGR 0.

Коды CSI не все графические. Например, ESC[2J очистит ваш терминал. ESC[<y>;<x>H устанавливает позицию курсора (индексируется 1). Смотрите статью в Википедии для получения дополнительной информации.

Примечание: чтобы проверить это, используйте echo -e или printf .

2

ПРИМЕЧАНИЕ. «^ [» Является escape-символом и вставляется с помощью клавиш CTRL-V, CTRL- [, а ^ G является символом колокольчика, вставляется с помощью клавиш CTRL-V, CTRL-G

Следующий блок находится в моем .bash_profile и гарантирует, что мои xterms в этой системе ВСЕГДА белые на черном, даже после входа в другую систему, которая могла изменить мои цвета.

perl -e '$e=chr(27);print "${e}[37m ${e}[40m ${e}[2J ${e}[1;1H";'
export PS1='^[[37m^[]0;${HOST}: ${PWD}^G^[[40m${USER}@${HOST}:${PWD}
--> '
0

проверьте также проект ScriptEchoColor
это полностью сделано в скриптах bash
он имеет пакеты для Ubuntu здесь
но эти скрипты могут быть установлены в любом дистрибутиве, если вы знаете, как это сделать (последнюю версию можно также загрузить из его git).

Вы можете использовать сокращенные или расширенные названия цветов, такие как:

echoc "@rRedFg@{/blue}BlueFg@{/GREEN}GreenBg"

образец:

Кроме того, не забудьте взглянуть на xtermcontrol, для более полного контроля над самим xterm (а не только над символами).

0

Среди множества кодов ANSI CSI есть один, называемый SGR или Select Graphic Rendition. Это ESC, [ , параметры, m , где параметры представляют собой одно или несколько целых чисел в формате ASCII, разделенных точками с запятой. Множество различных параметров SGR перечислены на странице Википедии выше (хотя это не дает полной информации для всех из них).

Некоторые параметры, такие как 1 (жирный или повышенный уровень интенсивности) и 31 (красный текст), являются автономными и могут использоваться по отдельности или в сочетании, как в ESC[31m или ESC[1;31m чтобы получить стандартный красный и жирный красный передний план текст соответственно.

Другие сами принимают параметры, которые просто предоставляются после кода как числа, разделенные точкой с запятой. Так, например, ESC[38;5;219m будет отображать текст переднего плана расширенным цветом 219, а ESC[38;2;150;100;50m будет отображать его в цвете со значением RGB 150, 100, 50. В этом случае 38 - это команда "расширенный заданный цвет переднего плана", которая всегда сопровождается подкомандой. Подкоманда 2 принимает три параметра, значения красного, зеленого и синего компонентов. Иными словами, подкоманда 5 принимает только еще одно значение - число от 0 до 255, указывающее цвет из таблицы, с которой настроен терминал.

Следующая функция оболочки может быть удобна для использования этих кодов:

sgr() {
    local codes=${1:-0}; shift
    for c in "$@"; do codes="$codes;$c"; done
    echo -n -e "\e[${codes}m"
}

Вы можете использовать это так:

normal=$(sgr 0)
red=$(sgr 31)
echo "Text can be $(sgr 1)made boldface$(sgr 0)" \
     " or ${red}colored red${normal}" \
     " or $(sgr 31 1)even both at the same time$(sgr)."

Обратите внимание, что если вы не задаете параметры для sgr() то по умолчанию используется код SGR 0, что означает отключение всех атрибутов и сброс текста к значениям по умолчанию для этого терминала.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .