Какие символы печатаются при нажатии клавиш Alt + Arrow?

Когда я нажимаю Alt Up , A печатается на экране терминала. То же самое произошло, когда я нажал Alt Down, но вместо этого напечатан B

Другие персонажи, которые я понял;

Alt Left = D и Alt Right = C

Какова цель этих команд?

3 Solutions collect form web for “Какие символы печатаются при нажатии клавиш Alt + Arrow?”

В зависимости от того, как настроен терминал, ввод Alt + Key похож на ввод последовательно клавиш Esc и Key , поэтому он посылает символ ESC (aka \e или ^[ или \033 ), за которым следует символ или последовательность символов, отправленных на нажав этот ключ .

При нажатии кнопки Up большинство эмуляторов терминала отправляют три символа \033[A или \033OA зависимости от того, находятся ли они в режиме клавиатуры приложения или нет.

Первый соответствует последовательности эвакуации, которая при выходе на терминал перемещает курсор вверх. Если вы это сделаете:

 printf '\nfoo\033[Abar\n\n' 

Вы увидите bar написанный после foo один ряд вверх. Если вы это сделаете:

 stty -echoctl; tput rmkx; read foo 

Вы увидите, что клавиши со стрелками перемещают курсор.

Когда приложение, такое как zsh или vi считывает эту последовательность символов из терминала, оно интерпретирует его как действие «Вверх», потому что из базы данных terminfo ( kcuu1 ) известно, что это escape-последовательность, отправленная при нажатии Up .

Теперь для Alt-Up некоторые терминалы, такие как rxvt и его производные, такие как eterm send \033 а затем escape-последовательность для Up (это \033\033[A или \033\033OA ), а некоторые другие, такие как xterm или gnome-terminal имеет отдельные escape-последовательности для этих типов ключей при использовании с комбинационными клавишами, такими как Alt , Shift , Ctrl .

Обычно они отправляют \033[1;3A на Alt-Up .

При отправке на терминал эта последовательность также перемещает курсор вверх (второй параметр (3) игнорируется). Нет соответствующей клавиши клавиатуры , так что это одна и та же последовательность, отправленная по Alt-Up в режиме или из клавиатуры приложения .

Теперь, если это \033\033[A или \033[1;3A , многие приложения не знают, для чего предназначены эти последовательности. База данных terminfo не поможет им, потому что нет такой возможности, которая определяет, какие символы посылают эти комбинации клавиш.

Они будут стараться изо всех сил интерпретировать эту последовательность. bash например, интерпретирует \033[1;3 как escape-последовательность, ничего не знает об этом, так что ничего не делает, за которым следует A zsh , перестанет читать, как только выясняется, что не существует соответствующей последовательности символов. Не существует escape-последовательности, которая, как известно, начинается с \033[1 поэтому она пропустит это и прочтет остальные ;3A и вставьте это в редактор строк.

Многие приложения, такие как vi , zsh или на основе readline , такие как gdb или bash (хотя beware bash использует модифицированную версию readline ), вы можете добавлять привязки для любой последовательности символов.

Например, в zsh вы можете привязать Alt-Up , Alt-Down, например:

 bindkey '\e[1;3A' history-beginning-search-backward bindkey '\e[1;3B' history-beginning-search-forward 

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

Вы можете использовать Crtl + v для возврата кодов ввода на клавиатуре. Если вы сделаете это для клавиш со стрелками, вы получите [[D^ , [[C^ , [[A^ и [[B значения. Для клавиш Alt + со стрелками нет никаких привязок по умолчанию, поэтому кажется, что выполненное действие – это печать буквенного кода. Hovewer, если вы создаете локальную версию файла конфигурации библиотеки readline:

 $ cp /etc/inputrc ~/.inputrc 

И добавьте строку:

 "\e[1;3C": "sometexthere" 

Где [1;3C – код ввода Alt + (вы можете получить его так же, как и раньше, используя Crtl + v shortcut) и перезапустить свой терминал, тогда Crtl + shortcut вернет вам текст «sometexthere», а другие сочетания клавиш Alt + прекратите возвращать символы.

Вместо текста вы можете передать команду bindable из http://www.gnu.org/software/bash/manual/html_node/Bindable-Readline-Commands.html#Bindable-Readline-Commands like

 "\e[1;3C": unix-line-discard 

иметь такой же эффект, как Crtl + u (удалить строку).

Дополнительная информация здесь: http://cnswww.cns.cwru.edu/php/chet/readline/readline.html

Ключ Alt часто используется в качестве метамодификатора. Клавиши курсора и функции называются специальными клавишами, так как они могут отправлять несколько символов – и символы, которые отправляются, могут быть изменены.

Некоторые пользователи, например, для bash ожидают, что нажатие клавиши Alt отправит ключ с префиксом escape-символа. Задокументированная функция «meta» (см. terminfo(5) ) относится к восьмому бит:

Если терминал имеет «мета-ключ», который действует как клавиша смены, установив 8-й бит любого переданного символа, этот факт можно указать с помощью km . В противном случае программное обеспечение будет считать, что 8-й бит является четностью и обычно будет очищен. Если существуют строки для включения и отключения этого « smm , они могут быть указаны как smm и rmm .

bash знает об этом тоже (см. часто задаваемые вопросы о ncurses ), но немногие его пользователи заинтересованы в этой функции. Тем не менее, они привыкли ссылаться на Alt как «мета», хотя мета-режим отключен. Как rxvt, так и xterm имели эту функцию с (по крайней мере) в начале 1990-х годов.

Другие пользователи (поскольку xterm представили эту функцию в патче № 94, 1999 ), можно ожидать, что информация о модификаторе будет закодирована как параметр в последовательности символов, которые будет отправлен специальный ключ. Документация XTerm упоминала эти модифицированные ключи как функциональные клавиши «ПК-стиль», чтобы отличать их от «VT220-style» (в которых не было модификаторов). Немодифицированная клавиша курсора может отправить ESC [ A , но также законно иметь параметр , например ESC [ 5 A , который приложение должно понимать как повторяющееся пять раз. Первая версия ключей стиля xterm стиле ПК использовала «5» для обозначения управления , а более поздняя версия изменила ее, чтобы избежать путаницы с количеством повторов. Так…

ESC [ 5 A

предполагает, что приложение перемещает курсор вверх по 5 строкам, тогда как

ESC [ 1 ; 5 A

предполагает, что он перемещается на одну строку, сообщая приложению, что нажата клавиша управления .

Полезные комбинации были в базе данных ncurses terminfo с 2004 года :

 # 2004-07-17 # * add xterm-pc-fkeys -TD 

База данных terminfo показывает текущую версию xterm + pcfkeys с комментарием, показывающим, как кодируются модификаторы:

 # This fragment describes as much of XFree86 xterm's "pc-style" function # keys as will fit into terminfo's 60 function keys. # From ctlseqs.ms: # Code Modifiers # --------------------------------- # 2 Shift # 3 Alt # 4 Shift + Alt # 5 Control # 6 Shift + Control # 7 Alt + Control # 8 Shift + Alt + Control # --------------------------------- # The meta key may also be used as a modifier in this scheme, adding another # bit to the parameter. 

(Alt и мета не обязательно являются одним и тем же ключом). Это строительный блок (в свою очередь, состоит из других строительных блоков), из которого формируется описание терминала xterm . Он использует расширение, предоставляемое в ncurses с 1999 года, которое позволяет определять имена пользователей. Поскольку termcap поддерживает только 2-символьные имена и 1023-байтные описания, не было никаких оснований делать эти расширенные имена доступными через интерфейс termcap . Они легко доступны для приложений, использующих интерфейс terminfo .

Теперь возникает трудность: есть несколько способов для приложения определить, что представляет собой такая последовательность клавиш:

  1. полностью проанализировать последовательность символов
  2. частично проанализировать его и выбросить модификатор управления , если он не нужен
  3. просто сравните последовательность символов со словарем, надеясь определить смысл этого пути.

Немногие программы сделают первый; некоторые текстовые редакторы будут делать второй (на самом деле, я сделал это для ded в конце 1980-х годов ). Разработчики для приложений, таких как bash выбрали третий маршрут, предположив, что большая часть информации находится в termcap . В качестве альтернативы, они могли бы выбрать таблицу с информацией termcap / terminfo и использовать интерфейс, который дал лучшую информацию. xterm делает это для функции tcap-query , предоставляя vim фактические назначения функциональных клавиш.

Поскольку ни одна из строк, которые bash сравнивает с совпадающими строками, которые она получает, может запутаться, установив для частичных совпадений (например, escape-символ).

Дальнейшее чтение:

  • Как исправить сдвинутые функциональные клавиши в vim в xterm в gnome-терминале?
  • Как отключить мигание имен файлов в rlogin
  • Номер истории Bash не начинается с 1?
  • Почему команда sort дает мне пустой файл?
  • Аппаратный код (ы) из команды «датчики»
  • Захват содержимого строки состояния tmux
  • Почему «shift-tab» приводит к «Escape» в терминале?
  • Можно ли перепрыгнуть между предыдущими / следующими командами?
  • Как я могу повернуть поведение gedit something & disown` в поведение по умолчанию при вызове gedit из командной строки?
  • Поддерживать ли терминал в верхней части терминала?
  • Сохранить весь вывод терминала в файл
  • Изменение способа отображения папок в терминале
  • Linux и Unix - лучшая ОС в мире.