Ответ 2
Примечание
Возможно, вы не сможете окрасить Window cmd prompt
, но он должен работать во многих терминалах unix (или unix-like).
Также обратите внимание, что некоторые терминалы просто не поддерживают некоторые (если есть) escape-последовательности ANSI и, особенно, 24-битные цвета.
Использование
Для лучшего решения обратитесь к разделу Curses внизу. Для личного или простого решения (хотя не как кросс-платформенное решение), обратитесь к разделу ANSI Escape Sequences.
TL; DR
Последовательности выхода ANSI
Фон на последовательностях выхода
В то время как это не лучший способ сделать это, самый простой способ сделать это на языке программирования или скриптинга - использовать escape-последовательности. По этой ссылке:
Управляющая последовательность представляет собой серию символов, используемых для изменения состояния компьютеров и их подключенных периферийных устройств. Они также известны как управляющие последовательности, отражающие их использование в управлении устройством.
Backgound на последовательностях выхода ANSI
Тем не менее, это становится еще проще, чем в видеотексте, поскольку эти терминалы используют ANSI escape-последовательности. По этой ссылке:
Управляющие последовательности ANSI являются стандартом для внутриполосной сигнализации для управления расположением курсора, цветом и другими параметрами на текстовых текстовых терминалах. Определенные последовательности байтов, большинство из которых начинаются с Esc и '[', встроены в текст, который терминал ищет и интерпретирует как команды, а не как коды символов.
Как использовать escape-последовательности ANSI
Вообще
- Последовательности Escape начинаются с escape-символа; для escape-последовательностей ANSI последовательность всегда начинается с ESC (ASCII:
27
/hex: 0x1B
).
- Список того, что вы можете сделать, см. в ANSI Escape Sequence List в Википедии
В языках программирования
Некоторые программирующие langauges (например, Java) не будут интерпретировать \e
или \x1b
как символ ESC. Однако мы знаем, что символ ASCII 27
имеет символ ESC, поэтому мы можем просто приписать 27
в char
и использовать его для запуска escape-последовательности.
Вот несколько способов сделать это в общих языках программирования:
-
Java
-
System.out.println((char)27 + "[33mYELLOW");
-
Python 3
-
print(chr(27) + "[34mBLUE");
-
print("\x1b[35mMAGENTA");
- Обратите внимание, что
\x1b
правильно интерпретируется в python
-
Node JS
- Следующий ниже НЕ вывод цвета в JavaScript в веб-консоли
-
console.log(String.fromCharCode(27) + "[36mCYAN");
-
console.log("\x1b[30;47mBLACK_ON_WHITE");
- Обратите внимание, что
\x1b
также работает в node
В командной строке оболочки OR Scripts
Если вы работаете с bash или zsh, довольно легко покрасить вывод (в большинстве терминалов). В Linux, Os X и в некоторых терминалах Windows вы можете проверить, поддерживает ли ваш терминал цвет, выполнив следующие действия:
-
printf '\e[31mRED'
-
printf '\x1b[31mRED'
Если вы видите цвет для обоих, то это здорово! Если вы видите цвет только для одного, используйте эту последовательность. Если вы не видите цвета ни для одного из них, тогда дважды проверьте, чтобы убедиться, что вы правильно ввели все, и что вы находитесь в bash или zsh; если вы все еще не видите никакого цвета, ваш терминал, вероятно, не поддерживает escape-последовательности ANSI.
Если я правильно помню, терминалы linux имеют тенденцию поддерживать как escape-последовательности \e
, так и \x1b
, тогда как терминалы os x имеют тенденцию поддерживать \e
, но я могу ошибаться. Тем не менее, если вы видите что-то вроде следующего изображения, тогда вы все настроены! (Обратите внимание, что я использую оболочку, zsh, и она окрашивает строку приглашения, также я использую urxvt в качестве моего терминала в Linux.)
![ANSI Escape Sequences Coloring Text Red]()
"Как это работает?" вы можете спросить. Bascially, printf
интерпретирует последовательность символов, которая следует (все внутри одиночных кавычек). Когда printf
встречается \e
или \x1b
, он преобразует эти символы в символ ESC (ASCII: 27). Это то, что мы хотим. Теперь printf
отправляет ESC 31m
, и поскольку существует ESC, за которым следует действительная escape-последовательность ANSI, мы должны получить цветной вывод (пока он поддерживается терминалом).
Вы также можете использовать echo -e '\e[32mGREEN'
(например) для вывода цвета. Обратите внимание, что флаг -e
для echo
"[позволяет] интерпретировать escape-обраты с обратным слэшем" и должен использоваться, если вы хотите, чтобы echo
надлежащим образом интерпретировал escape-последовательность.
Подробнее о последовательностях отмены ANSI
Последовательности escape ANSI могут делать больше, чем просто вывод цвета, но пусть начнется с этого и посмотрим, как именно работает цвет; то мы увидим, как манипулировать курсором; наконец, мы рассмотрим, как использовать 8-битный цвет, а также 24-битный цвет (хотя он имеет лишь незначительную поддержку).
В Wikipedia они относятся к ESC [ как CSI
, поэтому я сделаю то же самое.
Цвет
Для вывода цвета с использованием экранов ANSI используйте следующее:
-
CSI
n
m
-
CSI
: escape-символ- ^[[
или ESC [
-
n
: номер один из следующего:
-
30
- 37
, 39
: передний план
-
40
- 47
, 49
: background
-
m
: буквальный ASCII m
- завершает escape-последовательность
Я буду использовать bash или zsh, чтобы продемонстрировать все возможные комбинации цветов. Выполните следующие действия в bash или zsh, чтобы убедиться в этом (вам может потребоваться заменить \e
на \x1b
):
-
for fg in {30..37} 39; do for bg in {40..47} 49; do printf "\e[${fg};${bg}m~TEST~"; done; printf "\n"; done;
Результат:
![различные цвета переднего плана/фона с использованием экранов ANSI]()
Краткий справочник (цвет)
+~~~~~~+~~~~~~+~~~~~~~~~~~+
| fg | bg | color |
+~~~~~~+~~~~~~+~~~~~~~~~~~+
| 30 | 40 | black |
| 31 | 41 | red |
| 32 | 42 | green |
| 33 | 43 | yellow |
| 34 | 44 | blue |
| 35 | 45 | magenta |
| 36 | 46 | cyan |
| 37 | 47 | white |
| 39 | 49 | default |
+~~~~~~+~~~~~~+~~~~~~~~~~~+
Выберите графическое представление (SGR)
SGR позволяет вам изменять текст. Многие из них не работают на определенных терминалах, поэтому используйте их экономно в проектах на уровне производства. Тем не менее, они могут быть полезны для того, чтобы сделать вывод программы более понятным или помогать вам различать разные типы выходных данных.
Цвет действительно попадает под SGR, поэтому синтаксис одинаков:
-
CSI
n
m
-
CSI
: escape-символ- ^[[
или ESC [
-
n
: номер один из следующего:
-
0
: reset
-
1
- 9
: включает различные текстовые эффекты
-
21
- 29
: отключает различные текстовые эффекты (менее поддерживается, чем 1
- 9
)
-
30
- 37
, 39
: цвет переднего плана
-
40
- 47
, 49
: цвет фона
-
38
: 8- или 24-битный цвет переднего плана (см. 8/24-битный цвет)
-
48
: 8- или 24-битный цвет фона (см. 8/24-битный цвет)
-
m
: буквальный ASCII m
- завершает escape-последовательность
Несмотря на то, что слабая поддержка слабых (2), курсив (3), подчеркивание (4), мигание (5,6), обратное видео (7), скрытие (8) и вычеркнутое (9), некоторые (но редко все) имеют тенденцию работать на терминалах linux и os x.
Также стоит отметить, что вы можете отделить любой из вышеуказанных атрибутов с помощью двоеточия. Например, printf '\e[34;47;1;3mCRAZY TEXT\n'
покажет CRAZY TEXT
с blue foreground
на a white background
, и это будет bold
и italic
.
Например:
![строковые атрибуты вместе пример скриншота]()
Выполните следующие действия в оболочке bash или zsh, чтобы увидеть все текстовые эффекты, которые вы можете сделать. (Возможно, вам нужно заменить \e
на \x1b
.)
-
for i in {1..9}; do printf "\e[${i}m~TEST~\e[0m "; done
Результат:
![Состояние SGR 2]()
Вы можете видеть, что мой терминал поддерживает все текстовые эффекты кроме для слабых (2), скрывает (8) и вычеркивает (9).
Краткий справочник (атрибуты SGR 0-9)
+~~~~~+~~~~~~~~~~~~~~~~~~+
| n | effect |
+~~~~~+~~~~~~~~~~~~~~~~~~+
| 0 | reset |
| 1 | bold |
| 2 | faint* |
| 3 | italic** |
| 4 | underline |
| 5 | slow blink |
| 6 | rapid blink* |
| 7 | inverse |
| 8 | conceal* |
| 9 | strikethrough* |
+~~~~~+~~~~~~~~~~~~~~~~~~+
* not widely supported
** not widely supported and sometimes treated as inverse
8-битный цвет
В то время как большинство терминалов поддерживают это, оно менее поддерживается, чем 0-7
, 9
цвета.
Синтаксис:
-
CSI
38;5;
n
m
-
CSI
: escape-символ- ^[[
или ESC [
-
38;5;
: буквальная строка, которая обозначает использование 8-битных цветов
-
n
: номер один из следующего:
Если вы хотите просмотреть все цвета в своем терминале красивым способом, у меня есть приятный script на gist.github.com.
Он выглядит следующим образом:
![8-битный пример снимка экрана]()
24-битный цвет
Также известный как истинный цвет, 24-битный цвет обеспечивает отличную функциональность. Поддержка этого определенно возрастает (насколько я знаю, он работает в большинстве современных терминалов, кроме urxvt, мой терминал [вставить сердитый эможи]).
24-битный цвет фактически поддерживается в vim (см. vim wiki, чтобы узнать, как включить 24-битные цвета). Это действительно аккуратно, потому что он тянет из цветов, определенных для gvim; например, он использует fg/bg из highlight guibg=#______ guifg=#______
для 24-битных цветов! Неато, да?
Вот как работает 24-битный цвет:
-
CSI
38;2;
r
;
g
;
b
m
-
CSI
: escape-символ- ^[[
или ESC [
-
38;2;
: буквальная строка, которая обозначает использование 24-битных цветов
-
r
, g
, b
: числа - каждый должен быть 0
- 255
Чтобы проверить только несколько из многих цветов, которые вы можете иметь (возможно, (2^8)^3
или 2^24
или 16777216
), вы можете использовать это в bash или zsh:
-
for r in 0 127 255; do for g in 0 127 255; do for b in 0 127 255; do printf "\e[38;2;${r};${g};${b}m($r,$g,$b)\e[0m "; done; printf "\n"; done; done;
Результат (это в gnome-терминале, так как urxvt НЕ ПОДДЕРЖИВАЕТ 24-битный цвет... объедините его, поддерживающий urxvt... для реального):
![24-битный пример снимка экрана]()
Вставка исходных последовательностей выхода
Иногда \e
и \x1b
не будут работать. Например, в sh-оболочке иногда не работает (хотя в моей системе сейчас она работает), я не думаю, что она использовалась).
Чтобы обойти это, вы можете использовать CTRL + V, CTRL + [ или CTRL V, ESC
Это добавит символ "raw" ESC (ASCII: 27). Это будет выглядеть как ^[
, но не волнуйтесь; это только один символ, а не два.
Например:
![sh raw escape char пример скриншота]()
Проклятия
Я довольно устал, так как я работал над этим довольно долгое время, но я закончу это позже сегодня или когда-нибудь в ближайшем будущем, чтобы, если кто-то хочет сделать профессиональное или более кросс-платформенное приложение который использует цвет, движение курсора и т.д., это должно помочь.
Теперь вы можете просто ссылаться на страницу Curses (Библиотека программирования).