在哪里可以找到要重新映射bash中的快捷键的终端键代码列表?


42

例如:

"\e[1;5C"
"\e[Z"
"\e-1\C-i"

我只知道点和点,例如\e代表逃脱和C-代表Ctrl,但是这些数字(1)和字母(Z)是什么?什么;[-迹象?

是否只有反复试验,还是bash键代码的完整列表及其语法说明?


2
列出shell 的实际readline 绑定的另一个技巧是bind -p

1
大多数此类代码由您的终端解释;在Wikipedia上阅读有关ANSI转义码的大量信息。
13年

stty -a显示终端的线路设置
bug

Answers:


52

这些是您按给定键时终端发送的字符序列。与bash或readline本身无关,但是如果您想配置readline为在给定的按键下执行某些操作,则您将想知道给定的键或组合键发送的字符序列。

当您按该A键时,通常终端会发送a(0x61)字符。如果按<Ctrl-I><Tab>,则通常发送^I也称为TAB\t(0x9)的字符。大多数功能键和导航键通常会发送一个以^[(control- [)开始的字符序列,也称为ESCor \e(0x1b,033 octal),但是确切的序列因终端而异。

找出并发送给终端的按键或组合键的最佳方法是运行sed -n lEnter在键盘上键入内容。然后,您将看到类似以下内容:

$ sed -n l
^[[1;5A
\033[1;5A$

第一行是由echo终端设备完成的本地终端引起的(由于终端设备设置会影响它,因此可能不可靠)。

第二行由输出sed。将$不被包括在内,它只是给你看,其中线的到底是什么。

以上这意味着Ctrl-Up(我已经按下)送6个字符ESC[1;5A(0x1b 0x5b 0X31 0x3b 0x35的0x41)

terminfo数据库记录的数字序列对一些普通密钥对多个终端(基于$TERM值)。

例如:

TERM=rxvt tput kdch1 | sed -n l

会告诉你什么转义序列被发送rxvt当按下Delete键。

您可以使用以下命令在当前终端中查找与给定序列对应的键infocmp(此处假设为ncursesinfocmp):

$ infocmp -L1 | grep -F '=\E[Z'
    back_tab=\E[Z,
    key_btab=\E[Z,

Ctrl-Up这样的组合键在terminfo数据库中没有相应的条目,因此要查找它们的发送内容,请阅读相应终端的源代码或文档,或者使用上述sed -n l方法进行尝试。


这是一个很好的解释,谢谢!现在,所有内容都放到\e-1\C-i了一个向后的选项卡中,因为controli插入了一个选项卡,escape然后-1说bash一次将其向后执行一次(我对此进行了浏览,发现了一些有关的东西digit-arguments)。
错误

$ sed -n 1 sed: -e expression #1, char 1: missing command
cnvzmxcvmcx

3
@vib。这是小写L不是数字1
斯特凡Chazelas

1
@ user367890,这取决于键盘模式。你可能会发现后tput smkx,你的终端发送\e[ODkcub1)之后tput rmkx\e[Dcub1中,相同的代码序列将光标移动到左侧,使回波这些键并移动光标。试试stty -echoctl; tput rmkx; sleep inf,你会看到不在键盘模式下时,箭头键会移动光标)。
斯特凡Chazelas

1
@ user367890,Thomas(ncurses和xterm维护者)在您链接的答案中说的是,是的,它应该可以工作。小键盘模式应用程序模式指的是同一件事,因此(再次根据托马斯的说法)terminfo数据库中的键规范适用于启用smkx时的情况。
斯特凡Chazelas

4

它是通过gnu readline库提供的。您应该查看man 3 readline以了解其描述。

看来您还需要有关escspe代码的\[A含义的信息。您可以在Wikipedia ANSI esacape代码文章中找到此信息。


这不能解释我的示例。
错误

看来这是个小小的误解。请查看答案更新。

本文中没有有关我的特定示例的信息。页面搜索“ [A]”也未返回任何内容。
错误

1
@bug,请仔细阅读文章。\[A在表格中的“ CSI代码”行中:“ CSI n A”
高峰

由于匆忙,但我在哪里找到的解释[Z[1;5C-1
错误

3

这些代码是否来自同一来源?最后一个看起来像是GNU readline绑定。这就是用户发送给bash的信息(请参阅rush的答案)。但是,前两个看起来更像是终端控制序列(即使第一个是格式错误的序列)。这就是bash或其他程序发送回终端仿真器的内容,以控制光标的移动,文本的颜色等。


在其他教程中,我发现“ \ e [1; 5C”用于ctrl箭头前移,而“ \ e [Z”和“ \ e-1 \ Ci”用于菜单完成后退。它们都已在.inputrc文件中使用。
错误

好的,如果它们由readline解释,那么必须有一些终端仿真器,其中这些控制序列绑定到ctrl,alt和/或shift与功能或箭头键的某种组合。(我不知道是哪一个。)
Uwe

0

我发现检查键或组合键生成什么转义序列的最简单方法是在终端中按Ctrl+ v,然后按要了解的键/组合键。

您将获得一个类似的序列,^[Oa并且必须将键绑定系统期望的转义字符转换^[\e\033\x1b或其他任何表示形式。

它始于一个名为Emacs的函数,quoted-insert并且由于Bash和Zsh的默认键绑定模仿了Emacs,因此他们也将其复制了。

Bash通过GNU Readline输入库将其获取,其他功能(如Python的import rlcompleter增强功能)也将使用。

这是Readline手册中的描述:

quoted-insertC-qC-v

将键入的下一个字符逐字添加到行中。例如,这就是如何插入诸如的键序列C-q

那应该可以在基于GNU Readline的任何东西中工作。

至于使用自己命名为ZLE的Zsh的Zsh,只有C-q在Vi模式下才尊重原始的Emacs 绑定,具有讽刺意味的是,但C-v仍可以在默认的类似Emacs的输入模式下使用。(quoted-insertzshzle或zshall的联机帮助页中进行搜索,第二对结果应列出默认的键绑定。)

对于一个记忆,我建议的想法Ctrl+ v作为自讨苦吃v erbatim。

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.