(tl;dr:长期调查。最后对问题进行分类。)
我刚刚注意到,当我按下super+some 字母(例如 command+n 或 windowsKey+a 等)时,我会得到一个奇怪格式的主机文件列表,以及一个包含两个字母的新行。
例如:
user@host $ <here i press Super+n>
::1 localhost test.com
test2.com test3.com
user@host $sn
如果我启动文本编辑器并按下相同的键,我会看到:@sn
没有其他内容。
$ hexdump x
0000000 7340 0a6e
0000004
这看起来不对,因为如果该组合键发送的就是这个,那么什么也不会发生。所以它一定缺少信息。让我们尝试其他方法
$ cat `tty` | hexdump
^X@sn
0000000 4018 6e73 000a
0000005
我猜这000a
是因为我必须输入新行并按 ctrl+D 离开 tty 并允许重定向到 hexdump。所以让我们忽略它。
我留下了其余的十六进制值,它们的顺序正确:
18: CAN cancel
40: @
73: s
6E: n
我找不到 CAN char 的用途。它没有列出stty -a
$ stty -a
speed 38400 baud; rows 33; columns 151; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon ixoff -iuclc -ixany -imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc
没有任何地方。但如果能以这样的方式显示地图^X
就好了,否则我会很迷茫。cat
维基百科上取消控制字符并不能解释发生了什么。但可以确认^X
映射。
现在我们知道 CAN 是^X
,我可以输入:(^X
这会使终端处于一种奇怪的、无回显的状态,很像 START,stty 显示正确为^Q
),然后按下@
显示与之前相同的主机列表!
好的,所以这^X
可能是终端之外的某个功能。剩下的就是 Bash。这让我想到这个答案(讽刺的是,这指向了维基百科中被删除的信息,而不是所选的答案)。bash 手册显示^X
(带有符号C-x
),随处可见:
C-x @
是用来可能的主机名完成(Cx @)
它与取消控制字符无关,但如果stty
不知道这个字符是 ^X,那么映射是什么?也就是说,如果我输入,^V ^X
我会得到字符 0x18。
整个调查给我留下了几个问题:
什么负责 映射终端的Control+ x= 取消字符 (ascii 0x18)?为什么它没有在 上列出
stty -a
?但是cat
知道它,怎么知道?为什么我可以用 键入 Cancel Char^V ^X
?为什么按下 super+某些字母会导致
^X@s
+字母?(这是唯一只发生在 KDE 的 konsole 上的部分,其余部分在 xterm 上也有效。我没有在任何地方配置任何特殊的快捷键)(编辑:更详细这里有自己的问题)
答案1
正如您所说,C-x @
用于可能的主机名补全。如果您在提供的 bash 手册链接中查找它,它位于“让 Readline 为您输入”部分中。
雷德莱恩是一个允许行编辑和其他功能(如制表符补全)的库。它用于 bash,但也用于其他程序。
因此,bash 中的 readline 以及针对 bash 的特定配置负责显示主机列表。这与 无关stty
,后者是 tty 设置的一部分,是 unix 的一部分,早在 readline 库出现之前就已存在。
在 readline 看到任何 tty 设置之前,对 tty 设置的解释就已经发生了。
cat
对这一切一无所知。
至于为什么Super与其他一些键一起会产生此序列:在我的系统上不会,我也不知道为什么在您的系统上会产生。我首先要查看的是您的终端仿真器(您没有说您使用哪一个,我使用xterm
)。第二个地方是您的桌面管理器/窗口管理器。