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