Многие компьютерные терминалы поддерживают специальные кодовые последовательности для управления цветом текста и положением курсора (позиции вывода текста) на экране. Это так называемые escape sequences, ESC-последовательности. Один из таких стандартов обычно называют ANSI Colour. Несколько спецификаций терминалов основаны на стандарте ANSI colour, включая VT100.
Ниже приведен частичный список набора команд VT100.
Примечание: здесь *ESC* в тексте команды (столбец "Коды") таблиц представляет ASCII-символ "escape", шестнадцатеричный код которого равен 0x1B (десятичное значение 27). Части команд, взятые в фигурные скобки, представляют модифицируемые параметры. Например, текст {ROW} должен быть заменен номером строки.
Device Status. Следующие коды используют для вывода настроек терминала/дисплея, и результат их работы сильно зависит от конкретной реализации терминала (его эмулятора).
Функция |
Коды |
Описание |
Query Device Code |
*ESC*[c |
Запрашивает от устройства терминала отчет с кодом устройства (Report Device Code). |
Report Device Code |
*ESC*[{code}0c |
Генерируется устройством в ответ на запрос Query Device Code. |
Query Device Status |
*ESC*[5n |
Запрашивает ответ Report Device Status от устройства. |
Report Device OK |
*ESC*[0n |
Генерируется устройством в ответ на запрос Query Device Status; показывает, что устройство функционирует корректно. |
Report Device Failure |
*ESC*[3n |
Генерируется устройством в ответ на запрос Query Device Status; показывает, что есть проблемы в функционировании устройства. |
Query Cursor Position |
*ESC*[6n |
Запрашивает отчет о позиции курсора (Report Cursor Position) от устройства. |
Report Cursor Position |
*ESC*[{ROW};{COLUMN}R |
Генерируется устройством в ответ на запрос Query Cursor Position; сообщает о текущей позиции курсора. |
Terminal Setup. Коды h и l используются для установки режима терминала/дисплея, и их функционирование зависит от реализации терминала. Настройка обрезки строки с переходом на следующую строку (Line Wrap) это один из нескольких кодов настройки, которые часто используются:
Функция |
Коды |
Описание |
Reset Device |
*ESC*c |
Сброс всех настроек терминала в значения по умолчанию. |
Enable Line Wrap |
*ESC*[7h |
Разрешение перехода на следующую строку: позиция вывода автоматически перескакивает на следующую строку, если она оказывается длиннее области отображения дисплея. |
Disable Line Wrap |
*ESC*[7l |
Запрет перехода на следующую строку, если позиция вывода оказывается за пределами правого края экрана. |
Шрифты. Некоторые терминалы поддерживают несколько шрифтов: normal/bold (обычный/толстый), swiss/italic (швейцарский/наклонный), и т. д. Имеется несколько разных специальных кодов для определенных терминалов; следующие обычно считаются стандартными:
Функция |
Коды |
Описание |
Font Set G0 |
*ESC*( |
Установить шрифт по умолчанию. |
Font Set G1 |
*ESC*) |
Установить альтернативный шрифт. |
Cursor Control. Управление положением курсора (позиции вывода текста) на экране - ИМХО, это наиболее интересная возможность, которая позволяет реализовать полноэкранный интерфейс управления. В частности, широко известный менеджер файлов Midnight Commander было бы невозможно реализовать, если бы не было функции Cursor Control.
Функция |
Коды |
Описание |
Cursor Home |
*ESC*[{ROW};{COLUMN}H |
Устанавливает текущую позицию курсора, откуда будет начинаться последующий вывод текста. Если не предоставлены параметры row/column (строка/столбец), например *ESC*[H, то курсор переместится "домой", т. е. в левую верхнюю позицию экрана (позиция 0,0). |
Cursor Up |
*ESC*[{COUNT}A |
Переместит курсор вверх на COUNT строк; по умолчанию (если количество строк не задано) переместит на 1 строку. |
Cursor Down |
*ESC*[{COUNT}B |
Переместит курсор вниз на COUNT строк; по умолчанию (если количество строк не задано) переместит на 1 строку. |
Cursor Forward |
*ESC*[{COUNT}C |
Переместит курсор вперед на COUNT позиций; по умолчанию (если количество столбцов не задано) переместит на 1 позицию. |
Cursor Backward |
*ESC*[{COUNT}D |
Переместит курсор назад на COUNT позиций; по умолчанию (если количество столбцов не задано) переместит на 1 позицию. |
Force Cursor Position |
*ESC*[{ROW};{COLUMN}f |
Принудительная установка позиции курсора. Работает точно так же, как и команда Cursor Home. |
Save Cursor |
*ESC*[s |
Сохраняет текущую позицию курсора. |
Unsave Cursor |
*ESC*[u |
Восстанавливает позицию курсора, как она была сохранена командой Save Cursor. |
Save Cursor & Attrs |
*ESC*7 |
Сохраняет текущую позицию курсора вместе с атрибутами (цвет?). |
Restore Cursor & Attrs |
*ESC*8 |
Восстанавливает текущую позицию курсора вместе с атрибутами, как это было сохранено ранее. |
Примечание: коды сохранения и восстановления позиции курсора не обслуживаются многими эмуляторами терминала. Единственные, которые это делают, насколько мне известно, это xterm и nxterm, хотя большинство эмуляторов терминала базируются на коде xterm. В настоящий момент tell, rxvt, kvt, xiterm и Eterm не поддерживали функцию сохранения и восстановления позиции курсора.
Scrolling. Это команды, управляющие скроллингом (прокруткой) экрана терминала.
Функция |
Коды |
Описание |
Scroll Screen |
*ESC*[r |
Разрешает прокрутку всего экрана целиком. |
*ESC*[{start};{end}r |
Разрешает прокрутку от начальной строки {start} до конечной строки {end}. |
Scroll Down |
*ESC*D |
Прокручивает экран на одну строку вниз. |
Scroll Up |
*ESC*M |
Прокручивает экран на одну строку вверх. |
Tab Control. Команды управления табуляцией.
Функция |
Коды |
Описание |
Set Tab |
*ESC*H |
Устанавливает табуляцию в текущей позиции. |
Clear Tab |
*ESC*[g |
Очищает табуляцию в текущей позиции. |
Clear All Tabs |
*ESC*[3g |
Очищает все установленные позиции табуляции. |
Примечание: позиции табуляции это определенные позиции в строке, куда курсор будет перемещаться при выводе символа табуляции \t. Если позиции табуляции очищены, то курсор будет перемещаться в позиции, кратные интервалу табуляции по умолчанию (обычно 4 столбца).
Erasing Text. Команды для стирания текста.
Функция |
Коды |
Описание |
Erase End of Line |
*ESC*[K |
Стирает текст от текущей позиции курсора до конца текущей строки. |
Erase Start of Line |
*ESC*[1K |
Стирает текст от текущей позиции курсора до начала текущей строки. |
Erase Line |
*ESC*[2K |
Стирает всю текущую строку. |
Erase Down |
*ESC*[J |
Очищает экран от текущей строки вниз до нижней границы экрана. |
Erase Up |
*ESC*[1J |
Очищает экран от текущей позиции вверх до верхней границы экрана. |
Erase Screen |
*ESC*[2J |
Стирание экрана, с заполнением его цветом фона. Курсор при этом перемещается "домой" (верхний левый угол экрана). |
Printing. Некоторые терминалы поддерживают локальный вывод на печать:
Функция |
Коды |
Описание |
Print Screen |
*ESC*[i |
Печать текущего экрана. |
Print Line |
*ESC*[1i |
Печать текущей строки. |
Stop Print Log |
*ESC*[4i |
Запрет печати лога. |
Start Print Log |
*ESC*[5i |
Начать печать в лог; весь принятый текст по мере поступления эхом вводится на принтер. |
Define Key.
Функция |
Коды |
Описание |
Set Key Definition |
*ESC*[{key};"{string}"p |
Связывает строку текста string с клавишей клавиатуры key. {key} показывает клавишу по её значению ASCII в десятичном коде. |
Set Display Attributes. Установка атрибутов дисплея.
Функция |
Коды |
Описание |
Set Attribute Mode |
*ESC*[{attr1};...;{attrn}m |
Устанавливает несколько настроек атрибутов. Ниже приведены списки некоторых стандартных атрибутов. |
0 Сбросить все атрибуты 1 Bright (повышенная яркость) 2 Dim (затемнение) 4 Underscore (нижнее подчеркивание) 5 Blink (мигание) 7 Reverse (инверсия) 8 Hidden (скрыть текст)
Foreground Colours (цвет пера, этим цветом выводится текст):
30 Black (черный) 31 Red (красный) 32 Green (зеленый) 33 Yellow (желтый) 34 Blue (синий) 35 Magenta (пурпурный) 36 Cyan (голубой) 37 White (белый)
Background Colours (цвет бумаги, или цвет фона):
40 Black (черный) 41 Red (красный) 42 Green (зеленый) 43 Yellow (желтый) 44 Blue (синий) 45 Magenta (пурпурный) 46 Cyan (голубой) 47 White (белый)
[Примеры использования]
Управляющие кодовые последовательности терминала ANSI (ANSI escape sequences, так называемые esc-коды, или esc-последовательности) позволят Вам перемещать позицию курсора (позицию вывода текста) в любое нужное знакоместо экрана. Это особенно полезно для полноэкранного интерфейса с пользователем, который генерируется скриптами shell, но также может использоваться в приглашениях ввода (prompts).
Для примера попробуйте вывести следующую строку кода в приглашении терминала (лучше всего результат работы этой команды будет виден, если вставить несколько пустых строк в окне терминала):
echo -en "\033[7A\033[1;35m BASH \033[7B\033[6D"
Эта команда должна переместить курсор на 7 строк вверх, напечатать " BASH ", и затем вернуться в начальную позицию, чтобы сделать нормальное приглашение терминала (prompt). Это не простое приглашение, а просто демонстрация перемещения курсора по экрану, с использованием цвета, чтобы обозначить результат работы команды. Обратите внимание, что ESC-код в командах представлен в восьмеричном формате (\033).
Еще один пример, сохраните этот текст в файле и назовите его "clock":
#!/bin/bash
function prompt_command {
let prompt_x=$COLUMNS-5
}
PROMPT_COMMAND=prompt_command
function clock {
local BLUE="\[\033[0;34m\]"
local RED="\[\033[0;31m\]"
local LIGHT_RED="\[\033[1;31m\]"
local WHITE="\[\033[1;37m\]"
local NO_COLOUR="\[\033[0m\]"
case $TERM in
xterm*)
TITLEBAR='\[\033]0;\u@\h:\w\007\]'
;;
*)
TITLEBAR=""
;;
esac
PS1="${TITLEBAR}\
\[\033[s\033[1;\$(echo -n \${prompt_x})H\]\
$BLUE[$LIGHT_RED\$(date +%H%M)
$BLUE]\[\033[u\033[1A\]$BLUE[$LIGHT_RED\u@\h:\w$BLUE]\
$WHITE\$$NO_COLOUR "
PS2='> 'PS4='+ '
}
Промт, запущенный этим скриптом, выглядит как обычный, за исключением того, что в правом верхнем углу экрана будут выведено значение часов в 24-часовом формате. Этот скрипт не будет работать в терминалах, которые не поддерживают сохранение и восстановление позиции курсора терминала. При попытке выполнить этот скрипт в каком-либо из "неправильных" эмуляторов терминала (которые не поддерживают команду сохранения и восстановления позиции курсора), часы отобразятся правильно, но промт появится на второй строке терминала.
[Ссылки]
1. ANSI/VT100 Terminal Control Escape Sequences site:termsys.demon.co.uk. 2. Terminal control/Cursor positioning site:rosettacode.org. 3. ANSI Escape Sequences: Colours and Cursor Movement site:tldp.org. |