что такое терминальная escape-последовательность для ctrl + arrow (left, right,...) в TERM=linux
Я создаю окно терминала в браузере (sth. как ajaxterm) и не знаю, какую escape-последовательность отправить в SSH-туннель (открыт через paramiko.SSHClient().invoke_shell(term='linux')
).
Я нашел кейлоггер и попробовал его в терминале с $TERM = = 'linux', но он возвращает ту же последовательность для ctrl+left
и left
(27,91,68).
Если я попробую кейлоггер в другом терминале (с $TERM == 'xterm'), я получаю коды (27,91,49,59,53,68). Но эти коды не перемещаются ожидаемый вывод из SSH-канала (который переместит курсор на одно слово, оставшееся на обычной оболочке linux). Это верно, даже если я начну paramiko с term= 'xterm'.
есть идеи, какую последовательность я должен использовать? Или почему вышеприведенная последовательность не работает?
обновление: я был бы рад использовать другой тип терминала (не "linux"), но, к сожалению pyte работает только с терминалами VTxxx (я считаю, что "linux" - это vt220-подобный терминал-во всяком случае, он работает), поэтому в xterm не работает должным образом.
3 ответов
терминалы были аппаратными устройствами, которые состояли из клавиатуры и устройства вывода (первоначально печатный принтер, позже ЭЛТ-монитор). Большой компьютер может иметь несколько удаленных терминалов, подключенных к нему. Каждый терминал будет иметь протокол для эффективной связи с компьютером, для терминалов на основе ЭЛТ это включает в себя наличие специальных "управляющих последовательностей" для изменения положения курсора, стирания частей текущей строки/экрана, переключения в альтернативный полноэкранный режим, ...
эмулятор терминала-это приложение, эмулирующее один из этих старых терминалов. Он позволяет выполнять такие функции, как позиционирование курсора, настройка цветов переднего плана и фона ... Эмуляторы терминалов пытаются эмулировать какой-то конкретный протокол терминала, но каждый имеет свой собственный набор причуд и отклонений.
системы Unix имеют базы данных, описывающие терминалы и эмуляторы терминалов, поэтому приложения абстрагируются от конкретного терминала (или эмулятора терминала) в использовать. Старая база данных termcap(5)
, а terminfo(5)
новая база данных. Эти базы данных позволяют приложениям запрашивать возможности используемого терминала. Возможности могут быть логическими, числовыми или даже строковыми, например: если определенный тип терминала имеет / поддерживает ключ F12, он будет иметь возможность "key_f12" (длинное имя terminfo), "kf12" (короткое имя terminfo), "F2" (имя termcap), описывающее строку, которую создает ключ. Попробуйте с:tput kf12 | od -tx1
.
С Программирование непосредственно с возможностями может быть громоздким, приложения, как правило, использовать более высокоуровневые библиотеки, такие как проклятия/с ncurses, сленг и т. д...
существует специальная переменная среды под названием TERM
это говорит приложениям, с каким типом терминала они разговаривают. Эта переменная должна быть настроена на конкретный тип терминала, если он существует в базе данных, для достижения наилучших результатов. Это просто говорит приложению, какие точные отклонения протокола и протокола понимает терминал. Изменение TERM
переменная не изменить тип терминала, он просто изменяет тип терминала приложение думает, что он разговаривает.
все, что сказал, Ctrl+arrow
- это поведение xterm (зависит от параметра конфигурации), которое вообще не отражается в базах данных terminfo/termcap, поэтому большинство приложений не будут знать об этом. В любом случае, либо ваш эмулятор терминала (в вашем случае pyte
) поддерживает его или нет.
предполагая ваше основное приложение bash
или какое-то другое приложение, которое использует readline
библиотека, вы можете уйти с помощью readline в backward-word
(Meta-b/Alt-b / ESC b по умолчанию, настраивается в inputrc
вместо).
быстрая проверка с od -c
показывает, что gnome-termainal генерирует следующие значения:
стрелка влево генерирует ESC
-[
-D
.
управление-левый массив geneates ESC
-[
-1
-;
-5
-D
коды клавиш Ctrl+arrow были введены xterm, и подобные gnome Terminal и KDE Konsole пытаются быть совместимыми с xterm. Фактические терминалы VT100 и VT220 не имели отдельных кодов ключей для таких комбинаций. Насколько я знаю, консоль Linux стремится быть совместимой с VT100 с некоторыми дополнениями, в то время как xterm эмулирует VT220 с большим количеством дополнений.