таблица ключевых привязок?

У нас есть таблица привязок клавиш, которая переводит все различные способы обращения к нажатию клавиши? Я использую zsh , но я полагаю, что если бы была такая таблица, она работала бы для любой оболочки.

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

Например, в «zbindkey» у нас есть такие вещи:

 [[ "$terminfo[kend]" == " O"* ]] && \ bindkey -M emacs "${terminfo[kend]/O/[}" end-of-line 

… и я могу догадаться, что «кенд» означает, что это относится к ключу End .

Перекрестная проверка с помощью bindkey Я вижу следующие строки:

 "^E" end-of-line "^[OF" end-of-line "^[[F" end-of-line 

… поэтому я верю, что одна из этих строк относится к ключу End . Который из?

У нас также есть это в файле «bindkey»:

 bindkey "\e[A" history-beginning-search-backward 

Теперь я знаю, что это клавиша « Стрелка вверх» , но как я могу узнать, не знаю ли я?

 $ bindkey (at CLI) 

… дает нам другой язык для одного и того же ключа:

 "^[[A" history-beginning-search-backward 

… но по крайней мере теперь я знаю, что ^[[A в bindkey-at-CLI говорит то же самое, что \e[A в bindkey-in-zbindkey говорит. Это легко. В старые времена в DOS стрелка вверх была 0;72 – вы могли найти код сканирования каждого юридического нажатия клавиши, и был только один язык.

Есть таблица? Или какой-либо другой способ получить нажатие клавиши и узнать, как обращаться к ней в terminfo[] … в «bindkey-in-zbindkey» … в «bindkey-at-CLI» и / или в любом другом языки могут быть?

Опять же, в DOS была программа scancode – введите нажатие клавиши, и вы получили scancode. Это было грешно легко.


Из ответов, я думаю, тогда нет возможности распечатать таблицу всех возможных привязок? В любом случае «bindkey» делает почти то, что я хочу:

 pts/2 HP-y5-10-Debian1 root /aWorking/Docs $ bindkey -L bindkey "^@" set-mark-command bindkey "^A" beginning-of-line bindkey "^B" backward-char bindkey "^D" delete-char-or-list bindkey "^E" end-of-line ... 

по крайней мере, я вижу все существующие привязки, даже если не все возможные привязки. Теперь, если бы был какой-то способ перевода ключевых глифов на «обычные» термины:

 bindkey "Home" beginning-of-line 

… тогда я был бы счастлив.

4 Solutions collect form web for “таблица ключевых привязок?”

Интерфейс между терминальным приложением и терминальным эмулятором (или аппаратным терминалом) передает байты, а не ключи. Функциональные клавиши, такие как клавиши перемещения курсора, переводятся в escape-последовательности (начиная с escape-символа ESC aka \e aka \033 aka 0x1b aka ^ [). То же самое касается комбинаций функциональной клавиши или символьной клавиши с модификаторами, хотя не все терминалы посылают разные последовательности для всех различных комбинаций модификаторов. Несколько ключей отправляются в виде управляющих символов (например, Tab → Ctrl-I = \t = \011 ).

Как вы можете видеть, существует множество способов описания управляющих символов. У некоторых есть имя, соответствующее их традиционной функции (например, Tab, Line feed); у них, как правило, есть комбинация обратной косой черты + буквы, которую вы можете использовать внутри $'…' или в аргументе для echo или print (а также в sed регулярных выражениях и строковых литералах на awk, C и других языках (обратите внимание, что различные инструменты может иметь несколько иной набор управляющих последовательностей)). Вы можете использовать обратную косую черту + восьмеричную (например, \033 ) в этих контекстах.

Существует некоторая разница в том, какие терминалы последующей последовательности отправляются для каждой клавиши. К счастью, почти нет перекрытия: очень мало символов, которые означают разные клавиши на разных терминалах. Основная проблема – символ 127 = \177 = 0x7f, который чаще всего является Backspace в настоящее время, но иногда Delete .

^[OF и ^[[F (т. \eOF и \e[F ) – две общие escape-последовательности, посланные End . ^E (т. ^E \005 ) является привязкой клавиш Emacs ( Ctrl + E ) для end-of-line .

Чтобы узнать, что посылает ваш эмулятор терминала для определенного ключа или комбинации клавиш, нажмите Ctrl + V, а затем соответствующий ключ. Это буквально вставляет первый символ escape-последовательности. Экранирующие последовательности обычно состоят из escape-символа, за которым следуют печатные символы, поэтому остальная часть escape-последовательности также вставлена ​​буквально.

База данных Terminfo содержит escape-последовательности для некоторых ключей. Вы найдете список возможностей Terminfo на странице terminfo (5) в вашей системе. В zsh вы можете перечислить значения в базе данных через ассоциативный массив terminfo . Остерегайтесь при печати значений, которые содержат escape-последовательности, которые также интерпретируются терминалом при отображении, поэтому распечатывайте их в цитируемой форме.

 % print -lr ${(q)terminfo[kend]} $'\033'OF 

См. Как работают ввод с клавиатуры и вывод текста? для более полного обзора того, что происходит, когда вы нажимаете клавишу. Нет необходимости понимать привязки клавиш в zsh.

  BEGINNER'S GUIDE TO ZSH KEYBOARD ASSIGNMENTS, AKA 'KEYBOARD BINDINGS'. 

(комментарии, улучшения, горькие доносы приветствуются: rayandrews at eastlink dot ca)

«Доступные» комбинации клавиш на клавиатуре «101» ПК, подключенной к ПК под управлением «zsh» под xfce4 под Debian Linux (я не знаю, кто «отвечает»). Все комбинации, которые производят дублирующие коды в «серых» ключах, удалены, за исключением простейшего аватара, который показан. Обратите внимание, что некоторые серые клавиши / комбинации имеют «^ буквенные» дубликаты, такие как «Enter» == '^ M', они не удалены. Другие активные комбинации не были «доступными», поскольку они использовались системой, даже с консоли, например. Ключи переключателя клавиш «Alt + Function». Возможно, ключ «Мета» будет делать больше, но это с 101 КБ. Интересно, что в DOS есть гораздо больше комбинаций, таких как Ctrl + Function – все доступные в DOS, ни одна из них не доступна в Linux, так что кажется. Ни одна комбинация клавиш триплекса (например, «Ctrl + Alt + Up») не вызывала каких-либо уникальных кодов в серых клавишах, но они генерируют коды в белых клавишах. Интересные аномалии: '^ [[22' '^ [[27' '^ [[30' «отсутствуют», вы недоумеваете, почему эти числа были пропущены. (То есть вы можете ожидать, что «F11» будет «^ [[22 'не' ^ [[23 '.)

Показанные коды клавиш выглядят так, как они будут выводиться «showkeys -a» или «bindkey» в CLI. Однако по какой-либо причине, если вы используете «bindkey» в скрипте (как в «.zshrc»), '^ [' необходимо заменить на '\ e', таким образом, в CLI:

bindkey -s '^ [[[A' 'my-command \ Cm'

… привязать 'F1' к 'my-command' и выполнить его ('\ Cm' имитирует ключ 'Enter').

в '.zshrc':

bindkey -s '\ e [25' 'my-command1; моя команда2 \ C-m '

… свяжите «Shift-F1» с «my-command1», а затем «my-command2» и выполните оба из них.


КОМБИНАЦИИ, ИСПОЛЬЗУЯ ТОЛЬКО КЛЮЧИ «СЕРЫЙ»:

ключ [F1] = '^ [[[A]
ключ [F2] = '^ [[[B'
ключ [F3] = '^ [[[C'
ключ [F4] = '^ [[[D'
ключ [F5] = '^ [[[E'
ключ [F6] = '^ [[17 ~'
ключ [F7] = '^ [[18 ~'
ключ [F8] = '^ [[19 ~'
ключ [F9] = '^ [[20 ~'
ключ [F10] = '^ [[21 ~'
ключ [F11] = '^ [[23 ~'
ключ [F12] = '^ [[24 ~'

ключ [Shift-F1] = '^ [[25 ~'
ключ [Shift-F2] = '^ [[26 ~'
ключ [Shift-F3] = '^ [[28 ~'
ключ [Shift-F4] = '^ [[29 ~'
ключ [Shift-F5] = '^ [[31 ~'
ключ [Shift-F6] = '^ [[32 ~'
ключ [Shift-F7] = '^ [[33 ~'
ключ [Shift-F8] = '^ [[34 ~'

key [Insert] = '^ [[2 ~'
key [Удалить] = '^ [[3 ~'
key [Home] = '^ [[1 ~'
key [End] = '^ [[4 ~'
key [PageUp] = '^ [[5 ~']
key [PageDown] = '^ [[6 ~'
key [Up] = '^ [[A'
key [Down] = '^ [[B'
key [Right] = '^ [[C'
[Left] = '^ [[D'

ключ [Bksp] = '^?'
ключ [Bksp-Alt] = '^ [^?'
key [Bksp-Ctrl] = '^ H'.

key [Esc] = '^ ['
[Esc-Alt] = '^ [^ ['

key [Enter] = '^ M'
key [Enter-Alt] = '^ [^ M'

key [Tab] = '^ I' или '\ t' уникальная форма! может быть привязана, но не «showkey -a».
key [Tab-Alt] = '^ [\ t'

КОМБИНАЦИИ С ИСПОЛЬЗОВАНИЕМ БЕЛЫХ КЛЮЧЕЙ:

Аномалии:
'Ctrl +' '==' Ctrl + 2 'и' Ctrl + 1 '==' 1 'в xterm.
Несколько комбинаций «Ctrl + number» недействительны на консоли, но возвращают коды в xterm. OTOH Ctrl + Bksp возвращает «^ H» на консоли, но идентичен простому «Bksp» в xterm. Нет никаких сомнений в том, что эти небольшие сбои, в основном:

Белые коды клавиш легки в использовании, каждая из этих «нормальных» клавиш печати имеет шесть форм:

A = 'a' (duhhh)
A-Shift = 'A' (кто бы мог догадаться?)
A-Alt = '^ [a'
A-Ctrl = '^ A'
A-Alt-Ctrl = '^ [^ A'
A-Alt-Shift = '^ [A'
A-Ctrl-Shift = '^ A' (Shift не влияет)

Не забывайте, что:

/ -Shift-Ctrl = Bksp = '^?'
[-Ctrl = Esc = '^ ['
M-Ctrl = Enter = '^ M'

И мы можем «складывать» привязки клавиш:

bindkey -s '^ Xm' «Моя любовница не похожа на солнце».

… Привяжите «Ctrl-X», а затем «m» к красивой строке стихов.

И мы можем флиртовать с безумием:

bindkey -s '^ Pletmenot' 'Не позвольте мне жениться на истинных умах'

… но вы начинаете что-то подобное с символом «модификатора». Попробуйте, если вам нравятся быстрые клавиши, вы действительно можете отправиться в город.

ВОПРОСОВ:

Где написано, что «Ctrl-Bksp» означает одну вещь на консоли, другую вещь в xterm?

Являются ли эти назначения меняющимися?

Кто создал все это и что они думали в то время?

Почему «Alt-Function» изменяет терминалы на терминале, но «Alt-Ctrl-Function», чтобы перейти к терминалу из графического интерфейса?

Как / где определено «Alt-Ctrl-Delete»?

enter code here

В Unix / Linux есть много инструментов, поэтому может быть немного запутанным и подавляющим. Для начала я бы использовал showkey :

 $ showkey -a Press any keys - Ctrl-D will terminate this program a 97 0141 0x61 b 98 0142 0x62 c 99 0143 0x63 d 100 0144 0x64 e 101 0145 0x65 f 102 0146 0x66 g 103 0147 0x67 

На странице man относительно -a :

  When in `ascii' dump mode, showkey prints to the standard output the decimal, octal, and hexadecimal value(s) of the key pressed, according to he present keymap. 

Вы можете использовать xmodmap для получения некоторых из отображений:

 $ xmodmap xmodmap: up to 4 keys per modifier, (keycodes in parentheses): shift Shift_L (0x32), Shift_R (0x3e) lock Caps_Lock (0x42) control Control_L (0x25), Control_R (0x69) mod1 Alt_L (0x40), Alt_R (0x6c), Meta_L (0xcd) mod2 Num_Lock (0x4d) mod3 mod4 Super_L (0x85), Super_R (0x86), Super_L (0xce), Hyper_L (0xcf) mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb) 

Вышеизложенное не все части головоломки, а дополнительная информация, которая может быть полезной для вас, чтобы найти конечную карту между клавишами и scancodes. В этом U & L Q & A есть дополнительная информация под названием « Ключ-сопоставления в Linux» .

Рекомендации

  • Linux-клавиатура и консоль HOWTO

если бы был какой-то способ перевода ключевых глифов в «обычные» термины:

 bindkey "Home" beginning-of-line 

… тогда я был бы счастлив.

Для описания записей terminfo имеется утилита infocmp . Это особенно полезно при использовании опции -L aka long c имена переменных :

 $ infocmp -cL ... key_home= '\EOH'. key_up= '\EOA'. key_down= '\EOB'. key_right= '\EOC'. key_left= '\EOD'. key_backspace= '^H'. key_end= '\EOF'. ... 

Сравнивая это с выходом bindkey

 "^[OH" beginning-of-line "^[OA" up-line-or-history "^[OB" down-line-or-history "^[OC" forward-char "^[OD" backward-char "^H" backward-delete-char "^[OE" end-of-line 

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

В случае каких-либо сомнений, какое конкретное строковое значение (как напечатано в выходном файле infocmp ), всегда можно найти в справочнике terminfo где дано полное описание, например

 key_send -> shifted end key key_sic -> shifted insert-character key key_dc -> delete-character key 
  • Разница между псевдонимом в zsh и псевдонимом в bash
  • Как запустить команду в zsh, не нажимая ее на историю текущего сеанса?
  • Почему некоторые буквы или escape-последовательности не отображаются правильно в urxvt?
  • Как узнать, почему и где установлена ​​переменная env $ PATH?
  • ls -l - групповые каталоги - сначала (действуют также на символические ссылки)
  • После установки oh-my-zsh: ... /.zshrc:source:34: нет такого файла или каталога ... /.oh-my-zsh/oh-my-zsh.sh
  • Запуск chsh не меняет оболочку
  • Является ли «Арифметическое расширение» ожидаемым действием на vars внутри `[[` tests?
  • При применении команд к группам строк из stdin
  • zsh автозавершение некоторых частей каталога
  • Почему вырезать провал с bash, а не zsh?
  • Interesting Posts

    Почему тесты bash настолько разборчивы по поводу пробелов?

    Могу ли я переместить каталог с открытыми файлами?

    Включает ли Fedora все форматы фильмов из коробки?

    Что может сделать передачу init = / path / to / program в ядро, а не запускать программу как init?

    Сортировка файла на основе 1 колонки

    Как контролировать последовательное соединение @ 250000 бод?

    Как удалить LiveCD после установки ОС на VirtualBox?

    Перенаправить stderr в файл, но создать, только если произошел какой-либо stderr?

    Миграция с Debian sid / нестабильная на тестирование

    Как правильно избежать восклицательных знаков в bash?

    Завершить второй (параллельный) процесс, если первый из них завершен

    Чрезмерное использование ЦП во время работы Facebook и нескольких других сайтов

    zsh: Повторять каждое утверждение?

    Как сделать «меньше» выхода с очисткой экрана?

    Как смонтировать несколько каталогов на одном разделе?

    Linux и Unix - лучшая ОС в мире.