键绑定表?


18

我们是否有一个键绑定表可以转换所有不同的按键方式?我正在使用zsh,但我假设如果有这样一个表,它将适用于任何shell。

我问的原因是我想分配一些键绑定,但是我不知道如何引用它们(除非我要窃取已经定义的键绑定)。

例如,在“ zbindkey”中,我们有这样的事情:

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

...而且我猜想“ kend”表示这是指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在CLI的bindkey-at \e[A-zLID中讲和在bindbin-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),然后按键。
Mikel 2014年

Answers:


16

终端应用程序和终端仿真器(或硬件终端)之间的接口传输字节,而不是密钥。诸如光标移动键之类的功能键会转换为转义序列(以转义字符ESC aka \eaka \033aka 0x1b aka ^ [ 开头)。功能键或字符键与修饰符的组合也是如此,尽管并非所有终端都为所有不同的修饰符组合发送不同的序列。发送一些编码为控制字符的键(例如Tab→Ctrl-I = \t= \011)。

如您所见,有很多方法可以描述控制字符。有些具有与传统功能相对应的名称(例如,制表符,换行符);这些往往有一个反斜杠+字母组合,你可以在里面使用$'…'的参数或对echoprint(和在sed正则表达式,并在AWK,C和其他语言(注意字符串文字,不同的工具可能有一个稍微不同的一组转义序列))。您也可以\033在这些情况下使用反斜杠+八进制(例如)。

关于向每个键发送哪些转义序列终端有一些变化。幸运的是,几乎没有重叠:几乎没有字符序列,这些字符序列表示不同终端上的不同键。主要问题是字符127 = \177= 0x7f,该字符在Backspace当今最为常见,但有时也如此Delete

^[OF^[[F(即\eOF\e[F)是发出的两个常见转义序列End^E(即\005)是的Emacs键绑定(Ctrl+ Eend-of-line

要查看终端仿真器针对特定键或组合键发送的内容,请按Ctrl+ V,然后按相关的键。这将从字面上插入转义序列的第一个字符。转义序列通常包含一个转义字符,后跟可打印字符,因此其余的转义序列也将按字面意义插入。

Terminfo数据库包含一些键的转义序列。您可以在系统上的terminfo(5)手册页中找到Terminfo功能的列表。在zsh中,您可以通过terminfo关联数组列出数据库中的值。当打印出包含转义序列的值时要当心,这些值也会在显示时由终端解释,因此请用引号将它们打印出来。

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

请参阅键盘输入和文本输出如何工作?以获得有关按下键时会发生什么情况的更完整概述。无需了解zsh中的键绑定。


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

(欢迎评论,改进,痛苦的指责:Eastlink dot ca上的rayandrews)

Debian Linux上xfce4下运行“ zsh”的PC上连接的PC上的“ 101” PC键盘上的“可用”键组合(我不知道是谁负责)。除显示的最简单的头像外,所有在“灰色”键中产生重复代码的组合都已删除。请注意,某些灰色键/组合具有“ ^字母”重复项,例如“ Enter” ==“ ^ M”,但这些重复项尚未删除。由于系统使用了其他有效组合,因此无法“使用”,即使是从控制台(例如控制台)也可以使用。“ Alt + Function”键可切换端子。也许'Meta'键会做更多的事情,但这只有101 KB。有趣的是,在DOS中有更多的组合可用,例如Ctrl + Function,所有组合都在DOS中可用,而在Linux中都没有,因此看来。三联键组合(例如“ Ctrl + Alt + Up”)中没有一个在灰色键中产生任何唯一代码,但在白色键中却产生了代码。有趣的异常现象:'^ [[22''^ [[27''^ [[30'正在丢失”,您真想知道为什么忽略了这些数字。(这就是说,您可能希望'F11'为'^ [[22',而不是'^ [[23'。)。”

所显示的密钥代码与在CLI上由“ showkeys -a”或“ bindkey”输出的一样。但是,由于某些原因,如果您在脚本中使用“ 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' [ 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〜'

[ 插入] = '^ [[2〜' ] [ 删除] = '^ [[3〜' ] [ 主页] = '^ [[1〜' ] [ 结束] = '^ [[4〜' [ PageUp ] = '^ [[ 5〜' ] [ PageDown ] = '^ [ [ 6〜' ] [ Up ] = '^ [[A' [ Down ] = '^ [[B' [ Right ] = '^[[C' key[Left] = '^[[D'

[ Bksp ] = '^?' key[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' duhhh - = 'A' 谁又能猜到?) 一个- Alt键= '^ [A' - 按Ctrl = '^ A' - Alt键- 按Ctrl = “^ [^ 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 - Function a terminal, but 'Alt-Ctrl-Function' to change to a terminal from GUI?

如何/在哪里定义Alt - Ctrl - Delete ”?

enter code here

我几乎想发送电子邮件...
mikeserv 2014年

一定要去麦克:rayandrews@eastlink.ca
雷·安德鲁斯

这只是个玩笑,雷-您只是不经常看到see子,抓地力,抱怨?给我发电子邮件...在此附近逐行发送。我很感激,仅此而已。无论如何,除了zsh按键主题外,您可能想尝试该zkbd功能,该功能应该使您将整个按键映射保存在文件中。我相信它autoload可以,但如果不能,请在中查找/usr/share/zsh/functions/Misc。顺便说一句,里面还有其他一些奇怪的东西tetris
mikeserv 2014年

那是我用来做桌子的工具之一,但是如何使它一次装满一切呢?
雷·安德鲁斯

有趣-我想没有。我之前从未真正运行过它-只读取了它的源文件-那是几个月前的事情。我猜它确实进行了一系列输入测试以生成其保存文件。但这确实将所有内容保存到文件中,对吗?
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
尽管这都是事实,但与了解终端中的按键绑定无关。
吉尔(Gilles)'所以

@Gilles-是的,我有点想,我只是想提供潜在客户,因为我已经阅读了您的AI才能理解该界面的工作原理,谢谢!
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

可以看到他们使用了不同的符号进行转义,但是基本上,编写连接第二行的脚本相对容易。infocmpbindkey

如果有任何疑问,特定的字符串是什么意思(如打印在infocmp输出中),您可以随时参考terminfo手册中的完整说明,例如

key_send  ->  shifted end key
key_sic   ->  shifted insert-character key
key_dc    ->  delete-character key

0

我使用URxvt终端仿真器。有一个有用的键绑定用于显示此类代码:Ctrl+V。按下后,输入所需的按键顺序,它将打印其代码。例如,我的Ctrl+ 有代码^[Oa

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.