为什么不同的终端在 .inputrc 文件中的键值不同?

为什么不同的终端在 .inputrc 文件中的键值不同?

这个问题其实是从这里。我想知道为什么不同的终端(如 rxvt 和 xterm)在映射组合键时使用不同的值?当我在 rxvt 或 xterm 中时,如何找出按键序列的值并将其轻松添加到 .inputrc 文件中?

答案1

由于歇斯底里的历史原因。硬件制造商并不总是对同一键的通用单一控制序列进行标准化,当玻璃终端被终端仿真器取代时,软件编写者也没有标准化。

Ctrl您可以通过键入+V然后键入键(在大多数 shell 中,或在命令的输入中,例如cat或)来找出键在特定终端中生成的控制序列hexdump。大多数键都会生成一个控制序列,其中包含转义字符,后跟可打印字符; +导致CtrlV字面插入转义字符。

幸运的是,各个终端发送的控制序列之间几乎不存在冲突。主要的例外是一些终端发送^HforBackspace^?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字符可抑制下一个字符的解释,然后按特殊键。这允许终端驱动程序以可读形式回显字符。

为什么一种终端类型与另一种终端类型的不同之处不太为人所知。 xtermrxvt都是终端仿真器,名义上基于 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计划修改的键,例如,使用controlshift等。Rxvt 的开发人员选择rxvt使用不同的方案进行扩展最终的为特殊键发送的字符串上的字符。这是有问题的,因为它引入了与主机到终端功能不对应的密钥,并且不一定以传统的方式结束最终的字符($例如)。

在扩展中xterm,我选择添加编号键,使用shiftcontrol来扩展编号范围。这很有效,但后来提出了更好的方案(补丁 #94, 1999)由 Jeffrey Altman 编写,在最后一系列 DEC VTxxx 终端 (VT525) 中实现。将修饰符编码为数字,并作为范围到转义序列。几年后 (2002 年第 167 号补丁),有人指出了一个问题,这些问题可能会与其他主机到终端的转义混淆,我改变了方案来避免这个问题。

Konsole 和 VTE(GNOME 终端)的开发人员复制了 1999 年 xterm 中使用的方案,并且留下来xterm在那里,同时更新了终端描述。这导致了许多错误报告。

以供参考:

相关内容