Какой процесс / библиотека преобразует backspace в escape-последовательность ANSI, например "\ 33 [nG") в приложении linux (ubuntu)? - PullRequest
0 голосов
/ 30 апреля 2020

Я написал приложение командной строки (называемое « App-CLI » ниже), работающее на linux. App-CLI работает как сервер, и после принятия соединения он разветвляет дочерний процесс как рабочий процесс и выделяет pty (через функцию openpty) в каждом таком дочернем процессе. В каждом дочернем процессе я использую библиотеку editline, например libedit, для работы с пользовательским вводом.

Затем в ситуации 1:

Я использую такие инструменты, как cmd / ConEmu / git bash in Win10 , чтобы подключить APP-CLI через te lnet или S SH, и я ввожу некоторые символы, например, «abcdefg», исключая двойные кавычки. И затем я ввожу клавишу backspace , на экране в инструменте cmd в начале строки происхождения отображается "[K". Таким образом, я использую Strate в Linux, чтобы шпионить, что выводит App-CLI

strace -e write=1,2 -e trate=write, -p {process_id}

и получает результаты вроде

write(1, "\r\33[6G\33[K", 8) = 8

, которые состоит из последовательностей CSI :

  • CSI n G, названных «Курсор горизонтальный абсолютный» (CHA), это означает «Перемещает курсор в столбец n (по умолчанию 1 ). (не ANSI.SYS) "(https://en.wikipedia.org/wiki/ANSI_escape_code).

  • CSI n K, названный« Стереть в строке », это означает« Стирает часть строка. Если n равно 0 (или отсутствует), очистить от курсора до конца строки. Если n равно 1, очистить от курсора до начала строки. Если n равно 2, очистить всю строку. Положение курсора не изменяется ".

Кажется, что cmd или win10 не могут успешно обработать последовательность CHA? Но я не могу найти информацию, касающуюся информации о (не) поддерживаемости.

И затем, в ситуации 2:

Я все еще использую инструмент cmd в win10. Но сначала я захожу в систему linux через te lnet, а затем подключаюсь к APP-CLI через te lnet через linux. Я также ввожу "abcdefg" и backspace key, и на этот раз все вещи go right: на экране выводится "abcdef". Данные монитора под strace:

write(1, "\10\33[K", 4) = 4

Изменена последовательность повторного нажатия клавиши возврата! Итак, я хочу знать:

  1. Такие последовательности генерируются каким процессом или библиотекой в ​​linux?
  2. Могу ли я решить, какой тип последовательности будет окончательно сгенерирован и как Я могу ?

Спасибо.

1 Ответ

0 голосов
/ 30 апреля 2020

Такие последовательности генерируются с помощью какого процесса или библиотеки в linux?

В вашем случае я думаю, что последовательности генерируются тем, что вы назвали библиотекой редактирования . Естественно, функции, которые управляют внешним видом входной линии терминала, используют управляющие последовательности.

Могу ли я решить, какой тип последовательности в конечном итоге генерировать, и как я могу?

Какие последовательности управления используются, определяется базой данных возможностей терминала и эффективным типом терминала, обычно устанавливаемым переменной TERM (возможно, некоторые библиотеки допускают настройку типа терминала другими способами). Вы можете проверить, отличается ли $TERM в двух описанных вами сценариях ios.

...