Ctrl-key
我对组合在终端中的工作方式感到困惑。在 bash 手册页中,有多种组合,例如:
C-e
- 转到行尾C-f
- 向前移动一个字符
ETC。
但接下来还有一些无证的快捷方式例如:
C-j
(ORC-m
) 用于返回键。C-h
用于退格键C-i
用于选项卡等
这些快捷方式是否只是忘记记录下来?或者,因为
C-j
是LF
C-m
是CR
C-i
是Tab
在 ASCII 中,这是否是一种“默认”行为?换句话说, 是 的行为C-j
,C-m
并且C-i
未实现经过bash 但通过其他东西?
另一个问题是,当我按下C-v
左箭头键时,^[[D
屏幕上会出现 。 IE,ESC-[-d
。但是当我按 时ESC-[-d
,光标不会向左移动。这是什么原因呢?
编辑:
最初,我以为当我按下 时C-j
,键盘会直接发送00001010
到内核。但后来我认为情况并非如此,因为使用 或 等程序xev
,evtest
我观察到按键Control
和j
显示为不同的事件。因此,当我按下 时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
、对于LFD
和C-j
(大多数键盘没有)以及对于ESC
和 也是如此C-[
。还有BackSpacewhich 发送C-h
or C-?
,这是它自己的问题。
终端的配置(stty
设置)也可以发挥作用,这会影响 bash 的一些设置(例如,在 后stty erase @
,bash 会将按下@
视为 BackSpace),但不会影响C-m
和C-j
提交当前行。
^[[D
是Esc [ 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 的开发人员)认为终端应该解释换页。该功能实际上来自行式打印机,最初很少在终端中找到,甚至在打印品种中也是如此。对于一些相关的讨论,请参阅我的笔记重新分页器和后续行动重用该功能。