Esc последовательности терминала linux
Многие компьютерные терминалы поддерживают специальные кодовые последовательности для управления цветом текста и положением курсора (позиции вывода текста) на экране. Это так называемые escape sequences, ESC-последовательности. Один из таких стандартов обычно называют ANSI Colour. Несколько спецификаций терминалов основаны на стандарте ANSI colour, включая VT100.
Ниже приведен частичный список набора команд VT100.
Примечание: здесь *ESC* в тексте команды (столбец «Коды») таблиц представляет ASCII-символ «escape», шестнадцатеричный код которого равен 0x1B (десятичное значение 27). Части команд, взятые в фигурные скобки, представляют модифицируемые параметры. Например, текст должен быть заменен номером строки.
Device Status. Следующие коды используют для вывода настроек терминала/дисплея, и результат их работы сильно зависит от конкретной реализации терминала (его эмулятора).
Функция | Коды | Описание |
Query Device Code | *ESC*[c | Запрашивает от устройства терминала отчет с кодом устройства (Report Device Code). |
Report Device Code | *ESC*[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*[;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*[;H | Устанавливает текущую позицию курсора, откуда будет начинаться последующий вывод текста. Если не предоставлены параметры row/column (строка/столбец), например *ESC*[H, то курсор переместится «домой», т. е. в левую верхнюю позицию экрана (позиция 0,0). |
Cursor Up | *ESC*[A | Переместит курсор вверх на COUNT строк; по умолчанию (если количество строк не задано) переместит на 1 строку. |
Cursor Down | *ESC*[B | Переместит курсор вниз на COUNT строк; по умолчанию (если количество строк не задано) переместит на 1 строку. |
Cursor Forward | *ESC*[C | Переместит курсор вперед на COUNT позиций; по умолчанию (если количество столбцов не задано) переместит на 1 позицию. |
Cursor Backward | *ESC*[D | Переместит курсор назад на COUNT позиций; по умолчанию (если количество столбцов не задано) переместит на 1 позицию. |
Force Cursor Position | *ESC*[;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*[;r | Разрешает прокрутку от начальной строки до конечной строки . | |
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 | Начать печать в лог; весь принятый текст по мере поступления эхом вводится на принтер. |
Функция | Коды | Описание |
Set Key Definition | *ESC*[;»»p | Связывает строку текста string с клавишей клавиатуры key. показывает клавишу по её значению ASCII в десятичном коде. |
Set Display Attributes. Установка атрибутов дисплея.
Функция | Коды | Описание |
Set Attribute Mode | *ESC*[;. ;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»: