我们是否有一个按键绑定表来转换所有不同的按键方式?我正在使用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
又名\033
0x1b 又名 ^[ 开头)。功能键或字符键与修饰符的组合也是如此,尽管并非所有终端都为所有不同的修饰符组合发送不同的序列。一些键被编码为控制字符(例如Tab→ Ctrl-I == \t
)\011
。
正如您所看到的,描述控制字符的方法有很多种。有些有一个名称,与其传统功能相对应(例如制表符、换行符);这些往往有一个反斜杠+字母组合,您可以在内部$'…'
或参数中使用它echo
或者print
(以及 sed 正则表达式以及 awk、C 和其他语言中的字符串文字(请注意,不同的工具可能具有稍微不同的转义序列集))。您\033
也可以在这些上下文中使用反斜杠+八进制(例如)。
对于每个键发送哪些转义序列终端存在一些变化。幸运的是,几乎没有重叠:很少有字符序列在不同的终端上表示不同的键。主要问题是字符 127 == \177
0x7f,现在最常见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
。