Вопросы последовательности команд DEC ANSI; движение курсора

8

Поэтому я пишу эмуляцию терминала (я знаю, я должен просто скомпилировать 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, что могу просто попробовать оба способа и посмотреть, что делает все идеально, но я достаточно далеко, чтобы такие маленькие вопросы начинали иметь значение.

Адам Эбербах
источник
2
Замечание по терминологии: CSI является escape- [, который может быть закодирован как двухсимвольная последовательность ESC [или как [с 8-ым установленным битом. (Некоторые модели могут поддерживать только ESC [) Я не знаю, что CSI 0 Cсделал на vt102; на xterm это эквивалентно CSI 1 C. Я подозреваю, но не знаю наверняка, что 0 и отсутствие значения анализируются одинаково в какой-то момент (подумайте atoi). Вы искали комментарии в источнике xterm?
Жиль "ТАК - перестань быть злым"
Абсолютно правильно, спасибо за редактирование, и ожидаю, что мне нужно будет взглянуть на какой-нибудь источник, чтобы получить больше подсказок.
Адам Эбербах

Ответы:

4

Я связался с Томасом Дики (invisible-island.net), который поддерживает xterm и vttest - он объяснил, что CSI 0 Cэто то же самое, что CSI 1 Cи CSI Cв xterm.

Для тех, кто ищет дополнительную информацию о программировании терминала, я настоятельно рекомендую проверить источник xterm, который он размещает - в частности, ctlseqs.txt внутри xterm, который очень похож на одну настоящую ссылку на последовательности управления терминалом, которую я искал.

Адам Эбербах
источник
Этот исходный файл был полезен для меня, чтобы найти код CSI; информация о CSI , представленной в байте 0x9b из упомянутого ctlseqs.txt, кажется неверной, на самом деле это 0x1b
Hi-Angel
1

Почему совместимость с жестким кодом для конкретного типа терминала, когда у вас уже есть база данных, отображающая функциональность в конкретные последовательности кода для множества различных терминалов? (база данных terminfo обычно находится в / usr / share и включена в большинство дистрибутивов ncurses). Любой ресурс по curses должен объяснить, как эти функции помечены.

Обратите внимание, что файлы terminfo обычно компилируются (используя tic), поэтому вам, возможно, придется немного покопаться, чтобы найти исходные файлы terminfo.

Смотрите также http://tldp.org/HOWTO/Text-Terminal-HOWTO.html#toc16 (есть ссылка в их одном хранилище файлов terminfo.src)

symcbean
источник
Устройство, на которое я помещаю терминал, не имеет terminfo или ncurses, и написание конкретной эмуляции терминала, кажется, лучший способ заставить работать на нем netback. Уже есть сетевые хаки для iPad, но я просто хочу иметь возможность играть на клавиатуре в режиме DECgraphics, а не на любом графическом интерфейсе со схемой сенсорного управления, как все они, похоже, имеют. Я не ожидаю, что это подожжет мир, но я так хочу играть в nethack.
Адам Эбербах
1
Нет - я не говорю, что для вашего оборудования должна быть запись в terminfo - там будет запись для VT102, хотя она описывает все последовательности команд, которые будет использовать nethack или любое другое приложение на основе curses.
Symcbean
Ах, спасибо - это было бы хорошим компактным справочником.
Адам Эбербах