Обратите внимание на то, что результат некоторых из данных кодов зависит от настроек tty. Хотя сама консоль описана здесь абсолютно точно, настройки tty могут изменять передаваемые символы. Например, передача ^J (LF) обычно вынуждает уровень tty также передавать ^M (CR), а символ ^? (DEL) может быть настроен на передачу ^Н (BS).
Символ ALT-^[ вообще не является символом ASCII. Это восьмибитовый символ ESC, тогда как ASCII определяет только семибитовые символы. Вы можете применять этот символ в качестве комбинации быстрого вызова для ввода последовательности CSI. Однако мы рекомендуем избегать этого, так как при этом понадобится чистый восьмибитовый канал связи, который может помешать удаленной работе вашей программы на другой подключенной системе Linux, возможно, из-за последовательного канала, передающего только семь битов из каждого байта.
Для получения более подробной информации о символах ASCII обратитесь к man-странице ascii(7). Кроме того, на man-странице iso_8859_1(7) рассматривается набор восьмибитовых знаков ISO Latin 1 (точнее говоря, ISO 8859 Latin Alphabet number 1); этот более новый стандарт стал фактической заменой ASCII и сейчас официально называется ISO 646-IRV.
21.3.2. Управляющие последовательности
Существуют несколько отдельных типов управляющих последовательностей. Самый простой тип представляет собой символ перехода (^[), за которым следует один командный символ. (Несмотря на то что символ перехода отображается в строках С как 33, в файлах и документации по termcap и terminfo принято обозначение ^[.) Пять из таких односимвольных команд предваряют более сложные управляющие последовательности, которые называются командными последовательностями. Остальные побуждают консоль предпринимать простые действия и немедленно покидать режим перехода. Простейшие управляющие последовательности описаны в табл. 21.2.
Таблица 21.2. Последовательности управления консолью
Управляющие последовательности Описание ^[М Курсор перемещается вверх на одну строку в текущей колонке; если необходимо, то экран прокручивается вниз (обратный перевод строки). ^[D Курсор перемещается вниз на одну строку в текущей колонке; если необходимо, то экран прокручивается вверх (перевод строки) ^[E Возврат каретки и перевод строки. ^[Н Точка табуляции устанавливается в текущей колонке. ^[7 Сохраняются позиция и атрибуты курсора. ^[8 Восстанавливаются позиция и атрибуты курсора. ^[> Переводит малую клавиатуру в числовой режим (стандартный). ^[= Переводит малую клавиатуру в режим приложения (она ведет себя как функциональные клавиши DEC VT102). ^[с Сбрасывает все терминальные установки, которые могут быть получены через управляющие символы и последовательности. ^[Z Запрашивается идентификатор терминала. Ответом будет ^[[?6с; это говорит о том, что консоль точно эмулирует DEC VT102 (она включает в себя расширенный набор возможностей DEC VT102).
Сохранение и восстановление позиции курсора (^[7 и ^[8) не осуществляется в стеке. Если вы делаете два сохранения в одной строке, то вторая сохраняемая позиция перезаписывает первую. Наоборот, один раз сохранив позицию курсора, вы можете восстанавливать ее столько раз, сколько нужно. Всякий раз курсор будет возвращаться в одно и то же расположение. При восстановлении положения курсора также восстанавливаются атрибуты изображения курсора, текущий набор символов, описания набора символов (все это будет описываться далее в данной главе).
Позиция курсора задается в показателях адреса знакоместа, парой чисел x,y, которая обозначает одну позицию на экране. Нумерация адресов знакомест на большинстве терминалов, включая консоль Linux, не начинается с нуля, как это принято в обычной компьютерной практике. Верхний левый символ на экране является началом отсчета и получает адрес как знакоместо 1,1.
Обратите внимание на то, что управляющие символы могут включаться внутри управляющей последовательности. Например, ^[^G8 сначала выдает тональный сигнал, а затем восстанавливает позицию и атрибуты курсора. Последовательность ^[^X8 просто печатает число 8.
21.3.3. Тестирование последовательностей
Для проверки большинства последовательностей вам нужно просто войти в виртуальную консоль и запустить cat. Введите последовательности, которые вы хотите протестировать, и увидите результаты. Для ^[ нажмите клавишу <Esc>.
Терминалы отвечают на команды вроде идентификации терминала ^[Z или команды CSIn, рассматриваемые позже, управляющим последовательностями, которые на терминалах не отображаются. В тех случаях, когда вы хотите увидеть подобное взаимодействие, просто запустите
cat > /tmp/somefile
Затем введите команды, после которых укажите возврат каретки и ^D. Используйте less, vi, Emacs или какую-то другую программу, которая может обрабатывать произвольные символы для того, чтобы прочитать /tmp/somefile, где непосредственно после напечатанных вами последовательностей вы найдете ответы на них.
21.3.4. Составные управляющие последовательности
Пять двухсимвольных управляющих последовательностей (которые показаны в табл. 21.3) фактически являются префиксами более длинных и сложных последовательностей. Рассмотрим каждую из них по очереди.
Таблица 21.3. Составные последовательность управления консолью
Управляющие последовательности Описание ^[[ Начинается последовательность CSI (ALT-^[ является синонимом). ^[] Начинается последовательность управления палитрой. ^[% Начинается последовательность UTF (UTF-8 wide-character Unicode). ^[( Выбирается шрифт, соответствующий набору символов G0. ^[) Выбирается шрифт, соответствующий набору символов G1. ^[#8 Внутренняя тестовая последовательность DEC; заполняет экран символами Е.
Последовательности CSI имеют три или четыре части.
1. ^[[ запускает последовательность CSI, переводя терминал в режим CSI.
2. Только для последовательностей h и l вы можете добавлять символ ?, что позволит устанавливать или очищать собственные режимы DEC (см. табл. 21.9).
3. Предусматривается не более чем 16 параметров. Параметры — это десятичные числа, разделенные символами ;. Например, 1;23;45 представляет собой список из трех параметров: 1, 23 и 45. (Если после прочтения 16 параметров обнаруживается разделитель ;, то последовательность CSI немедленно прерывает работу и терминал переходит в нормальный режим, распечатывая оставшуюся часть последовательности).
4. Командный символ прерывает последовательность и определяет способ интерпретации параметров, которые терминал только что обнаружил.
На параметры обычно ссылаются как на некоторые переменные от par1 до par16. Если вы не установили параметр явно, то его значение автоматически приравнивается к нулю или единице, в зависимости от смысла операции. Командные символы CSI перечислены в табл. 21.4.
Таблица 21.4. Последовательности CSI
Символ Описание h Устанавливает режим; см. табл. 21.8. l Очищает режим; см. табл. 21.8. n
par1=5 Отчет о состоянии: терминал отвечает ^[[0n, что означает "OK"
par1=6 Отчет о положении курсора: терминал отвечает ^[[x;yR, где
у указывается относительно начала отсчета, а не области (если выбран режим начала отсчета, смотрите табл. 21.9) G или ` Устанавливает горизонтальное положение курсора в колонке
par1. A Передвигает вертикальную позицию курсора вверх на
par1 строк. В или e Передвигает вертикальную позицию курсора вниз на
par1 строк. С или a Передвигает горизонтальную позицию курсора вправо на
par1 колонок. D Передвигает горизонтальную позицию курсора влево на
par1 колонок. E Передвигает курсор в начало линии и ниже на
par1 строк (1 по умолчанию). F Передвигает курсор в начало линии и выше на
par1 строк (1 по умолчанию). d Устанавливает вертикальное положение курсора в строке
par1. H или f Устанавливает вертикальное положение курсора в строке
par1 и горизонтальное положение курсора в колонке
par2 (по умолчанию оба параметра равны нулю, перемещая курсор в начало отсчета). J
par1=0 Очищает экран от курсора до конца дисплея
par1=1 Очищает экран от начала отсчета до курсора
par1=2 Очищает экран полностью K
par1=0 Очищает экран от курсора до конца строки
par1=1 Очищает экран от начала строки до курсора
par1=2 Очищает строку полностью L Вставляет
par1 строк ниже текущей строки. М Удаляет
par1 строк, начиная с текущей строки. P Удаляет
par1 символов, начиная с текущей позиции, передвигая остальную часть строки влево. с Отвечает ^[[?6c (синоним ^[Z). g
par1=0 Удаляет точку табуляции в текущем столбце (по умолчанию)
par1=3 Удаляет все точки табуляции m Последовательность изображения символов; смотрите табл. 21.7. q Включает клавиатурный LED
par1 и отключает остальные (0 выключает все). r Устанавливает область прокручивания (применяется только в режиме начала отсчета DEC; см. табл. 21.9):
par1 Первая строка области, должна находиться в пределах от 1 (по умолчанию) до
par2–1
par2 Последняя строка области, должна находиться в пределах от
par1+1 и нижней строкой (по умолчанию) s Сохраняет позицию и атрибуты курсора (синоним ^[7). u Восстанавливает позицию и атрибуты курсора (синоним ^[8). X Стирает
par1 символов (до конца текущей строки). @ Стирает
par1 символов (до конца текущей строки). ] Последовательности setterm; смотрите табл. 21.10.
Несколько последовательностей принимают аргументы, описывающие цвета. Во всех таких последовательностях используется одно и то же соответствие между числами и цветами, приведенное в табл. 21.5. Последовательности, которые указывают цвета фона, допускают номера цветов только от 0 до 7. Те последовательности, которые задают цвет переднего плана, принимают числа от 8 до 15 (они описывают насыщенные или яркие цвета).