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


15

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

根据https://en.wikipedia.org/wiki/Bash_(Unix_shell),我发现它很有趣,ctrl + m并且ctrl + q没有在bash快捷方式中使用。

为什么不使用它们?我觉得ctrl + m很方便。

这两种组合是否是设计要DIY (define it yourself)使用的?还是还有另一个故事?


1
使用ALT + m更加方便,恕我直言。
罗尔夫(Rolf)

Answers:


16

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

默认情况下,Ctrl + Q已用于XON,因此Bash无法使用Ctrl + Q ,但是您仍然应该能够在tmux中使用它,因为tmux使用原始输入模式。

一个GUI程序可以从键盘上读取,已用修饰符Ctrl按下了键m,并使用Ctrl + m作为快捷方式,但是shell或任何终端程序都可以接收Ctrl + Key组合,就像从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;

有关lnextor start和的含义,请参见stty(1)stop

另请参见readline(3)作为bash,其他GNU cli程序使用该库来控制输入行,当然还包括bash(1)/ READLINE,这是bash手册页的readline部分。

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


1
Bash有一个默认的Cs绑定(XOFF),因此他们也可以为Cq绑定一个。
吉尔(Gilles)'所以

实际上,默认情况下,Bash使用的GNU Readline库与Emacs函数的克隆(即Emacs函数的克隆)绑定C-q到同一事物C-v,该函数quoted-insert对于弄清由键和键组合生成的转义代码很有用。这是Readline手册的相关部分:tiswww.case.edu/php/chet/readline/readline.html#SEC9
ssokolow
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.