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