Управляющие кодовые последовательности терминала ANSI/VT100 |
![]() |
Добавил(а) microsin | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Многие компьютерные терминалы поддерживают специальные кодовые последовательности для управления цветом текста и положением курсора (позиции вывода текста) на экране. Это так называемые escape sequences, ESC-последовательности. Один из таких стандартов обычно называют ANSI Colour. Несколько спецификаций терминалов основаны на стандарте ANSI colour, включая VT100. Ниже приведен частичный список набора команд VT100. Примечание: здесь *ESC* в тексте команды (столбец "Коды") таблиц представляет ASCII-символ "escape", шестнадцатеричный код которого равен 0x1B (десятичное значение 27). Части команд, взятые в фигурные скобки, представляют модифицируемые параметры. Например, текст {ROW} должен быть заменен номером строки. Device Status. Следующие коды используют для вывода настроек терминала/дисплея, и результат их работы сильно зависит от конкретной реализации терминала (его эмулятора).
Terminal Setup. Коды h и l используются для установки режима терминала/дисплея, и их функционирование зависит от реализации терминала. Настройка обрезки строки с переходом на следующую строку (Line Wrap) это один из нескольких кодов настройки, которые часто используются:
Шрифты. Некоторые терминалы поддерживают несколько шрифтов: normal/bold (обычный/толстый), swiss/italic (швейцарский/наклонный), и т. д. Имеется несколько разных специальных кодов для определенных терминалов; следующие обычно считаются стандартными:
Cursor Control. Управление положением курсора (позиции вывода текста) на экране - ИМХО, это наиболее интересная возможность, которая позволяет реализовать полноэкранный интерфейс управления. В частности, широко известный менеджер файлов Midnight Commander было бы невозможно реализовать, если бы не было функции Cursor Control.
Примечание: коды сохранения и восстановления позиции курсора не обслуживаются многими эмуляторами терминала. Единственные, которые это делают, насколько мне известно, это xterm и nxterm, хотя большинство эмуляторов терминала базируются на коде xterm. В настоящий момент tell, rxvt, kvt, xiterm и Eterm не поддерживали функцию сохранения и восстановления позиции курсора. Scrolling. Это команды, управляющие скроллингом (прокруткой) экрана терминала.
Tab Control. Команды управления табуляцией.
Примечание: позиции табуляции это определенные позиции в строке, куда курсор будет перемещаться при выводе символа табуляции \t. Если позиции табуляции очищены, то курсор будет перемещаться в позиции, кратные интервалу табуляции по умолчанию (обычно 4 столбца). Erasing Text. Команды для стирания текста.
Printing. Некоторые терминалы поддерживают локальный вывод на печать:
Define Key.
Set Display Attributes. Установка атрибутов дисплея.
0 Сбросить все атрибуты Foreground Colours (цвет пера, этим цветом выводится текст): 30 Black (черный) Background Colours (цвет бумаги, или цвет фона): 40 Black (черный) [Примеры использования] Управляющие кодовые последовательности терминала 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. |