Чтение онлайн

на главную

Жанры

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:

a bold word

21.3.1. Управляющие символы

Консоль считывает управляющие символы незамедлительно, действует в соответствии с ними и затем продолжает считывать символы в нормальном режиме.

В файлах и документации

termcap
и
terminfo
управляющие символы изображаются символом
^c
. Мы будем часто в данной книге использовать это условное обозначение, поскольку оно более универсально и удобно для вас, чем восьмеричные управляющие последовательности С. Для отыскания числового значения управляющего символа в некоторых системах предусмотрен макрос
CTRL
в
<termios.h>
, но он не является стандартным для всех систем.

В качестве замены мы предлагаем нашу собственную версию

CTRLCHAR
.

#define CTRLCHAR(ch) ((ch)&0x1F)

Она используется так:

if (с == CTRLCHAR('С')) {

 /*
был нажат символ Control-C */

}

Управляющие символы, воспринимаемые консолью Linux, описаны в табл. 21.1. Символ

^?
фактически представляет собой
'?'+0100
, а не
'?'-0100
, поэтому это не настоящий управляющий знак вопроса, но в любом случае стандартное обозначение для него
^?
. Его значение есть 0177 (восьмеричное), 127 (десятичное), 7F (шестнадцатеричное). Вы не сможете использовать макрос
CTRL
, описанный только что, для проверки. Вместо этого придется применять числовое значение 127.

Таблица 21.1. Символы управления консолью

Управляющий символ Имя ASCII Описание
^G
BEL
Выдает тональный сигнал.
BS
Курсор перемещается к предыдущему символу, не перезаписывая его (если только курсор не находится в первой колонке).
^I
НТ
Горизонтальная табуляция; курсор перемещается к следующей точке табуляции.
^J
LF
Новая строка; курсор перемещается на следующую строку; если курсор уже находился в самой нижней точке области прокручивания, то она продвигается вверх.
^K
VT
Вертикальная табуляция; интерпретируется так же, как новая строка.
^L
FF
Подача страницы; интерпретируется так же, как новая строка.
CR
Возврат каретки; курсор перемещается в начало текущей строки.
^N
SO
Сдвиг; используется альтернативный (
G1
) символ, установленный для отображения глифов; изображаются глифы для управляющих символов.
^O
SI
Сдвиг; используется стандартный (
G0
) символ, установленный для отображения глифов; не изображаются глифы для управляющих символов.
^X
CAN
Отменяется любая действующая управляющая последовательность.
^Z
SUB
Отменяется любая действующая управляющая последовательность.
^[
ESC
ESCape; начало управляющей последовательности.
^?
DEL
Игнорируется.
ALT-^[
Вводится последовательность команд, которая будет описана далее.

Обратите внимание на то, что результат некоторых из данных кодов зависит от настроек 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. Управляющие последовательности

Существуют несколько отдельных типов управляющих последовательностей. Самый простой тип представляет собой символ перехода (

^[
), за которым следует один командный символ. (Несмотря на то что символ перехода отображается в строках С как
\033
, в файлах и документации по
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. Составные управляющие последовательности

Поделиться:
Популярные книги

Горькие ягодки

Вайз Мариэлла
Любовные романы:
современные любовные романы
7.44
рейтинг книги
Горькие ягодки

Сама себе хозяйка

Красовская Марианна
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Сама себе хозяйка

Черный Маг Императора 6

Герда Александр
6. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
7.00
рейтинг книги
Черный Маг Императора 6

Последний Паладин. Том 2

Саваровский Роман
2. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 2

Огни Аль-Тура. Завоеванная

Макушева Магда
4. Эйнар
Любовные романы:
любовно-фантастические романы
эро литература
5.00
рейтинг книги
Огни Аль-Тура. Завоеванная

Законы Рода. Том 7

Flow Ascold
7. Граф Берестьев
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Законы Рода. Том 7

Жандарм 2

Семин Никита
2. Жандарм
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Жандарм 2

Измена. Мой заклятый дракон

Марлин Юлия
Любовные романы:
любовно-фантастические романы
7.50
рейтинг книги
Измена. Мой заклятый дракон

Его темная целительница

Крааш Кира
2. Любовь среди туманов
Фантастика:
фэнтези
5.75
рейтинг книги
Его темная целительница

Кодекс Охотника. Книга V

Винокуров Юрий
5. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
4.50
рейтинг книги
Кодекс Охотника. Книга V

Неудержимый. Книга XVI

Боярский Андрей
16. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XVI

Жена по ошибке

Ардова Алиса
Любовные романы:
любовно-фантастические романы
7.71
рейтинг книги
Жена по ошибке

Real-Rpg. Город гоблинов

Жгулёв Пётр Николаевич
1. Real-Rpg
Фантастика:
фэнтези
7.81
рейтинг книги
Real-Rpg. Город гоблинов

Венецианский купец

Распопов Дмитрий Викторович
1. Венецианский купец
Фантастика:
фэнтези
героическая фантастика
альтернативная история
7.31
рейтинг книги
Венецианский купец