таблица привязок клавиш?

18

Есть ли у нас таблица привязок клавиш, которая переводит все различные способы обращения к нажатию клавиши? Я использую 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

Теперь я знаю, что это Up Arrowключ, но как я могу узнать, если я не знал?

$ bindkey (at CLI)

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

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

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

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

Опять же, в DOS была 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

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

Рэй Эндрюс
источник
3
Нажмите Ctrl + V (или что там stty -aнаписано lnext), затем нажмите клавишу.
Микель

Ответы:

16

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

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

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

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

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

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

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

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

Жиль "ТАК - перестань быть злым"
источник
11
    BEGINNER'S GUIDE TO ZSH KEYBOARD ASSIGNMENTS, AKA 'KEYBOARD BINDINGS'.

(комментарии, улучшения, горькие доносы приветствуются: Rayandrews в точке Eastlink точка 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 \ Cm '

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

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

клавиша [ F1 ] = '^ [[[A] клавиша [ F2 ] = ' ^ [[[B] клавиша [ F3 ] = '^ [[[C' клавиша [ F4 ] = '^ [[[D] клавиша [ [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 ~' key [ Shift - F8 ] = '^ [[34 ~'

клавиша [ Insert ] = '^ [[2 ~' key [ Delete ] = '^ [[3 ~' key [ Home ] = '^ [[1 ~' key [ End ] = '^ [[4 ~' key [ PageUp ] = '^ [[5 ~' клавиша [ PageDown ] = '^ [[6 ~' клавиша [ Вверх ] = '^ [[A' клавиша [ Вниз ] = '^ [[B' клавиша [ Вправо ] = '^[[C' key[Left] = '^[[D'

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

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

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

клавиша [ Tab ] = '^ I' or '\t' unique form! can be bound, but does not 'showkey -a'. key[Tab-Alt] = '^[\t'

COMBINATIONS USING THE WHITE KEYS:

Anomalies: 'Ctrl+`' == 'Ctrl+2', and 'Ctrl+1' == '1' in xterm. Several 'Ctrl+number' combinations are void at console, but return codes in xterm. OTOH Ctrl+Bksp returns '^H' at console, but is identical to plain 'Bksp' in xterm. There are no doubt more of these little glitches however, in the main:

White key codes are easy to undertand, each of these 'normal' printing keys has six forms:

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 has no effect)

Don't forget that:

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

And, we can 'stack' keybindings:

bindkey -s '^Xm' "My mistress\' eyes are nothing like the sun."

... Bind 'Ctrl-X' followed by 'm' to a nice line of poetry.

And we can flirt with madness:

bindkey -s '^Pletmenot' 'Let me not, to the marriage of true minds'

... but you hafta start something like that with a 'modifier' character. Try it, if you like keyboard shortcuts, you can really go to town.

QUESTIONS:

Where is it written that 'Ctrl-Bksp' means one thing at console, another thing in xterm?

Are these assignments changable?

Who designed all this, and what were they thinking at the time?

Почему это « Alt - Функция » для терминалов изменения в терминале, но ' Alt - Ctrl-Function' to change to a terminal from GUI?

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

enter code here
Рэй Эндрюс
источник
я почти хочу отправить электронное письмо ...
mikeserv
Обязательно сделайте Майк: rayandrews@eastlink.ca
Рэй Эндрюс
это была только шутка, Рэй, ты просто не видишь сучек, колик, жалоб? напишите мне ... онлайн здесь. Я оценил это, это все. В любом случае, в качестве zshтемы, касающейся ключей, вы можете попробовать zkbdфункцию, которая должна получить полное сопоставление ключей, сохраненное в файле. Я верю, что это autoloadвозможно, но, если нет, ищите это в /usr/share/zsh/functions/Misc. Кстати, там есть и другие странные вещи tetris.
mikeserv
Это один из инструментов, которые я использовал для создания своего стола, но как вы получаете его, чтобы поднять «все» сразу?
Рэй Эндрюс
интересно - наверное, нет. Я никогда не запускал его раньше - только читал его исходный файл - и это было пару месяцев назад. Я предполагаю, что он делает серию входных тестов для генерации файла сохранения. но он сохраняет все в файл, верно?
Микесерв
6

В вашем распоряжении много инструментов в 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

Со страницы руководства относительно -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)

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

Ссылки

ОДС
источник
1
Хотя это все верно, это не имеет отношения к пониманию привязки клавиш в терминале.
Жиль "ТАК - перестань быть злым"
@ Жиль - да, я решил, что я только пытался привести потенциальных клиентов, теперь, когда я прочитал, что ваш ИИ понимает, как работает этот интерфейс, спасибо!
SLM
"showkey -a" не имеет значения, хотя.
skagedal
2

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

bindkey "Home" beginning-of-line

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

Есть infocmpутилита для описания terminfoзаписей. Это особенно полезно с -Lопцией ака длинные имена переменных 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
jimmij
источник
0

Я использую эмулятор терминала URxvt. Там полезный ключ привязки для показа таких кодов: Ctrl+V. После нажатия введите желаемую последовательность клавиш, и он напечатает свой код. Например, мой Ctrl+ имеет код ^[Oa.

poulix
источник