关于控制键快捷键行为的问题

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-jLF
  • C-mCR
  • C-iTab

在 ASCII 中,这是某种“默认”行为吗?换句话说,是针对行为C-jC-mC-i没有实现bash的,而是由别的东西吗?

另一个问题是,当我按下C-v左箭头键时,^[[D屏幕上会出现。即,ESC-[-d。但是当我按下 时ESC-[-d,光标不会向左移动。这是什么原因?

编辑:

最初,我认为当我按下 时C-j,键盘直接发送00001010到内核​​。但后来我决定事实并非如此,因为使用诸如xev或 之类的程序evtest,我观察到按键按下Controlj显示为不同的事件。因此,当我按下 时C-j,键盘不会发送00001010,但可能会发送多个字节。那么这些多个字节的转换00001010是在哪里完成的呢?

Gil*_*il' 3

C-m、等的行为是由 bash 实现的,但它们与、等C-i相同的事实是由终端的行为决定的。所有终端的行为都是这样的,因为所有终端的行为一直都是这样的,而且这也是应用程序所期望的。终端和应用程序之间的接口基于字符(实际上是字节),而不是按键,因此不发送可打印字符的按键和按键组合必须以某种方式进行编码。请参阅键盘输入和文本输出如何工作?有关此主题的更多信息。另请参阅https://emacs.stackexchange.com/questions/1020/problems-with-keybindings-when-using-terminalReturnTab

TAB是ASCII中的制表符,与 ASCII 中的 Ctrl+I 字符相同。对于其他键也是如此。Tab当用户按下和按下Ctrl+时,终端都会发送该字符IRET(CR)和C-m、对于LFDC-j(大多数键盘没有)以及对于ESC和也是如此C-[。还有BackSpacewhich 发送C-hor C-?,这是它自己的问题。

终端的配置(stty设置)也可以发挥作用,这会影响 bash 的一些设置(例如,在 后stty erase @,bash 会将按下@视为 BackSpace),但不会影响C-mC-j提交当前行。

^[[DEsc [ D,但是有资本D。如果按Esc [ D,bash 会看到该Left键,因为termcapterminfo数据库中声明了光标键转义序列。没有默认绑定Esc [ d(它不是常见终端发送的转义序列)。