那么 Linux 终端上的 Ctrl+x 到底是什么?

那么 Linux 终端上的 Ctrl+x 到底是什么?

(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。

整个调查给我留下了几个问题:

  1. 什么负责 映射终端的Control+ x= 取消字符 (ascii 0x18)?为什么它没有在 上列出stty -a?但是cat知道它,怎么知道?为什么我可以用 键入 Cancel Char ^V ^X

  2. 为什么按下 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)。第二个地方是您的桌面管理器/窗口管理器。

相关内容