Правильный ответ зависит от того, как вы собираетесь использовать библиотеку.Любой эмулятор терминала читает эти последовательности и выполняет действия на их основе.Но даже простой эмулятор терминала поймет около ста последовательностей.
Ваш пример, возможно, в более читаемой форме, выглядит следующим образом:
\E[s
\E[255B
\E[255C\t_
\E[6n
\E[u
\E[!_^B^B?HTML?
\E[0m_
\E[2J
\E[H\f\r
\n
с использованием unmap
(создание escape-символа \E
и отображение всех символов для печати - и начало новой строки для escape-символов).
ECMA-48 описывает формат для
- однобайтовые управляющие символы и
- многобайтовые управляющие последовательности (начиная с escape-символа).
Управляющие последовательности имеют содержимое (параметры), ограниченное определенными символамитакие как цифры и разделители, например, ';'
.Контрольные последовательности также имеют определенное окончание, которое называется символом final .Последовательность \E[!_^B^B?
не соответствует этим правилам.Как указано в комментарии, возможно, ваша запись была смущена ответом терминала на запрос позиции курсора \E[6n
.
С таким большим контекстом:
- некоторые действия, выполняемыеэмулятор терминала изменяет отображение (
\E[2J
очищает дисплей) - некоторые действия, выполняемые эмулятором терминала, сообщают хосту о отображении (
\E[6n
запрашивает у терминала, гдекурсор равен ) - некоторые действия, выполняемые эмулятором терминала, изменяют поведение терминала (
\E[s
и \E[u
сохраняют позицию курсора и восстанавливают ее позже)
Короче говоря, вы можете видеть, что для обработки управляющих последовательностей, полученных терминалом, вам действительно нужна программа терминала для всего этого.Однако не все эмуляторы терминала одинаковы.Некоторые используют серию операторов case для обработки последовательных этапов экранирования, скобок, цифр и т. Д. Но ваша программа должна иметь в виду, что однобайтовые элементы управления могут появляться в середине многобайтовых последовательностей элементов управления.Поскольку они кодируются по-разному, конфликта нет.Но это делает программу более сложной, чем можно было бы предположить для простого чтения только одной последовательности за раз.
xterm использует некоторые операторы case (для символа final , в основном), но большинствопереходы состояний при декодировании управляющей последовательности выполняются с использованием набора таблиц.Они очень повторяющиеся, но не очевидные для построения: Пол Уильямс отметил, что для VT100 они должны быть симметричными (по сути, трактуя вход как 7-битный ASCII).Некоторые из состояний рассматриваются как ошибки, и игнорируется ;хорошо отформатированные последовательности - все, что имеет значение в любом случае.Теоретически, вы можете повторно использовать таблицы состояний и добавить «маленький» анализ.Таблицы состоят из 8500 строк (одно состояние на строку).
Кроме (a) чтения существующих эмуляторов терминала и имитации их в меньшем масштабе, или (b) изменения эмулятора терминала ... вы можете исследовать libvterm
:
Абстрактная библиотека C99, которая реализует эмулятор терминала типа VT220 или xterm.Он не использует какой-либо конкретный графический инструментарий или систему вывода, вместо этого он вызывает указатели на функции обратного вызова, которые его программа встраивания должна предоставлять для рисования от его имени.Он избегает вызова malloc () во время нормального состояния работы, что позволяет использовать его во встроенных ситуациях ядра.
Однако это не в C#
(а источник равен документация).Тем не менее, это всего лишь 5500 строк кода.
Дополнительное чтение: