在 Konsole 密钥表中模拟 VT220 转义序列

net*_*haw 5 linux kde terminal konsole plasma5

经过一番徒劳的黑客攻击后,我意识到. . . 我需要正确映射 HHK 键盘,以便我可以使用各种元键。就这样开始了我堕入地狱的过程。

Doug Palmer,不可靠的 XKB 配置指南

我试图将 Konsole 配置为在启用应用程序键盘模式时(例如,通过echoti smkx)从数字键盘发出 VT220 样式的转义序列。特别是,以下控制序列应该是所描述条件下的输出:

http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-VT220-Style-Function-Keys

必须注意,修改TERM环境变量与就终端功能对 shell 撒谎是一样的,通常应该避免。简单的设置TERM=xterm-vt220是不够的,会导致意外的行为。

我有一个简单但部分的解决方案。Konsole 允许以.keytab文件的形式配置其终端键绑定。以下添加是有效的,保存到.local/share/konsole/VT220.keytab

keyboard "VT220"
key 0+KeyPad+AppCursorKeys : "\EOp"
key 1+KeyPad+AppCursorKeys : "\EOq"
key 2+KeyPad+AppCursorKeys : "\EOr"
key 3+KeyPad+AppCursorKeys : "\EOs"
key 4+KeyPad+AppCursorKeys : "\EOt"
key 5+KeyPad+AppCursorKeys : "\EOu"
key 6+KeyPad+AppCursorKeys : "\EOv"
key 7+KeyPad+AppCursorKeys : "\EOw"
key 8+KeyPad+AppCursorKeys : "\EOx"
key 9+KeyPad+AppCursorKeys : "\EOy"
key ++KeyPad+AppCursorKeys : "\EOk"
key *+KeyPad+AppCursorKeys : "\EOj"
key .+KeyPad+AppCursorKeys : "\EOn"
key -+KeyPad+AppCursorKeys : "\EOm"
key Enter+KeyPad : "\EOM"
Run Code Online (Sandbox Code Playgroud)

应用这些键绑定(以及可能存在的任何其他键绑定)后,konsole将发出与xterm启用应用程序键盘模式和 NumLock 时相同的控制序列。这些序列对于需要 VT220 仿真的应用程序非常有用,因为它们唯一地标识数字键盘上的击键,从而可以将任意功能绑定到它们。

我的配置中缺少一个常用的键盘键:/(Qt::Key_Slash)。Konsole 图形键绑定编辑器似乎无法识别对该键的任何引用,无论是按名称还是表示为文字。如果是手动写入.keytab文件,Konsole 将忽略它并且该行不会出现在 GUI 编辑器中。这在我的键盘上留下了一个非常烦人的漏洞,其中只有一个键顽固地无法编程。

我宁愿不xkb和朋友们混在一起;但是当然,vanillaxterm可以开箱即用地完成所有这些工作,这表明在这种情况下没有必要在如此低的级别上摆弄键绑定。相反,Konsole(或 QT)似乎正在 X 之上做一些独特而雪花的事情。

问题:是否可以在 Konsole 中将数字键盘的/键重新绑定到不同的控制序列?或者,这是点东西,在不同级别上运行(如terminfoxkbxterm-keystmux)会更有效?也许,我疯了吗?

其他勇敢的控制台指挥官的任何见解将不胜感激。

Tho*_*key 3

Konsole 会忽略这一点,因为它依赖于无法映射的硬编码键列表

// 覆盖以下任何快捷方式,因为
// 终端需要它们
int keyCode = keyEvent->key() | int keyCode = keyEvent->key() | 修饰符;
开关(键码){
    // 列表取自 QLineEdit::event() 代码
案例 Qt::Key_Tab:
案例Qt::Key_Delete:
案例 Qt::Key_Home:
案例 Qt::Key_End:
案例 Qt::Key_Backspace:
案例 Qt::Key_Left:
案例 Qt::Key_Right:
案例 Qt::Key_Slash:
案例 Qt::Key_Period:
案例Qt::Key_Space:
    keyEvent->accept();
    返回真;
}
返回假;

  • X11为主键盘和小键盘提供了不同的事件。在检查源代码之前,我查看了 Qt 的头文件,发现它(显然)没有做出这种区分(令人费解,因为我似乎记得 Windows 也做出了这种区分......)。 (2认同)