Добавление цвета
Большинство программ эмуляторов терминалов реагируют на некоторые последовательности непечатаемых символов, например управляющие атрибутами символов (такими, как цвет, жирность и мигание) и позицией курсора. О позиции курсора мы поговорим чуть позже, а сейчас займемся цветом.
недоразумения с терминалами
В стародавние времена, когда дискеты были большими, а терминалы подключались к удаленным компьютерам, существовало великое многообразие моделей терминалов, и все они работали по-разному. Они имели разные клавиатуры и по-разному интерпретировали управляющую информацию. В Unix и в Unix-подобных системах имеются две очень сложные подсистемы (которые называются termcap и terminfo), решающие все проблемы, связанные с управлением терминалами. Если заглянуть в самые потаенные кладовые настроек эмулятора терминала, можно обнаружить параметр, определяющий тип эмулируемого терминала.
Чтобы заставить терминалы говорить на едином языке, Американский национальный институт стандартов (American National Standards Institute, ANSI) разработал набор последовательностей символов для управления видеотерминалами. Заслуженные пользователи DOS еще помнят файл ANSI.SYS, который применялся для интерпретации этих последовательностей.
Цветом символов можно управлять, посылая эмулятору терминала экранированные последовательности ANSI внутри потока символов, предназначенных для вывода на экран. Экранированные последовательности не «выводятся» на экран; они интерпретируются терминалом как инструкции. Как показано в табл. 13.1, для включения непечатаемых символов используются последовательности [ и ]. Экранированные последовательности ANSI начинаются с восьмеричного кода 033 (код, генерируемый клавишей ESC), за которым следует необязательный атрибут символа и инструкция. Например, вот как выглядит код, определяющий текст как простой (атрибут = 0), черного цвета 33[0;30m.
В табл. 13.2 перечислены поддерживаемые цвета текста. Обратите внимание, что цвета делятся на две группы, отличаясь наличием атрибута жирного текста (1), из-за которого возникает впечатление более «светлых» (light) цветов.
Таблица 13.2. Экранированные последовательности, используемые для определения цвета текста
Последовательность
Цвет
33[0;30m
Черный
33[0;31m
Красный
33[0;32m
Зеленый
33[0;33m
Коричневый
33[0;34m
Синий
33[0;35m
Пурпурный
33[0;36m
Бирюзовый
33[0;37m
Светло-серый
33[1;30m
Темно-серый
33[1;31m
Светло-красный
33[1;32m
Светло-зеленый
33[1;33m
Желтый
33[1;34m
Светло-синий
33[1;35m
Светло-пурпурный
33[1;36m
Светло-бирюзовый
33[1;37m
Белый
Давайте попробуем окрасить строку приглашения в красный цвет (здесь она выглядит как серая). Добавьте в начало экранированную последовательность:
<me@linuxbox ~>$ PS1="[33[0;31m]<u@h W>$ "
<me@linuxbox ~>$
Получилось, но обратите внимание, что весь текст, который вводится с клавиатуры вслед за строкой приглашения, также окрашивается в красный цвет. Для устранения этого эффекта добавьте еще одну экранированную последовательность в конец определения приглашения — этим вы сообщите эмулятору терминала, что тот должен восстановить нормальный цвет:
<me@linuxbox ~>$ PS1="[33[0;31m]<u@h W>$[33[0m] "
<me@linuxbox ~>$
Так лучше!
Кроме того, существует возможность изменить цвет фона, для чего предназначены экранированные последовательности, перечисленные в табл. 13.3. Цвет фона не поддерживает атрибут жирного текста.
Таблица 13.3. Экранированные последовательности, используемые для определения цвета фона
Последовательность
Цвет
33[0;40m
Черный
33[0;41m
Красный
33[0;42m
Зеленый
33[0;43m
Коричневый
33[0;44m
Синий
33[0;45m
Пурпурный
33[0;46m
Бирюзовый
33[0;47m
Светло-серый
Чтобы вывести приглашение на красном фоне, достаточно изменить первую экранированную последовательность:
<me@linuxbox ~>$ PS1="[33[0;41m]<u@h W>$[33[0m] "
<me@linuxbox ~>$
Попробуйте другие цвета и посмотрите, что из этого получится!
ПРИМЕЧАНИЕ
Помимо атрибутов символов нормального (0) и жирного (1) текста, есть также атрибут подчеркивания (4), мигания (5) и инверсии (7). В целях воспитания хорошего вкуса многие эмуляторы терминалов не поддерживают атрибут мигания.