为什么 bash 快捷键中不使用 Ctrl+m 和 Ctrl+q?

为什么 bash 快捷键中不使用 Ctrl+m 和 Ctrl+q?

最近,我一直在审查 bash 快捷键,并尝试为我的 tmux 激活键找到合适的快捷键。

我觉得很有趣的是ctrl + mctrl + q没有在 bash 快捷方式中使用,根据https://en.wikipedia.org/wiki/Bash_(Unix_shell)

为什么它们不被使用?我感觉ctrl + m还是蛮方便的。

这两种组合是设计用于DIY (define it yourself)使用的吗?还是另有故事?

答案1

Ctrl+M 发送与终端中的 Enter 键相同的字符(RET)。程序无法区分它们,因此无法单独配置这些键。

Ctrl+Q 已用于XON默认情况下,所以 Bash 不能使用它,但你应该仍然可以在 tmux 中使用它,因为 tmux 使用原始输入模式。

GUI 程序可以从键盘读取,已使用修饰符 Ctrl 按下键 m 并使用 Ctrl+m 作为快捷方式,但 shell 或任何终端程序接收 Ctrl+按键组合就像从 0 到 26 的 ascii 字符一样

Ctrl+@ = 0
Ctrl+A = 1
Ctrl+B = 2

等等。您可以尝试这个来查看值

cat ctrlkeys <<EOF
^A^B^C^D^E^F
EOF
od -c ctrlkeys
0000000 001 002 003 004 005 006  \n

要输入值,请在按 Ctrl+[af] 之前按 Ctrl+v,以使它们不被解释为原始值。

当您查看 ascii(7) 表时,您可以在表中看到控制代码,相应的字符 @..Z 位于左侧。例如

015   13    0D    CR  '\r' (carriage ret)     115   77    4D    M

或者

011   9     09    HT  '\t' (horizontal tab)   111   73    49    I

在 bash 之前解释控制代码的下一层是 stty(更改并打印终端设置)

stty -a
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; flush = ^O;

lnext请参阅 stty(1) 了解orstart和的含义stop

另请参阅 readline(3),因为 bash 和其他 GNU cli 程序使用该库来控制输入行,当然还有 bash(1) /READLINE(bash 手册页的 readline 部分)。

注意:XYZ(NUM) 表示第 NUM 节中的手册页 XYZ,因此 的结果man NUM XYZ

相关内容