Управляющие кодовые последовательности терминала ANSI/VT100 Печать
Добавил(а) microsin   

Многие компьютерные терминалы поддерживают специальные кодовые последовательности для управления цветом текста и положением курсора (позиции вывода текста) на экране. Это так называемые 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.