bug*_*bug 53 keyboard-shortcuts terminal readline escape-characters
例如:
"\e[1;5C"
"\e[Z"
"\e-1\C-i"
Run Code Online (Sandbox Code Playgroud)
我只知道点点滴滴,比如\e
代表转义和C-
为Ctrl,但这些数字 ( 1
) 和字母 ( Z
) 是什么?什么;
,[
和-
迹象?
是否只有反复试验,或者是否有完整的 bash 键代码列表及其语法解释?
Sté*_*las 67
这些是您按下给定键时终端发送的字符序列。与 bash 或 readline 本身无关,但是如果您想配置readline
为在给定的按键按下时执行某些操作,您将想知道给定的键或组合键发送的字符序列。
当您按下该A键时,通常终端会发送a
(0x61) 字符。如果按<Ctrl-I>
或<Tab>
,则通常发送^I
也称为TAB
或\t
(0x9)的字符。大多数功能键和导航键通常会发送以^[
(control-[)开头的字符序列,也称为ESC
或\e
(0x1b, 033 八进制),但确切的顺序因终端而异。
找出一个键或键组合为您的终端发送什么的最好方法是运行sed -n l
并Enter在键盘上输入它。然后你会看到类似的东西:
$ sed -n l
^[[1;5A
\033[1;5A$
Run Code Online (Sandbox Code Playgroud)
第一行是由echo
终端设备做的本地终端引起的(可能不可靠,因为终端设备设置会影响它)。
第二行由 输出sed
。将$
不被包括在内,它只是给你看,其中线的到底是什么。
上面这意味着Ctrl-Up(我已按下)发送 6 个字符ESC
, [
, 1
, ;
,5
和A
(0x1b 0x5b 0x31 0x3b 0x35 0x41)
该terminfo
数据库记录的数字序列对一些普通密钥对多个终端(基于$TERM
值)。
例如:
TERM=rxvt tput kdch1 | sed -n l
Run Code Online (Sandbox Code Playgroud)
会告诉您rxvt
按下该Delete键后发送的转义序列是什么。
您可以使用当前终端查找与给定序列对应的键infocmp
(此处假设为ncurses
infocmp):
$ infocmp -L1 | grep -F '=\E[Z'
back_tab=\E[Z,
key_btab=\E[Z,
Run Code Online (Sandbox Code Playgroud)
像Ctrl-Up这样的组合键在terminfo
数据库中没有相应的条目,因此要了解它们发送的内容,请阅读相应终端的源代码或文档,或者使用上述sed -n l
方法进行尝试。
它是通过 GNUreadline
库提供的。你应该查看man 3 readline
它的描述。
看起来您还需要有关转义码等\[A
含义的信息。您可以在 Wikipedia 的ANSI 转义码文章中找到此信息。
我发现检查按键或组合键生成的转义序列的最简单方法是在终端中按Ctrl+ v,然后按您想了解的键/组合。
您将得到一个类似的序列^[Oa
,并且您必须将 翻译^[
为\e
或\033
或\x1b
或您的按键绑定系统期望的转义字符的任何其他表示形式。
它最初是一个名为quoted-insert
and 的 Emacs 函数,由于 Bash 和 Zsh 的默认按键绑定模仿 Emacs,所以他们也复制了它。
Bash 通过 GNU Readline 输入库获取它,Python 的import rlcompleter
增强等其他东西也使用该库。
以下是Readline 手册中的描述:
quoted-insert
(C-q
或者C-v
)将键入的下一个字符逐字添加到该行。
C-q
例如,这就是插入键序列的方法。
这应该适用于任何基于 GNU Readline 的东西。
至于 Zsh,它使用自己的替代方案 ZLE,它只C-q
在 Vi 模式下尊重原始的 Emacs 绑定,讽刺的是,但C-v
仍然可以在默认的类似 Emacs 的输入模式下工作。quoted-insert
(在zshzle
或手册页中搜索zshall
,第二对结果应列出默认按键绑定。)
对于助记符,我建议将Ctrl+视为逐字v询问。