Как я могу изменить цвета моего xterm, используя escape-последовательности Ansi?

25

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

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

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

Ответы:

27

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

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

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

\e[<number>m

Где <number>один из:

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

  • 30 черный
  • 31 красный
  • 32 зеленых
  • 33 желтых
  • 34 синий
  • 35 пурпурный
  • 36 голубой
  • 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к эхо, чтобы предотвратить это, если вы суетливы.

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

Ctrl+v [ 0 m Return

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

Majenko
источник
я могу использовать названия цветов вместо цветовых кодов?
Натан Феллман
1
Нет, но вы можете назначить цветовые коды переменным. FGRED = 31; echo -e "\ e [$ {FGRED} m"
Majenko
3
Однако следует отметить, что несколько цветовых кодовых номеров могут быть разделены знаком «;». Таким образом, чтобы сделать передний план красным и фон желтым, вы также можете использовать более короткое: echo -ne '\e[31;43m'(вместо вышеупомянутого echo -e "\e[31m\e[43m").
Андреас Шпиндлер
Как изменить цвет курсора на 34 синего цвета?
trusktr
28

Обратите внимание, что современные 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-последовательности или могут вообще не реализовывать изменение цвета.

Greg
источник
1
Это не работает для меня, это эхом пустая строка без видимых изменений в терминале.
Ричард
1
Это работает для меня, в то время как другие не сделали - очень полезно, ТНХ
vol7ron
1
+1 изменяет фон окна и допускает названия цветов - например, «зеленый» вместо «# 00ff00».
Роб я
1
как это # ​​53186f 32-битных цветов. Я считаю 24 бита ...
Jiggunjer
Кто-нибудь знает, как сделать то же самое с gnome-терминал?
wjandrea
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)).

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

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
он полностью выполнен в Баш сценариев
имеет пакеты для Ubuntu здесь
, но эти сценарии могут быть установлены в любом дистрибутиве , если вы знаете , как (последний можно загрузить с его мерзавцем также).

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

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, что означает отключение всех атрибутов и восстановление текста до значения по умолчанию для этого терминала.

Курт Дж. Сэмпсон
источник
1
Технически эти ESC[38... mи ESC[38... mмогут / должны (зависит от вашего источника информации - я полагаю, что конечным из них является itu.int/rec/T-REC-T.416-199303-I ) должны использовать, в противном случае зарезервированный символ :(для разделения элементов параметров ), так что ;он используется только между полными строками параметров - т.е. ESC[38;2;150;100;50mдолжен быть записан ESC[38:2::150:100:50m...
SlySven
... к сожалению, реализации часто забывают идентификатор цветового пространства между 2и 150- так как никто, насколько мне известно , никогда не определял, какое значение следует указывать там, будет использоваться пустое значение по умолчанию - но его часто пропускают а использование только ;в качестве разделителя делает невозможным надежную обработку информации в соответствии со спецификацией.
SlySven