我使用 us-intl,采用“AltGr dead keys”布局,并可以选择切换Alt和Win按键。不错,但我的AltGr不起作用。我想要使用的键AltGr有键码 134(使用 xev 找到)。所以我创建了一个 .Xmodmap 文件:
keycode 134 = ISO_Level3_Shift Multi_key ISO_Level3_Shift Multi_key
然后我执行“xmodmap .Xmodmap”。当我现在显示我的修饰符时,我得到:
> xmodmap
xmodmap: up to 4 keys per modifier, (keycodes in parentheses):
shift Shift_L (0x32), Shift_R (0x3e)
lock
control Control_L (0x25), Control_R (0x69)
mod1 Alt_L (0x85), Meta_L (0xcd)
mod2 Num_Lock (0x4d)
mod3
mod4 Super_L (0x40), Super_R (0x6c), Super_L (0xce), Hyper_L (0xcf)
mod5 ISO_Level3_Shift (0x5c), ISO_Level3_Shift (0x86), Mode_switch (0xcb)
但是...按下AltGr(代码为 134=0x86 的键)+q不会产生预期的结果 - 即“a-umlaut”。它应该!xmodmap -pke 包含此行:
keycode 24 = q Q q Q adiaeresis Adiaeresis adiaeresi
那么问题出在哪里?我该怎么办?
答案1
根据Xmodmap 手册,当您想要交换或更改修饰键时,您需要移除并清除它们与原始键码和修饰键组的关联。然后,在将它们分配给新键码后,您还必须将它们分配给新的唯一组。
问题似乎是您为同一个键分配了两个不同的修饰键:[ISO_Level3_shift] 和 [Mode_switch]。并且您还将它们分配到了同一个修饰键组。将它们分配到同一个组的效果是:按下其中一个,会激活/发送它们到系统。
[ISO_Level3_shift] 和 [Mode_switch] 不是同义词。每个键都用于访问键盘的一个独特层/级别。如果您的键盘支持这些键,当同时按下它们时,它们可以访问更高的级别。
另一个潜在的复杂因素是,几乎所有系统上 Xmodmap 都在 xkb(定义了底层虚拟键盘的某些方面)之上运行。
[Mode_switch] 与 [AltGr] 同义,用于 Xmodmap 提供对级别 2 的访问 - 即您示例中的第二组 [q] 和 [Q]。而 [ISO_Level3_shift] 提供对级别 3 的访问 - 即您示例中的 [ä] 和 [Ä]。
但是由于在您的示例中两个键共享相同的修饰符组,因此它们都被按下,这可能试图访问您的最高级别;但由于似乎存在错误*,您可能没有得到任何输出,或者来自底层 xkb 的一些意外输出。
基本上,您可以通过更改 .xmodmap 文件来修复此问题。只需将 [Level3_shift] 和 [Mode_switch] 分配给单独的键和单独的修饰符组即可。或者,实际上我建议您完全删除对 Mode_switch 的引用。我发现它的行为相当奇怪;第 3 级 Shift 键的行为似乎更加一致和可靠。
*- 你的第二个“adiaeresi”(原文如此)缺少最后的 [s],所以它不会产生任何字符。
我知道这很令人困惑和费解,而且没有明显的原因,而且这个帖子很旧。但希望有人会在某个时候发现我的解释有用!