如何使用 xmodmap 设置 AltGr 键

Nat*_*han 7 keyboard-layout xmodmap

我使用的是美国国际用“的AltGr死键”布局和选项开关AltWin按键。不错,但我的AltGr不起作用。我要使用的AltGr密钥具有密钥代码 134(使用 xev 发现)。所以我创建了一个 .Xmodmap 文件:

keycode 134 = ISO_Level3_Shift Multi_key ISO_Level3_Shift Multi_key
Run Code Online (Sandbox Code Playgroud)

比我执行“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)
Run Code Online (Sandbox Code Playgroud)

但是...按下AltGr(代码为 134=0x86 的键)+q不会给出预期的结果 - 这将是“a-umlaut”。这应该!xmodmap -pke 包含这一行:

keycode  24 = q Q q Q adiaeresis Adiaeresis adiaeresi
Run Code Online (Sandbox Code Playgroud)

那么出了什么问题,我该怎么办?

Aur*_*rch 5

根据Xmodmap 手册,当您想要交换或更改修饰键时,您需要删除并清除它们与原始键码和修饰符组的联系。然后在将它们分配给新的键码后,您还必须将它们分配给一个新的、唯一的组。

看起来问题在于您为同一个键分配了两个不同的修饰符:[ISO_Level3_shift] 和 [Mode_switch]。并且您还将它们分配到同一个修饰符组。将它们分配到同一组的效果是:按下其中一个,将它们激活/发送到系统。

[ISO_Level3_shift] 和 [Mode_switch] 不是同义词。这些键中的每一个都旨在提供对键盘唯一层/级别的访问。如果您的键盘支持它们,那么当按下它们时,它们可以访问更高的级别。

另一个潜在的问题是,在几乎所有系统上,Xmodmap 都运行在 xkb(它定义了底层虚拟键盘的某些方面)之上。

[Mode_switch] 与 Xmodmap 的 [AltGr] 同义,提供对级别 2 的访问-这将是您示例中的第二组 [q] 和 [Q]。而 [ISO_Level3_shift] 提供对第三级的访问 - 在您的示例中 [ä] 和 [Ä]。

但是由于在您的示例中两个键共享相同的修饰符组,因此它们都被按下,这可能是为了访问您的最高级别;但由于似乎有错误*,您可能没有得到任何输出,或者来自底层 xkb 的一些意外输出。

基本上你可以通过改变你的 .xmodmap 文件来解决这个问题。只需将 [Level3_shift] 和 [Mode_switch] 分配给单独的键和单独的修饰符组。或者,实际上我只是建议您完全删除对 Mode_switch 的引用。我发现它的行为很奇怪;第三级转换键似乎表现得更加一致和可靠。

*-您的第二个“adieresi”(原文如此)缺少最后的 [s],因此它不会产生任何字符。

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