问题描述
我想知道为什么 Shift
+ Arrow Key
会导致 A
、 B
、 C
或 D
字母之一。
为什么不是其他字母?为什么要写信?
最佳办法
诸如 gnome-terminal
(Ubuntu 中的 “Terminal”)之类的终端仿真器以及 xterm
和 urxvt
都被命名为 “emulators”,因为它们再现了旧终端的行为,而旧终端是计算机的唯一显示器。此类终端使用基于文本的协议与计算机通信,最初设计为仅接收文本。很快,需要更多控制:如何擦除一条线?使用颜色?或者改变光标位置?
\n来源:The Art of Unix Usability – Command-Line Interfaces
为每个终端设计了转义序列来执行此类操作。它们被命名为转义,因为它们以 ASCII 转义码开头: 33
。没有办法直接打印这样的字符,这使得它非常适合这样的序列。当我们仍然想显示这个字符时,使用 ^[[
,这就是我将在我的解释中使用的。
当终端收到 ^[[A
时,并不是“打印 ^[[A”,而是“用户按下了 up-arrow 键”。这里的 “A” 完全是任意的:它恰好是每个人都同意的字母,因为这是 DEC VT-52 及其继任者流行的 VT-100 终端所使用的。
资料来源:DEC VT-52 维护手册 1976
这仍然是终端模拟器今天的工作方式:根据 $TERM
变量,名为 terminfo
的数据库负责说明应该将哪些代码发送到 shell(bash、sh、zsh…),然后由后者负责理解它们并对他们做出反应。
现在, Shift
+ up
的代码恰好是 ^[[1;2A
:终端仿真器将此代码发送到 shell 程序, shell 程序尝试解释 ^[[1;2
但不显示任何内容,因为它不知道该转义序列。但是 A
被留下并显示。