Что такое управляющий код VT100 для самой клавиши «esc» - PullRequest
4 голосов
/ 11 марта 2010

Я пишу скрипт для навигации по системе текстового меню, используя telnetlib для Python для доступа к последовательному соединению.

Я могу счастливо нажимать F-клавиши, используя Escape-коды. например F9 = "\ 033OX", где "\ 033" - escape-последовательность.

Как мне кодировать клавиатуру «esc»? Я ожидал бы только "\ 033", но это не сработало.

Ответы [ 2 ]

6 голосов
/ 11 марта 2010

Поставьте небольшую задержку, скажем, 1,5 с, после отправки побега, чтобы другая сторона поняла, что это изолированный побег, а не часть более длинной последовательности.

5 голосов
/ 10 июля 2010

Не существует такой вещи, как «escape-последовательность» для ключа ESC на VT-100 (или других терминалах, которые использовали escape-последовательности).

Экранирующий символ, ASCII 27, использовался для обозначения того, что следующие последовательности символов имели особое значение. Это обычно помещает терминал в простой конечный автомат. Как правило, правилом было глотать входящие символы до тех пор, пока не будет виден буквенный или символический символ включительно, хотя некоторые особые случаи, такие как символы, могут захватить один дополнительный символ, например, ESC # 6 для символов двойной ширины.

Например, на терминале H-19 / VT-52, ESC H означал дом, ESC E означал очистку экрана и дома, ESC J означал очистку до конца экрана и т. Д. В серии VT-100 использовались ESC [H для home и ESC [2 J для очистки до конца экрана.

Что действительно происходило, так это то, что открытая квадратная скобка (не было закрывающей скобки) говорила о том, что список аргументов, обычно числовой, поступает. «2» в ESC [2 J означает как от курсора до верха (ноль), так и от курсора до конца (один). Переключите J на ​​K, и теперь он очистит линию, а не экран, таким же образом. Они не были произвольными. Четный ESC [row; col H будет принимать числовую строку / col, например, ESC [12; 34 H перейдет к строке 12, столбец 34. Не предоставив их, принял значения по умолчанию.

Теоретически сервер никогда не должен выдавать вам бессмысленный осиротевший символ ESC, так как терминал будет сидеть там и ждать последовательности.

Когда вы нажимаете функциональную клавишу, терминал отправляет символ ESC, за которым следует некоторая предварительно заданная последовательность для функциональной клавиши, стрелки или действия. Например, ESC [21 ~ был F10.

Это оставило очень реальную проблему того, как отправить буквально осиротевший ESC. Было два пути.

Во-первых, отправьте ESC, а затем задержите на некоторое количество. Хозяин должен будет следить не только за тем, что пришло, но и когда. И, работая в предположении, что терминал немедленно отправит блок символов в своем буфере, он внутренне истечет и истечет, что ESC означает просто ESC. Задержка не должна была быть долгой.

Во-вторых, пользователь должен дважды нажать ESC для каждого желаемого литерала ESC. Поскольку ни одна из escape-последовательностей никогда не состояла из двойного escape-символа, это означало особое условие. Это то же самое, что мы делаем при кавычках символов обратной косой черты в строках, «\» действительно означает «\», потому что мы должны удовлетворять лексической фазе компилятора. В данном случае это хост-сервер. Помните, во времена последовательных портов, когда эти терминалы использовались, когда персонаж нажимался, он был отправлен немедленно. Лишь несколько лет спустя мы начали эмулировать терминалы и, таким образом, возникла необходимость эмулировать их escape-последовательности, а не исключать поведение из потока контента.

Конечно, «недопустимая» последовательность ESC означала, что ESC был буквальным, но для этого требовалось увидеть, какими были следующие байты, прежде чем вы могли на них воздействовать (отсюда и решение по тайм-ауту). Иногда проблема заключается в том, что эти символы вызывали побочные эффекты для приложения, неприятные и интересные случаи, когда попытка наивно обмануть систему может привести к неприятностям. например, используйте пробел ESC для принудительного выхода, ESC отменяет одну подсказку, но пробел непреднамеренно подтверждает следующую.

Третьим решением проблемы было просто заставить хост полностью игнорировать специальные функциональные клавиши и принимать входящий поток байтов как литерал. Например, редактор TECO будет отображать знак доллара для пользователя при каждом нажатии ESC, поскольку он использует это для разделителя команд так же, как можно было бы использовать точку с запятой в кодировании сегодня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...