这个问题其实是从这里。我想知道为什么不同的终端(如 rxvt 和 xterm)在映射组合键时使用不同的值?当我在 rxvt 或 xterm 中时,如何找出按键序列的值并将其轻松添加到 .inputrc 文件中?
答案1
由于歇斯底里的历史原因。硬件制造商并不总是对同一键的通用单一控制序列进行标准化,当玻璃终端被终端仿真器取代时,软件编写者也没有标准化。
Ctrl您可以通过键入+V然后键入键(在大多数 shell 中,或在命令的输入中,例如cat
或)来找出键在特定终端中生成的控制序列hexdump
。大多数键都会生成一个控制序列,其中包含转义字符,后跟可打印字符; +导致Ctrl按V字面插入转义字符。
幸运的是,各个终端发送的控制序列之间几乎不存在冲突。主要的例外是一些终端发送^H
forBackspace和^?
forDelete而其他终端发送^?
forBackspace和^[[3~
for Delete。许多终端都可以选择在两种退格/删除模式之间切换。
答案2
吉尔斯说的话。至于所提到的特定情况,VT100 和 VT220 终端(这是当今的终端模拟器试图模拟的)没有用于修饰符 + 箭头键组合的键码,因此模拟器引入了自己的键码。
不确定为什么 xterm 和 rxvt 有不同的,但也许它们是同时独立引入的。实际上 xterm 最初使用的代码比现在更短,但这些代码引起了问题,因此最终被更改。
如今,大多数终端模拟器,特别是用于各种桌面环境(包括 OS X)的终端模拟器,都尝试模拟 xterm。不过,Rxvt-unicode 仍然继承了 rxvt 的传统。
答案3
感兴趣的键.inputrc
通常是控制字符,特别是以逃脱字符,通常显示为^[
, ,也可以显示\e
, \E
,\033
等。
怎么找键盘发送的键是众所周知的:使用lnext
(literal-next) 字符(通常是^V
)。按该lnext
字符可抑制下一个字符的解释,然后按特殊键。这允许终端驱动程序以可读形式回显字符。
为什么一种终端类型与另一种终端类型的不同之处不太为人所知。 xterm
和rxvt
都是终端仿真器,名义上基于 DEC(数字设备)的同一系列硬件终端。 20 世纪 70 年代和 80 年代还生产了许多其他类型的硬件终端,但 VT100 及其后代是最受欢迎的。
人们普遍认为,VT100 没有功能键。它的键盘与 IBM PC 键盘的数字键盘大小差不多。最上面一行标记为 PF1 到 PF4。通常的概念是功能键位于该区域之外的键盘的其他区域中,例如,主 QWERTY 键盘顶部或左侧的一组编号键。
VT220 扩展了 VT100 的设计,添加了编号功能键 F6 至 F20。它确实有F1-F5,但这些用于本地功能,通常不能用于编程。对编程有用的发送由 DEC 分配的转义序列。尽管发送的转义序列有一些标准化到终端(ECMA-48),发送的序列从来没有相应的标准从一个终端。只有约定,并且与主机到终端功能“相同”的特殊键应该发送相同的转义序列。如果终端设置为本地回显模式,这尤其有帮助。
当 xterm 在 20 世纪 80 年代末或 90 年代初首次开发时,有人扩展了 VT220 功能键的概念,为 F1-F5 分配了类似的转义序列。 F21-F24 键的分配稍后出现(在2002年),使用类似的方案。
20世纪90年代中期,并没有明确的xterm
计划修改的键,例如,使用control、shift等。Rxvt 的开发人员选择rxvt
使用不同的方案进行扩展最终的为特殊键发送的字符串上的字符。这是有问题的,因为它引入了与主机到终端功能不对应的密钥,并且不一定以传统的方式结束最终的字符($
例如)。
在扩展中xterm
,我选择添加编号键,使用shift和control来扩展编号范围。这很有效,但后来提出了更好的方案(补丁 #94, 1999)由 Jeffrey Altman 编写,在最后一系列 DEC VTxxx 终端 (VT525) 中实现。将修饰符编码为数字,并作为范围到转义序列。几年后 (2002 年第 167 号补丁),有人指出了一个问题,这些问题可能会与其他主机到终端的转义混淆,我改变了方案来避免这个问题。
Konsole 和 VTE(GNOME 终端)的开发人员复制了 1999 年 xterm 中使用的方案,并且留下来xterm
在那里,同时更新了终端描述。这导致了许多错误报告。
以供参考: