为什么快捷键 Ctrl + A 会跳转到终端中的行首?

为什么快捷键 Ctrl + A 会跳转到终端中的行首?

就像跳转到行尾是Ctrl+ E,其中E可以认为是结束,为什么它使用 跳转到开头A

答案1

这个问题有两个方面,技术方面和历史方面。

技术答案是因为bash使用GNU 阅读线。在readlineControl-a 绑定到函数 中beginning-of-line,您可以通过以下方式显示:

$ bind -q beginning-of-line
beginning-of-line can be invoked via "\C-a", "\M-OH", "\M-[1~", "\M-[7~", "\M-[H".

其中\C-a表示“Control-a”。 bind -p将显示所有绑定(请小心使用bind,如果您不小心提供其他选项或参数,很容易损坏键盘)。

上面的一些绑定是默认添加的,其他绑定是我.inputrc为我使用过的各种终端添加的(通过 )。从 bash-2.0 开始,如果终端 termcap 包含功能kh,则kHHomeEnd被设置为beginning-of-lineend-of-line。和bash都是readline切特·雷米,一名 Emacs 用户,也是ceEmacs 克隆版的开发者。


(请注意,本文试图总结几十年前的多年历史,并掩盖一些细节。)

现在,为什么特别是 Control-a?阅读线默认使用类似 Emacs 的绑定。 GNU Emacs 中的 Control-a 调用move-beginning-of-line,我们现在认为它是“home”函数。

Stallman and Steel 最初的 EMACS受到弗雷德·赖特 (Fred Wright) 的启发编辑(早期的所见即所得编辑器)和东元(一种神秘的模态编辑器/语言)——EMACS 是一种宏集对于东元来说。看必需E[PDF](来自,1980)。然而,E 使用 Control-Form 来表示“行的开头”,这是在“DataDisc”键盘上,该键盘有一个Control键和一个Form键。这太空学员键盘的时间(Home顺便说一句,缺少钥匙,尽管它有一个End被普遍指责用于 Emacs 键盘界面。

EMACS 的理想功能之一是它使用 TECO 的 Control-R“实时”行编辑模式(TECO 早于 CRT/键盘终端),您可以在 MIT AI Lab 1978 ITS 第 6 页上看到按键绑定EMACS 编辑器简介[扫描的 PDF],其中 ┌ 用于表示控制。在这种模式下,按键绑定都是控制序列,主要是助记符:Control-E此行结束, 控制-P移至上一行, 控制-N移至下一行, 控制-B向后一个字符,尤其是 Control-A移至该行的开头科斯塔斯为此提出的“字母表的第一个字母”的建议是最好的。

(类似的键绑定位于tvlib宏包其目的是使 EMACS 的行为类似于 TVEDIT 编辑器,将控件 A 和 E 绑定到后退和前进句子,但对行的开头和结尾使用了不同的序列。)

“^R 模式”中的 Control-A/Control-E 绑定直接在 ITS TECO 中实现(1983 年,版本 1208,请参阅_teco_.tgz位于nocrew PDP10/ITS网站,或在吉图布),尽管我无法更准确地确定它们第一次出现的时间,并且 TECO 来源也没有说明为什么选择任何特定的绑定。上面的 1978 MIT EMACS 文件暗示 1978 年 EMACS 并没有使用 TECO 原生 Control-A/Control-E,它是可能的认为scrlin宏包(屏幕线)实现了这些。

回顾一下:

  • bash 使用 readline
  • readline 键绑定遵循 Emacs/EMACS
  • 原版EMACS与东元共同打造,继承了许多特性
  • TECO 的交互模式宏(大部分)使用助记符控制键绑定,“行首”最终分配给 Control-A

也可以看看:

答案2

因为理查德·斯托曼喜欢Emacs

Ctrl+a在 Emacs 中跳转到行首,libreadline 使用与 Emacs 相同的键绑定。 Bash 使用 libreadline。

答案3

选择字母“a”是因为 Control+b 和 Control+s 已经被采用,所以他们决定因为 A 是拉丁字母表的第一个字母,所以他们将使用它。我怎么知道?因为我今天从东元(EMACS的前身)和EMACS的开发者之一那里得到了答案。

相关内容