我希望到目前为止基本问题已经很清楚了:键盘和控制台应用程序之间存在瓶颈,即它们只能通过 ASCII 序列进行通信。因此,特殊按键必须首先从 keysyms 转换为序列,然后再从序列转换为按键功能。由于不同的控制台对于这种转换的外观有不同的想法,我们需要一个终端数据库。系统本可以完美运行,但有一个小问题:它并非总是正确设置,而且并非所有人都在使用它。
应用程序必须有一种方法来知道要使用哪个数据库条目:这可以通过适当设置TERM环境变量来实现。在某些情况下,终端模拟器与由TERM.
此外,许多应用程序不使用终端数据库(或至少不完全使用),并且认为 BS 和 DEL 是具有预期含义的 ASCII 代码:因此,在不查看数据库的情况下,它们为它们分配语义(当然,通常语义是删除光标之前或之下的字符)。所以现在我们美好的方案完全崩溃了(正如每个 Linux 用户痛苦地意识到的那样)。例如,bash 假设 DEL 应该执行 backward-delete-char,即退格。因此,在全新安装的系统上,退格键在控制台上按预期工作,但这仅仅是因为连续两次的意外!当然,删除键不起作用。这是因为 bash 没有在终端数据库中查找kdch1功能。
为了说明事情变得多么复杂,请考虑 Red Hat 发行版(以及可能的其他发行版)提供的 fix_bs_and_del 脚本。它动态地将 BackSpace keysym 分配给 退格键,并将 Delete keysym 分配给 删除键。现在 shell 工作了!不幸的是,所有依赖 keysym 生成和终端数据库映射的正确耦合的程序现在都完全无法工作,因为 Delete keysym 被映射到 DEL,后者被映射到kbsterminfo 数据库的按键功能,因此在这些程序中,两个键都会产生退格效果。