Utk*_*tku 7 bash keyboard-shortcuts terminal escape-characters
我对Ctrl-key组合在终端中的工作方式感到困惑。在 bash 手册页中,有多种组合,例如:
C-e - 转到行尾C-f - 前进一个字符等等。
但是还有一些未记录的快捷方式,例如:
C-j(OR C-m) 用于返回键。C-h 退格C-i 用于选项卡等这些快捷方式是否只是忘记记录?或者,因为
C-j 是 LFC-m 是 CRC-i 是 Tab在 ASCII 中,这是某种“默认”行为吗?换句话说,是针对行为C-j,C-m并C-i没有实现由bash的,而是由别的东西吗?
另一个问题是,当我按下C-v左箭头键时,^[[D屏幕上会出现。即,ESC-[-d。但是当我按下 时ESC-[-d,光标不会向左移动。这是什么原因?
最初,我认为当我按下 时C-j,键盘直接发送00001010到内核。但后来我决定事实并非如此,因为使用诸如xev或 之类的程序evtest,我观察到按键按下Control并j显示为不同的事件。因此,当我按下 时C-j,键盘不会发送00001010,但可能会发送多个字节。那么这些多个字节的转换00001010是在哪里完成的呢?
C-m、等的行为是由 bash 实现的,但它们与、等C-i相同的事实是由终端的行为决定的。所有终端的行为都是这样的,因为所有终端的行为一直都是这样的,而且这也是应用程序所期望的。终端和应用程序之间的接口基于字符(实际上是字节),而不是按键,因此不发送可打印字符的按键和按键组合必须以某种方式进行编码。请参阅键盘输入和文本输出如何工作?有关此主题的更多信息。另请参阅https://emacs.stackexchange.com/questions/1020/problems-with-keybindings-when-using-terminalReturnTab
TAB是ASCII中的制表符,与 ASCII 中的 Ctrl+I 字符相同。对于其他键也是如此。Tab当用户按下和按下Ctrl+时,终端都会发送该字符I。RET(CR)和C-m、对于LFD和C-j(大多数键盘没有)以及对于ESC和也是如此C-[。还有BackSpacewhich 发送C-hor C-?,这是它自己的问题。
终端的配置(stty设置)也可以发挥作用,这会影响 bash 的一些设置(例如,在 后stty erase @,bash 会将按下@视为 BackSpace),但不会影响C-m和C-j提交当前行。
^[[D是Esc [ D,但是有资本D。如果按Esc [ D,bash 会看到该Left键,因为termcap或terminfo数据库中声明了光标键转义序列。没有默认绑定Esc [ d(它不是常见终端发送的转义序列)。