Answers:
这些是您按给定键时终端发送的字符序列。与bash或readline本身无关,但是如果您想配置readline
为在给定的按键下执行某些操作,则您将想知道给定的键或组合键发送的字符序列。
当您按该A键时,通常终端会发送a
(0x61)字符。如果按<Ctrl-I>
或<Tab>
,则通常发送^I
也称为TAB
或\t
(0x9)的字符。大多数功能键和导航键通常会发送一个以^[
(control- [)开始的字符序列,也称为ESC
or \e
(0x1b,033 octal),但是确切的序列因终端而异。
找出并发送给终端的按键或组合键的最佳方法是运行sed -n l
并Enter在键盘上键入内容。然后,您将看到类似以下内容:
$ sed -n l
^[[1;5A
\033[1;5A$
第一行是由echo
终端设备完成的本地终端引起的(由于终端设备设置会影响它,因此可能不可靠)。
第二行由输出sed
。将$
不被包括在内,它只是给你看,其中线的到底是什么。
以上这意味着Ctrl-Up(我已经按下)送6个字符ESC
,[
,1
,;
,5
和A
(0x1b 0x5b 0X31 0x3b 0x35的0x41)
该terminfo
数据库记录的数字序列对一些普通密钥对多个终端(基于$TERM
值)。
例如:
TERM=rxvt tput kdch1 | sed -n l
会告诉你什么转义序列被发送rxvt
当按下Delete键。
您可以使用以下命令在当前终端中查找与给定序列对应的键infocmp
(此处假设为ncurses
infocmp):
$ infocmp -L1 | grep -F '=\E[Z'
back_tab=\E[Z,
key_btab=\E[Z,
像Ctrl-Up这样的组合键在terminfo
数据库中没有相应的条目,因此要查找它们的发送内容,请阅读相应终端的源代码或文档,或者使用上述sed -n l
方法进行尝试。
\e-1\C-i
了一个向后的选项卡中,因为control
并i
插入了一个选项卡,escape
然后-1
说bash一次将其向后执行一次(我对此进行了浏览,发现了一些有关的东西digit-arguments
)。
$ sed -n 1
sed: -e expression #1, char 1: missing command
tput smkx
,你的终端发送\e[OD
(kcub1
)之后tput rmkx
,\e[D
(cub1
中,相同的代码序列将光标移动到左侧,使回波这些键并移动光标。试试stty -echoctl; tput rmkx; sleep inf
,你会看到不在键盘模式下时,箭头键会移动光标)。
它是通过gnu readline库提供的。您应该查看man 3 readline以了解其描述。
看来您还需要有关escspe代码的\[A
含义的信息。您可以在Wikipedia ANSI esacape代码文章中找到此信息。
\[A
在表格中的“ CSI代码”行中:“ CSI n A”
[Z
,[1;5C
或-1
?
这些代码是否来自同一来源?最后一个看起来像是GNU readline绑定。这就是用户发送给bash的信息(请参阅rush的答案)。但是,前两个看起来更像是终端控制序列(即使第一个是格式错误的序列)。这就是bash或其他程序发送回终端仿真器的内容,以控制光标的移动,文本的颜色等。
我发现检查键或组合键生成什么转义序列的最简单方法是在终端中按Ctrl+ v,然后按要了解的键/组合键。
您将获得一个类似的序列,^[Oa
并且必须将键绑定系统期望的转义字符转换^[
为\e
或\033
或\x1b
或其他任何表示形式。
它始于一个名为Emacs的函数,quoted-insert
并且由于Bash和Zsh的默认键绑定模仿了Emacs,因此他们也将其复制了。
Bash通过GNU Readline输入库将其获取,其他功能(如Python的import rlcompleter
增强功能)也将使用。
这是Readline手册中的描述:
quoted-insert
(C-q
或C-v
)将键入的下一个字符逐字添加到行中。例如,这就是如何插入诸如的键序列
C-q
。
那应该可以在基于GNU Readline的任何东西中工作。
至于使用自己命名为ZLE的Zsh的Zsh,只有C-q
在Vi模式下才尊重原始的Emacs 绑定,具有讽刺意味的是,但C-v
仍可以在默认的类似Emacs的输入模式下使用。(quoted-insert
在zshzle
或zshall的联机帮助页中进行搜索,第二对结果应列出默认的键绑定。)
对于一个记忆,我建议的想法Ctrl+ v作为自讨苦吃v erbatim。
bind -p
。