Як я можу змінити кольори мого xterm за допомогою послідовностей втечі Ansi?


25

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

Якщо це можливо:

  • Як це робиться?
  • Чи можу я використовувати кольорові назви чи потрібно використовувати їх RGB-коди?

Відповіді:


27

Послідовності втечі ANSI складаються з послідовності символів, що починається символом Escape, символом 27. Наступним символом часто (хоча і не завжди) є дужка відкритого квадрата: [

Команда echo може надсилати символи втечі, якщо вказати -eта використовувати \eдля втечі.

Стандарт 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"

Який змінить кольори, очистить екран і поставить курсор у верхній лівий бік. Ну, майже верхній лівий. Echo примушує повернути вагон, тому він рухається вниз по лінії. Ви можете додати -nдо луни, щоб запобігти цьому, якщо ви метушливі.

Якщо ви все зіпсуєте і не бачите, що ви набираєте, ви можете скинути термінальні кольори до нормальних, натиснувши:

Ctrl+v [ 0 m Return

На що ви сподіваєтесь, це командний рядок. Він буде хитатися про невідому команду, але ви зможете побачити, що ви робите знову.


чи можу я використовувати кольорові назви замість кольорових кодів?
Натан Фелман

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 на сервері (наприклад). Помістіть вищезгадане "відлуння" у свій .bashrc, і ваш термінал автоматично змінює кольори під час входу на цей сервер (але не зміниться назад, коли ви Ctrl-D вийдете)

Ви можете витратити HOURS в мережі в пошуках цього - більшість документів говорять лише про оригінальні 16 кольорів ANSI.

Джерела: http://www.steike.com/code/xterm-colors/ та http://rtfm.etla.org/xterm/ctlseq.html (дивіться у розділі "Керування операційною системою")

Зверніть увагу: вищезазначена послідовність скасування дійсна для XTerms і може не працювати для інших реалізацій емуляторів терміналів віконного типу "XTerm-подібний", які можуть "виглядати" як XTerm. Наприклад, "gnome-terminal" або "konsole" мають різні послідовності евакуації або можуть взагалі не реалізувати зміну кольору.


1
Це не працює для мене, це повторюється порожнім рядком без помітних змін у терміналі.
Річард

1
Це працювало для мене, тоді як інші не дуже допомагали, thx
vol7ron

1
+1 змінює фон вікна та дозволяє назви кольорів - наприклад, "зелений" замість "# 00ff00".
Роб I

1
як # 53186f 32-бітні кольори. Я рахую 24 біти ...
jiggunjer

Хтось знає, як зробити те ж саме з gnome-терміналом?
wjandrea

3

Так. Термінали ANSI підтримують коди Escape Escape . Кожен 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-індексовано). Додаткову інформацію див. У статті wikipedia.

Примітка: щоб перевірити їх, використовуйте echo -eабо printf.


2

ПРИМІТКА: "^ [" - символ втечі і вставляється із 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, розділених крапками з комою. На різних сторінках Вікіпедії вказано безліч різних параметрів СГР (хоча вони не входять докладно для всіх).

Деякі параметри, такі як 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.