Есть ли у нас таблица привязок клавиш, которая переводит все различные способы обращения к нажатию клавиши? Я использую 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
... тогда я был бы счастлив.
источник
stty -a
написаноlnext
), затем нажмите клавишу.Ответы:
Интерфейс между терминальным приложением и эмулятором терминала (или аппаратным терминалом) передает байты, а не ключи. Функциональные клавиши, такие как клавиши перемещения курсора, преобразуются в escape-последовательности (начиная с escape-символа ESC aka
\e
aka\033
aka 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-последовательности, которые также отображаются терминалом при отображении, поэтому печатайте их в кавычках.См. Как работают ввод с клавиатуры и вывод текста? для более полного обзора того, что происходит, когда вы нажимаете клавишу. Не нужно понимать привязки клавиш в zsh.
источник
(комментарии, улучшения, горькие доносы приветствуются: 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' и выполните их оба.
источник
zsh
темы, касающейся ключей, вы можете попробоватьzkbd
функцию, которая должна получить полное сопоставление ключей, сохраненное в файле. Я верю, что этоautoload
возможно, но, если нет, ищите это в/usr/share/zsh/functions/Misc
. Кстати, там есть и другие странные вещиtetris
.В вашем распоряжении много инструментов в Unix / Linux, так что это может быть немного запутанным и подавляющим. Для начала я бы использовал
showkey
:Со страницы руководства относительно
-a
:Вы можете использовать
xmodmap
для получения некоторых сопоставлений:Выше приведены не все части головоломки, но некоторая дополнительная информация, которая может помочь вам найти окончательную карту между комбинациями клавиш и кодами сканирования. В этом разделе вопросов и ответов, посвященном U & L, есть больше информации под названием: сопоставления клавиш в Linux .
Ссылки
источник
Есть
infocmp
утилита для описанияterminfo
записей. Это особенно полезно с-L
опцией ака длинные имена переменных C :Сравнивая это с
bindkey
выходомМожно видеть, что они используют разные обозначения для экранирования , но в основном относительно легко написать скрипт, который связывает второй столбец
infocmp
с первым изbindkey
.В случае каких-либо сомнений, что означает конкретная строка (как напечатано в
infocmp
выводе), всегда можно заглянуть вterminfo
руководство, где, например, дано полное описание.источник
Я использую эмулятор терминала URxvt. Там полезный ключ привязки для показа таких кодов:
Ctrl+V
. После нажатия введите желаемую последовательность клавиш, и он напечатает свой код. Например, мойCtrl
+↑
имеет код^[Oa
.источник