4. X

X 环境下的情况并没有真正不同。只是多了一个不同的层级,即 X 窗口系统将扫描码转换为其自身的键符,这些键符比控制台的键符更加多样和精确,并将它们馈送到应用程序中(顺便说一句,这就是 XEmacs 没有受到这个问题困扰的原因:X 将键码 22 转换为键符 BackSpace,将键码 107 转换为键符 Delete,然后用户可以轻松地为这些键符分配所需的行为)。当然,终端模拟器程序(通常是 X 世界中的 VT100 模拟器)必须将 X 键符转换为 ASCII 序列,因此我们又回到了我们棘手的问题。

更详细地说,通常 xterm 的行为与控制台完全相同(即,它发出相同的 ASCII 序列),但是,例如,Red Hat <7.0 或 ≥7.1 中的 gnome-terminal退格键 发出 BS,为 删除键 发出 DEL。当您意识到默认情况下它们使用相同的终端数据库条目时,真正的乐趣就开始了,因此事实是kbs功能与 ASCII DEL 相关联,使得所有行为正确的应用程序在 gnome-terminal 中为 退格键删除键 产生相同的行为。 简单的语句
bash$ export TERM=gnome
可以在这种情况下为行为正确的应用程序解决问题。 但是,并非总是如此,因为您的系统可能缺少终端数据库中名为gnome的条目,特别是如果它不是最新的话。

无论如何,这并不总是解决方案:例如,如果您有 Red Hat 7.0 发行版,您的 gnome-terminal 的行为就像控制台一样。 但是请注意:如果您使用 Helix 发行版升级了桌面,那么您的 gnome-terminal 的行为将类似于 pre-7.0 Red Hat。

为了使接下来的讨论更容易,让我们将行为类似于控制台的 VT100 模拟器定义为标准,将为 退格键 发出 BS 并为 删除键 发出 DEL 的模拟器定义为异常[1] 因此,例如,xterm 在 Debian 发行版中一直是标准的,而它在 Red Hat 中在标准和异常之间切换了几次;gnome-terminal 的行为甚至更加不稳定。 有关如何将异常终端变成标准终端的信息,请参见第 8 节

注释

[1]

在评论本文档时,这些定义也被多次声明/质疑。 如果您对此主题有任何确定的信息,请写信给我。