что такое конечная escape-последовательность для ctrl + стрелка (влево, вправо, ...) в TERM = linux - PullRequest
11 голосов
/ 14 октября 2011

Я строю окно терминала в браузере (например, ajaxterm) и не знаю, какую escape-последовательность отправить в ssh-туннель (открывается через paramiko.SSHClient().invoke_shell(term='linux')).

Я нашел key logger и попробовал его в терминале с $ 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 ]

23 голосов
/ 16 октября 2011

Терминалы были аппаратными устройствами, которые состояли из клавиатуры и устройства вывода (первоначально принтер для распечатки, позже монитор 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, вы можете использовать backward-word readline (Meta-b / Alt-b / ESC b по умолчанию, настраивается в inputrc) вместо.

9 голосов
/ 14 октября 2011

Быстрая проверка с помощью od -c показывает, что gnome-termainal генерирует эти значения:

Стрелка влево генерирует ESC - [ - D.

Control-left-array генерирует ESC - [ - 1 - ; - 5 - D

4 голосов
/ 15 октября 2011

Коды клавиш Ctrl + arrow были введены xterm, а Gnome Terminal и KDE Konsole стараются быть совместимыми с xterm.Фактические терминалы VT100 и VT220 не имели отдельных кодов клавиш для таких комбинаций.Насколько я знаю, консоль Linux нацелена на совместимость с VT100 с некоторыми дополнениями, тогда как xterm эмулирует VT220 с множеством дополнений.

...