为什么涉及AltGr的xmodmap绑定仅在某些键上起作用?


12

我想重新映射我的AltGR + Right_Windows,但是我不知道怎么做。不管我尝试什么,无论是否按右alt,按右Windows键都会发出名称keyym。

这些是我现在正在测试的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(这两种情况都在按下right alt时出现,而在没有按下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)

不知道到底发生了什么,但是如果您还没有这样做,则可能需要运行xev并按下各种组合键,以查看硬件以及Xwindows级别以下的按键是否开始。

我遇到了同样的问题。我想修改逗号和点,以也支持打印必须使用撰写键编写的捷克和英语双引号(“ /” /”)。我正在使用us(cz_sk_de)键盘布局和xmodmap。
帕维尔·希默达

所以现在怎么办?当另一个赏金很好地描述了这个问题时,浪费另一个赏金或开始一个新问题是不切实际的。它看起来像xorg中的错误,但我还没有找到任何参考。尽管被自动授予,但现有答案显然是错误的。
PavelŠimerda'9

我结束了并使用了我知道可以使用的不同键绑定:/我同意这看起来确实像个错误,但我不知道它与哪个系统有关,以及在哪里报告...
hugomg

Answers:


7

使用xmodmap配置单个键映射

现在该写下我自己的研究结果了。

我以为我一定错过了xmodmap中的某些内容,而且它没有很好的文档记录,人们感到困惑。但是事实证明,关于XKB和xmodmap的X.Org设计只是愚蠢的。

史诗失败:xmodmap

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

另请参阅:http : //blog.azundris.com/archives/193-X-treme-pain-XKB-vs-XModMap.html

解决方法:Mode_switch

@ Ned64的答案中描述了此解决方法。您可以AltGr从映射ISO_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)型捷克语和英语引号和使用的组合椭圆,.ShiftAltGr键和/或(2)重新映射使用这些密钥xmodmap,现在它们被定义。

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

结论

这似乎是X.Org设计过度和设计错误的一个例子,即使将键码和修饰符的组合映射到符号之类的琐碎事情也变成了问题。这些工具似乎没有提供一种合理的方法来仅更改用户配置中的各个键映射而没有任何副作用。


“您不能扩展任何键的行为以使用AltGr”-看起来这一直都是问题!谢谢。
hugomg

5

第一步:使AltGr可用

我发现,如果我也将AltGr-Key重新映射到Mode_switch,则AltGr修改的键仅在我的系统上有效,如下所示:

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-variant。如果您现在有其他键与所需的代码不对应,则需要像其他键(已测试的键)一样重新分配这些键。

第三步:将其转换为脚本

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

多年来,我已经在Solaris,IRIX和Linux上进行了很多试验,据我所知,这是使AltGr正常工作的唯一解决方案-它对我来说已经运行了20多年。


1
这样,右窗口键开始充当“ 3”而不是“ 1”。但是,现在所有现有的altgr修饰符都停止工作(我想它必须是“ 5”而不是“ 3”才能起作用?)
hugomg

感谢您尝试此操作。请张贴xmodmap -pm,并xmodmap -pke | grep -w SOMECHANGEDKEY在这种情况下,对于不工作了一把钥匙。
2016年

(然后,我们将需要xmodmap根据您的输出使用添加新的修饰符)
Ned64 '16

xmodmap -pke | grep Alt_R在我的系统上不返回任何结果。我的系统是具有Gentoo稳定功能的Lenovo ThinkPad X230。我也尝试了grep -i无济于事。
帕维尔·西默达

我尝试过,问题是来自us(cz_sk_de)我的重音字母停止为我工作。因此,此答案不适用于我,也不适用于其他许多人。
帕维尔·西默达

1

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

你可以跑

xmodmap -e "keycode 108 = Mode_switch"

要将AltGR重新绑定到xmodmap可以使用的功能,实际上,当您现在按AltGR时,将输出键盘的第3个分配,但是由于AltGR键绑定不再起作用,它将完全破坏原始键盘布局。

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

理想的键是Super_R,它紧靠AltGR,键码是134。但是,并不是所有的键盘都有它们,在我的笔记本电脑上,我也没有,所以我决定将它绑定到最后一个。我实际上从未使用过的剩余密钥,Right Control。

xmodmap -e "keycode 105 = Mode_switch"

我有美国的物理键盘布局,但欧洲的布局配置以及此类键盘上通常在Z旁边的小/大/竖杠键(也称为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才能取消切换。至少可以说,使脚本在释放键时自动取消切换是一件很简单的事情,但是我这样做的尝试是很麻烦的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.