Unix 终端发送低于 32 的 ASCII 代码来表示Ctrl+ 另一个键,并且至少有两种发送“meta”的方式(即,要么在代码 27 前加前缀,要么设置 ASCII 字符的高位)。有没有先例可以对其他修饰键的使用进行编码,例如“super”或 Windows 徽标键或 MacCmd键?
我想Cmd在 iTerm2 中映射 +arrow 键,但我不知道要为它们分配什么代码。我已经将Option“meta”键与箭头键一起使用了。
答案1
按下 meta 时设置第 8 位的惯例相当古老,现在已不怎么使用了,或者说在任何支持除 ASCII 之外的更多字符的现代终端中根本不使用。事实上,在 ESC 前面加上前缀的惯例在今天也不常见。
32 个 ASCII 控制字符确实是作为 ASCII 控制字符(代码点小于 32)发送的,但仅涵盖 Ctrl-@、Ctrl-A 到 Ctrl-Z、ESC、Ctrl-\、Ctrl-]、Ctrl-^ 和 Ctrl-_。其他任何字符(例如 Ctrl-4)在 ASCII 中都不存在,并且没有通过终端发送它的惯例。
基本上,底线是这样的:任何不能作为纯字符发送的内容(即在现代支持 Unicode 的终端中以 Unicode 形式存在的内容)都必须作为转义序列发送。转义序列由实际的终端仿真协议定义。当今使用的几乎所有终端仿真协议都源自或类似于 VT100,并且转义序列可用于键盘上不以字符形式存在的常用键:箭头键、功能键等...
VT100 和相关的终端仿真协议不包含用于传达修饰键按键的约定,甚至没有 Shift 和 Control 等标准按键。在 tty 上运行的软件无法区分 Enter 按键和 Shift-Enter 按键。它甚至无法区分 Enter 按键和 Control-M 按键。
这些修饰符序列无法通过终端传输,这可以算是一件好事。例如,MacOS 终端应用程序可以声明 ⌘V 按键供自己使用(粘贴),因为它无论如何都无法发送到 tty。