Что такое конечная 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 с множеством дополнений.

Другие вопросы по тегам