使用 xmodmap 配置单独的键映射

使用 xmodmap 配置单独的键映射

我想重新映射我的 AltGR+Right_Windows 但我不知道如何做。无论我尝试什么,无论是否按下右 Alt 键,按右 Windows 键都会发出名称 keysym。

这些是我现在正在测试的 xmodmap 文件的内容。在我的键盘中,38 是“a”的键码,48 是撇号/双引号的键码,134 是右侧 Windows 键的键码。

keycode  38 = 1 2 3 4 5 6 7 8
keycode  48 = 1 2 3 4 5 6 7 8
keycode 134 = 1 2 3 4 5 6 7 8

当我按 Right_Alt+撇号时,它输出 5,但 Right_Alt+a 和 Right_Alt+Right_Windows 给出 1(无论是按下右 Alt 时还是不按下时),这不是我想要的。

我当前的键盘布局是us(alt-intl),右侧 alt 显然设置为充当 AltGr / Iso_Level3_Shift。的输出xmodmap -pm如下:

xmodmap:  up to 4 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock        Caps_Lock (0x42)
control     Control_L (0x25),  Control_R (0x69)
mod1        Alt_L (0x40),  Meta_L (0xcd)
mod2        Num_Lock (0x4d)
mod3      
mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce),  Hyper_L (0xcf)
mod5        ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)

答案1

使用 xmodmap 配置单独的键映射

是时候写下我自己的研究结果了。

我想我一定是错过了 xmodmap 中的一些东西,而且它没有很好的记录,人们很困惑。但事实证明,X.Org 关于 XKB 和 xmodmap 的设计是愚蠢的。

史诗般的失败:xmodmap

您可以使用 xmodmap 重新定义现有映射,只要这些映射实际存在于原始键盘布局中即可。在问题中描述的情况下,您无法扩展任何键的行为以使用 AltGr。您只能更改已使用 AltGr 的键码的 AltGr 键符号。

也可以看看:http://blog.azundris.com/archives/193-X-treme-pain-XKB-vs-XModMap.html

解决方法:Mode_switch

@Ned64 的答案中描述了此解决方法。您可以重新映射AltGrISO_Level3_ShiftMode_switch

我成功地使用以下命令行重新映射AltGr

xmodmap -e 'keycode 108 = Mode_switch'

xmodmap缺点是它会破坏您当前的键盘布局,但您可以使用@Ned64 已经提到的方法一一重新创建所有映射。

解决方法:修改键盘布局

我正在使用us(cz_sk_de)键盘布局,并尝试通过添加我想要扩展的键的配置来修改它。

key <AB08>  { [ comma, less, doublelowquotemark, leftdoublequotemark ] };
key <AB09>  { [ period, greater, ellipsis, rightdoublequotemark ] };

(在xkb_symbols "cz_sk_de"部分/usr/share/X11/xkb/symbols/us

只需重置键盘布局即可使用修改后的版本。

setxkbmap 'us(cz_sk_de)'

,现在,您可以 (1) 使用、.Shift和键的组合键入捷克语和英语引号和省略号,AltGr和/或 (2) 使用xmodmap已定义的键重新映射这些键。

主要缺点是setxkbmap似乎不支持键盘布局的任意位置,因此您需要写入系统配置而不是主目录。

结论

这似乎是 X.Org 过度设计和糟糕设计的一个例子,即使是像将键代码和修饰符组合映射到符号这样的微不足道的事情也会成为一个问题。这些工具似乎没有提供一种合理的方法来更改用户配置中的各个键映射而不产生任何副作用。

答案2

第一步:使 AltGr 可用

我发现 AltGr 修改的键仅适用于我的系统,如果我还将 AltGr-Key 重新映射到Mode_switch,如下所示:

xmodmap -e "keycode 108 = Mode_switch Mode_switch Mode_switch Mode_switch"

如果您有不同的键盘,您可能需要将其替换108为您的代码,请通过键入进行检查

xmodmap -pke | grep Alt_R

然后使用该号码。 (该密钥通常Alt_R在我知道的系统上调用。)

或者,如果 Alt_R 尚未分配给其他内容,这也可能有效:

xmodmap -e "keysym Alt_R = Mode_switch Mode_switch Mode_switch Mode_switch"

现在,您的 AltGr 修饰符将在修饰符列表中提供位置 3(Shift:4)。

第二步:根据需要分配键

您可以为键盘上的任意键指定 AltGr 变体。如果您现在有其他键与所需的代码不对应,则需要像其他键(您测试的键)一样重新分配这些键。

第三步:将其转换为脚本

现在只需执行xmodmap命令并将对默认键盘的所有(但仅)修改写入文件中 - 这比加载完整的键盘映射更快。每次登录后以及每当键盘映射被某个进程重置时启动此脚本一次。

多年来,我在 Solaris、IRIX 和 Linux 下对此进行了多次实验,据我所知,这是让 AltGr 工作的唯一解决方案 - 并且它对我来说已经工作了 20 多年。

答案3

显然,xmodmap 没有按应有的方式读取默认的 AltGR,它可能仅限于特定的键盘布局,也许都是非美国布局,无论哪种方式,真正的问题是,虽然您可以替换键盘布局,但有些人可能会这样做并不是真的想这样做,因为他们需要在他们习惯的布局上使用特殊字符(例如斯堪的纳维亚键盘布局,其中有 ðþæöáúíóåů 等字符),这对于其他键盘布局来说配置起来会很痛苦。

你可以运行

xmodmap -e "keycode 108 = Mode_switch"

要将 AltGR 重新绑定到 xmodmap 可以使用的东西,实际上,当您现在按 AltGR 时,将输出键盘的第三个分配,但是它将完全破坏原始键盘布局,因为 AltGR 按键绑定将不再与 AltGR 键一起使用。

我找到了两种解决方法,它们不会破坏我现有的键盘布局,并且不涉及切换布局,一种是将Mode_switch绑定到另一个按键上。

理想的键是 Super_R,它就在 AltGR 旁边,它的键码是 134。但是,并非所有键盘都有它们,在我的笔记本电脑上也没有它,所以我决定将其绑定到最后一个剩下的键我几乎从未使用过,Right Control。

xmodmap -e "keycode 105 = Mode_switch"

我有美式物理键盘布局,但有欧式布局配置,并且通常在此类键盘上的 Z 旁边缺少 less/greater/bar 键(也称为 ISO_Backslash,尽管 xmodmap 本身无法识别)。我将其绑定到 Menu (135),但它可以作为 R_Ctrl 和 Super_R 的替代品

我认为这是一个肮脏的修复。

第二个解决方法花了更长的时间才弄清楚。使用 sxhkd(xbindkeys 替代方案)

如果您将其添加到〜/.config/sxhkd/sxhkdrc:

~ISO_Level3_Shift
    xdotool key Mode_switch

你的 AltGR 将正常工作,但是当按下它时,Mode_switch 会被切换(有点像大写锁定,但对于 Mode_switch),并且任何使用它的 xmodmap 键都将被锁定到 AltGR 模式,直到你再次按下 AltGR 以取消切换它。制作一个脚本来在释放按键时自动取消切换它应该是一件简单的事情,但至少可以说,我这样做的尝试是相当有问题的。

相关内容