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

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

Ctrl-key我对组合在终端中的工作方式感到困惑。在 bash 手册页中,有多种组合,例如:

  • C-e- 转到行尾
  • C-f- 向前移动一个字符

ETC。

但接下来还有一些无证的快捷方式例如:

  • C-j(OR C-m) 用于返回键。
  • C-h用于退格键
  • C-i用于选项卡等

这些快捷方式是否只是忘记记录下来?或者,因为

  • C-jLF
  • C-mCR
  • C-iTab

在 ASCII 中,这是否是一种“默认”行为?换句话说, 是 的行为C-jC-m并且C-i未实现经过bash 但通过其他东西?

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

编辑:

最初,我以为当我按下 时C-j,键盘会直接发送00001010到内核。但后来我认为情况并非如此,因为使用 或 等程序xevevtest我观察到按键Controlj显示为不同的事件。因此,当我按下 时C-j,键盘不会发送00001010,但可能会发送多个字节。那么这些多个字节到哪里00001010进行转换呢?

答案1

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

TAB是制表符ASCII码,这与 ASCII 中的 Ctrl+I 字符相同。对于其他键也是如此。当用户按下Tab和按下Ctrl+时,终端都会发送该字符I。对于RET(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键,因为在 中声明了光标键转义序列术语帽或者术语信息数据库。没有默认绑定Esc [ d(它不是常见终端发送的转义序列)。

答案2

两个问题,两点:

  • control/ J、 control/M和 control/I是大多数程序采用的常见 ASCII 控件。 bash只是让重新绑定 readline 中的内容变得容易。

  • 大多数接受特殊键(例如左箭头)的程序都提供了识别转义键的方法杰出的从那些特殊的键定时。您可能无法足够快地输入字符(除了特殊情况,例如 emacs,它确实不是注意时机)。

    由于您输入的速度不快,因此程序会看到单独的字符,这不会移动光标。单独的字符可能做一些有趣的事情。

不管怎样(注意我在问题中忽略的关于拼写错误的评论),这ESC[d是一个标准控制序列,如果发送到终端,会将光标移动到屏幕的顶行:

CSI Pm d  Line Position Absolute  [row] (default = [1,column]) (VPA).

自从xterm 实现了这个,当然,任何假装像 xterm 的东西都会做同样的事情。Linux控制台也这样做。但是,bash通常不会回显控制序列:您观察到的行为将是bash对其无法识别的转义所做的任何操作。

关于换页符(评论假设它们是问题的一部分):bash 对换页符的使用(用于输入) 清除屏幕让一些人感到困惑(包括 PuTTY 的开发人员)认为终端应该解释换页。该功能实际上来自行式打印机,最初很少在终端中找到,甚至在打印品种中也是如此。对于一些相关的讨论,请参阅我的笔记重新分页器后续行动重用该功能。

相关内容