Поэтому я пишу эмуляцию терминала (я знаю, я должен просто скомпилировать putty и т. Д.) И нахожусь на стадии доработки через vttest, чтобы убедиться, что это правильно. Сейчас я основываюсь на VT102, но добавлю более поздние функции терминала, такие как цвет, когда основы работают правильно.
Набор команд в основном ANSI. У DEC был свой собственный набор команд, но он поддерживал команды ANSI примерно с 1973 года. Эти стандарты ANSI, по-видимому, сейчас недоступны, но есть эквиваленты ECMA, у меня они есть (ECMA-48 кажется наиболее подходящим), но я не отвечаю на этот вопрос, насколько я можно увидеть. Большинство последовательностей команд ANSI начинаются с ESC. Многие команды начинаются с идентификатора последовательности команд, показанного здесь как CSI и представленного в данных как 0x1c 0x5b (ESC [
) или 0xdb, если возможна 8-битная связь. Затем последовала последовательность, идентифицирующая команду. Некоторые команды влияют на положение курсора, некоторые - на экран, другие - вызывают ответ на хост и так далее.
Некоторые команды терминала содержат числовой аргумент. Пример CSI 10 ; 5 H
означает создание строки положения курсора 10, столбец 5. Если числовой аргумент отсутствует, используется значение по умолчанию: CSI 10 ; H
означает создание строки положения курсора 10, столбец 1, поскольку 1 является значением по умолчанию, когда аргумент не задан.
У меня есть руководство по vt102 от vt100.net (отличный ресурс) и около десятка страниц, дающих частичную информацию об этих последовательностях команд. По-видимому, полная спецификация терминала Евангелия DEC никогда не делалась из DEC.
Ясно, что CSI C
это перемещение курсора вправо и значение по умолчанию 1.
Что не ясно, так это в чем смысл CSI 0 C
.
Почему там ноль, кажется, что команда ничего не делает? Если это означает «использовать значение по умолчанию», то это могло бы быть отправлено как 1 вместо этого, но более короткая строка не будет иметь аргумента и полагаться на значение по умолчанию, интерпретируемое как 1 в любом случае. Эти реальные физические терминалы VT часто использовались на скорости 300 бод и ниже, поэтому один символ имел значение!
Я не настолько продвинут с vttest, что могу просто попробовать оба способа и посмотреть, что делает все идеально, но я достаточно далеко, чтобы такие маленькие вопросы начинали иметь значение.
[
, который может быть закодирован как двухсимвольная последовательностьESC [
или как[
с 8-ым установленным битом. (Некоторые модели могут поддерживать толькоESC [
) Я не знаю, чтоCSI 0 C
сделал на vt102; на xterm это эквивалентноCSI 1 C
. Я подозреваю, но не знаю наверняка, что 0 и отсутствие значения анализируются одинаково в какой-то момент (подумайтеatoi
). Вы искали комментарии в источнике xterm?