Что такое конечная escape-последовательность для ctrl + стрелка (влево, вправо,...) в TERM=linux
Я строю окно терминала в браузере (например, 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 ответа
Терминалы были аппаратными устройствами, которые состояли из клавиатуры и устройства вывода (первоначально принтер для распечатки, позже монитор CRT). К большому компьютеру может быть подключено несколько удаленных терминалов. Каждый терминал будет иметь протокол для эффективной связи с компьютером, для терминалов на основе ЭЛТ это включает наличие специальных "управляющих последовательностей" для изменения положения курсора, стирания частей текущей строки / экрана, переключения в альтернативный полноэкранный режим...
Эмулятор терминала - это приложение, эмулирующее один из этих старых терминалов. Он позволяет выполнять такие функции, как позиционирование курсора, установка цветов переднего плана и фона,... Эмуляторы терминала пытаются эмулировать определенный протокол терминала, но у каждого есть свой набор особенностей и отклонений.
Unix-системы имеют базы данных, описывающие терминалы и эмуляторы терминалов, поэтому приложения абстрагируются от конкретного используемого терминала (или эмулятора терминала). Старая база данных termcap(5)
, в то время как terminfo(5)
это более новая база данных. Эти базы данных позволяют приложениям запрашивать возможности используемого терминала. Возможности могут быть логическими, числовыми или даже строковыми, например: если конкретный тип терминала имеет / поддерживает клавишу F12, он будет иметь возможность "key_f12" (длинное имя terminfo), "kf12" (короткое имя terminfo), "F2" (имя termcap), описывающее строку, которую создает ключ. Попробуйте это с: tput kf12 | od -tx1
,
Поскольку программирование напрямую с помощью возможностей может быть громоздким, приложения обычно используют библиотеку более высокого уровня, такую как curses/ncurses, slang и т. Д.
Существует специальная переменная среды, которая называется TERM
который сообщает приложениям, с каким типом терминала они общаются. Эта переменная должна быть установлена на точный тип терминала, если он существует в базе данных, для лучших результатов. Это просто сообщает приложению, какой точный протокол и отклонения протокола понимает терминал. Изменение TERM
переменная не меняет тип терминала, она просто меняет тип терминала, с которым приложение думает, что оно говорит.
Все, что сказал, Ctrl+arrow
это поведение xterm (зависит от параметра конфигурации), которое вообще не отражается в базах данных terminfo/termcap, поэтому большинство приложений об этом не знают. В любом случае, либо ваш эмулятор терминала (в вашем случае pyte
) поддерживает это или нет.
Предполагая, что ваше основное приложение bash
или какое-то другое приложение, которое использует readline
библиотека, вы можете сойти с использования readline's backward-word
(Meta-b / Alt-b / ESC b по умолчанию, настраивается в inputrc
) вместо
Быстрая проверка с od -c
показывает, что гном-термаинал генерирует эти значения:
Стрелка влево генерирует ESC
-[
-D
,
Control-left-array генерирует ESC
-[
-1
-;
-5
-D
Коды клавиш Ctrl+arrow были введены xterm, а Gnome Terminal и KDE Konsole стараются быть совместимыми с xterm. Фактические терминалы VT100 и VT220 не имели отдельных кодов клавиш для таких комбинаций. Насколько я знаю, консоль Linux нацелена на совместимость с VT100 с некоторыми дополнениями, тогда как xterm эмулирует VT220 с множеством дополнений.