我的理解是,终端通常使用 ANSI 控制代码来表示非字母数字字符序列。例如,.inputrc
在 Linux 中编辑 Bash 时,很容易找到如下所示的代码序列:
"\e[A": history-search-backward
"\e[B": history-search-forward
"\e[C": forward-char
"\e[D": backward-char
"\e[1~": beginning-of-line
"\e[4~": end-of-line
"\e[3~": delete-char
"\e[2~": quoted-insert
"\e[5C": forward-word
"\e[5D": backward-word
上面的命令定义Bash 命令的键绑定history-search-backward
等。
现在,在 bash 中,我可以read
查看键盘中键入的字符如何映射到 ANSI 控制代码。例如,如果我运行read
,然后输入Ctrl-P
,我会得到:^P
。同样,如果我输入 Alt-W
,我会得到:^[W
。
我的问题是:是否有一个程序、工具或网站可以起到相反的作用?即输出或显示键盘按键序列的工具,我需要在键盘上键入这些按键序列以获得给定的 ANSI 控制代码序列。例如,输入^[W
应输出:Alt-W
谢谢!
答案1
infocmp
可以帮助。它将 escape 写成\E
而不是\e
or ^[
。
例如,要查找\e[A
,这是您的历史搜索向后:
$ infocmp -1x | grep -F '=\E[A,'
cuu1=\E[A,
$ man 5 terminfo | grep ' cuu1 '
cursor_up cuu1 up up one line
它告诉您向上按光标,又称向上箭头。
请注意,您将需要-x
标志(如上所示)来显示某些组合,例如Ctrl+ <-。
这些扩展键不是标准的一部分,因此它们没有在 terminfo 手册页中列出,但它们记录在术语信息文件。
另请注意,控制序列根据您使用的终端而有所不同。
infocmp -1x <terminal>
您可以使用、 例如infocmp -1x rxvt
、infocmp -1x putty
等获取有关不同终端的信息。
一旦你弄清楚 terminfo 认为你拥有哪一个,如果你设置你的TERM
变量来匹配,事情就会变得更容易。
答案2
该cat
函数是执行此操作的常用方法,因为您可以使用它来显示键盘实际发送的内容。 bash 不使用终端数据库中的任何扩展信息(它使用子集传统 termcap 功能的一部分)。
cat
当然,使用 的缺点是确定是否
^[[A
是^
[
A
或者 escapeA
(请注意 bash 提供了一个可打印的内容\e
来表示该escape字符)。
在实践中,您可以忽略前者:基本上没有人发送这三个文字字符,“每个人”都将其^[
作为escape字符发送)。
进一步阅读:
- 如何查看键盘发送的内容?(ncurses 常见问题解答)
- 取消映射escape(一个可以翻译成的程序
\E
)。