如何使用 xmodmap 设置 AltGr 键

如何使用 xmodmap 设置 AltGr 键

我使用 us-intl,采用“AltGr dead keys”布局,并可以选择切换AltWin按键。不错,但我的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],所以它不会产生任何字符。

我知道这很令人困惑和费解,而且没有明显的原因,而且这个帖子很旧。但希望有人会在某个时候发现我的解释有用!

相关内容