键绑定表?

键绑定表?

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

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

例如,在“zbindkey”中我们有这样的东西:

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

...我可以猜测“kend”意味着 this 指的是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

...但至少现在我知道 在bindkey-at-CLI 中的发言与在bindkey-in-zbindkey 中的发言^[[A是相同的。\e[A这很容易。在Up Arrow 过去的 DOS 时代,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

……那我就很高兴了。

答案1

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

正如您所看到的,描述控制字符的方法有很多种。有些有一个名称,与其传统功能相对应(例如制表符、换行符);这些往往有一个反斜杠+字母组合,您可以在内部$'…'或参数中使用它echo或者print(以及 sed 正则表达式以及 awk、C 和其他语言中的字符串文字(请注意,不同的工具可能具有稍微不同的转义序列集))。您\033也可以在这些上下文中使用反斜杠+八进制(例如)。

对于每个键发送哪些转义序列终端存在一些变化。幸运的是,几乎没有重叠:很少有字符序列在不同的终端上表示不同的键。主要问题是字符 127 == \1770x7f,现在最常见Backspace,但有时也是如此Delete

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

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

Terminfo 数据库包含某些键的转义序列。您将在以下位置找到 Terminfo 功能列表:术语信息(5)您系统上的手册页。在 zsh 中,您可以通过以下方式列出数据库中的值terminfo关联数组。打印出包含转义序列的值时要注意,这些转义序列在显示时也会被终端解释,因此以带引号的形式打印它们。

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

键盘输入和文本输出如何工作?更完整地了解按下某个键时会发生什么。没有必要了解 zsh 中的键绑定。

答案2

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

(欢迎评论、改进、严厉谴责:eastlink dot ca 的 rayandrews)

“101”PC 键盘上的“可用”组合键连接到在 Debian Linux 下的 xfce4 下运行“zsh”的 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' '我的命令 \Cm'

...将“F1”绑定到“my-command”并执行它(“\Cm”模拟“Enter”键)。

在“.zshrc”中:

bindkey -s '\e[25' '我的命令1 ;我的命令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~' 键[Home] = '^[[1~' 键[结束] = '^[[4~' 键[上一页] = '^[[5~' 键[PageDown] = '^[[6~' 键[向上] = '^[[A' 键[下] = '^[[B' 键[右] = '^[[C' 键[左] = '^[[D'

键[Bksp] = '^?' 键[Bksp-Alt] = '^[^?' key[Bksp-Ctrl] = '^H' 仅限控制台。

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

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

key[Tab] = '^I' 或 '\t' 独特形式!可以绑定,但不能“showkey -a”。 键[Tab-Alt] = '^[\t'

使用白键的组合:

异常情况: 在 xterm 中,'Ctrl+`' == 'Ctrl+2' 和 'Ctrl+1' == '1'。 一些“Ctrl+数字”组合在控制台中无效,但在 xterm 中返回代码。 OTOH Ctrl+Bksp 在控制台返回“^H”,但与 xterm 中的普通“Bksp”相同。然而,毫无疑问,这些小故障还有更多,主要是:

白色键代码很容易理解,每个“正常”打印键都有六种形式:

A = 'a'(废话) 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”进行更改GUI 的终端?

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

enter code here

答案3

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 中的按键映射

参考

答案4

我使用 URxvt 终端模拟器。有一个有用的键绑定可以显示此类代码:Ctrl+V。按下它后输入您想要的按键序列,它将打印其代码。例如,我的Ctrl+有代码^[Oa

相关内容