xmodmap 问题和不一致,每个键超过 4 个替代符号

ori*_*ion 9 xorg xmodmap bugs

我试图让我的键盘更有用,并用于xmodmap将数学和希腊符号映射到mod3修饰符级别。大写锁定映射到mod3. 据我了解,8 行.Xmodmap工作如下:

[无], [shift], [mod3], [mod3+shift], [altgr], [altgr+shift], [altgr+mod3], [altgr+shift+m​​od3]

我使用了这个,并且大部分都有效。除了一些奇怪的现象。例如:

keycode  49 = backslash bar includes includedin infinity infinity EuroSign EuroSign
Run Code Online (Sandbox Code Playgroud)

这很好地产生了前四个条目,但随后它会循环(altgr+key=backshlash,而不是无穷大)。但是,如果我这样做

keycode  10 = backslash bar includes includedin infinity infinity EuroSign EuroSign
Run Code Online (Sandbox Code Playgroud)

它产生前四个条目无穷大,但没有显示欧元符号(我得到了includesincludedin而是)。请注意,我只是使用了不同的密钥,其他一切都相同!即使只有 6 个条目(以防 8 个出现解析问题),该特定键上也不会显示无穷大。

此外,我将希腊字母映射到第 3 和第 4 个条目(mod3 和 mod3+shift)。小写字母工作正常,但大写字母不适用于 Shift+m​​od3+S 和 Shift+m​​od3+W 和 Shift+m​​od3+X。这不是字体问题,当我使用这些组合时xev不显示任何事件。

条目是

keycode  39 = s S Greek_sigma   Greek_SIGMA   integral integral downarrow downarrow
Run Code Online (Sandbox Code Playgroud)

此外,最后两个条目大多不起作用。

更糟糕的是,一行变得特别混乱。我进入了

keycode  51 = zcaron Zcaron zcaron Zcaron dstroke Dstroke dstroke Dstroke
Run Code Online (Sandbox Code Playgroud)

但是当我这样做的时候xmodmap -pke我得到

keycode  51 = zcaron Zcaron zcaron Zcaron dstroke Dstroke dstroke Dstroke zcaron Zcaron dstroke Dstroke zcaron Zcaron dstroke Dstroke
Run Code Online (Sandbox Code Playgroud)

请注意,它复制了所有条目。有几个键可以做到这一点,但不是全部!

所以,我的问题是:

  • 我是否正确使用了 8 个条目的行?
  • 为什么我在不同的键码上得到不同数量的工作键符?
  • 窗口管理器中的某些东西是否有可能映射这些组合并吞下它们?
  • 为什么有些行在应用时会重复?
  • 这是一个不起眼的 xlib 错误吗?
  • 修改器功能是否受限?

请注意,我处于一种独特的情况,在这种情况下,根本不可能有任何我不知道的未知快捷方式,因为我的窗口管理器是我自己制作的,并且我可以控制所有这些快捷方式。

更多细节:大写锁定的映射是这样完成的:

keycode  66 = Mode_switch

clear lock
clear control
clear mod1
clear mod2
clear mod3
clear mod4
clear mod5
add control = Control_L Control_R
add mod1 = Alt_L Meta_L
add mod2 = Num_Lock
add mod3 = Mode_switch
add mod4 = Super_L Super_R Hyper_L
add mod5 = ISO_Level3_Shift
Run Code Online (Sandbox Code Playgroud)

该系统是一个新更新的arch linux。


编辑:我发现问题的一小部分(根本不起作用的 SWX)是由于键盘上的键相邻(键卡住,无法处理此组合中的 3 个同时按下的键) . 右移消除了 W 和 X 的问题,而不是 S(在这个特定的键盘上)。

其余的仍然是个谜,尤其是键代码 49 的第 5 和第 6 个损坏的条目(选项卡上方完全无用的东西)。

ori*_*ion 10

我最好回答我自己的问题以供将来参考。

经过一些深入的研究,我发现它xmodmap实际上已被弃用,并且大致修补了xkb键盘模型。该xkb模型不使用替代的线性数组,而是将布局拆分为groups,每个组有几个不同班次级别的字符。该xmodmap定义填充条目一个非常有趣的顺序:组1,1,2级,第2组,1,2-水平,组1,级别3 ....的基团意思是像“布局”,并且不通常使用修饰符访问但使用切换。例外是Mode_switch我使用的字符,但它只能访问组 2。

一切都很好,除了键有类型。每个键由布局定义为TWO_LEVELFOUR_LEVELFOUR_LEVEL_ALPHANUMERIC等等,并且每个级别可以具有不同的概念,其中改性剂映射到哪个水平。我假设的行为(8 个级别,所有组合)实际上LOCAL_EIGHT_LEVEL根本没有被布局使用。因此,在 keycode 的情况下51,默认值实际上是TWO_LEVEL,并xmodmap用 6 个键填充 3 个组,而不是将 6 个级别添加到第 1 个组。Mode_switch修改器未达到第三组。使用另一个键会导致不同的行为,因为预定义的类型不同。

与打印输出中的重复 by 一样xmodmap,我不确定到底发生了什么(我打印了xkb定义并且一切正常),但是当您从可变长度多维数组映射到单个数组时出现错误,我并不感到惊讶符号代码列表。无论如何,输出并不反映实际状态。

总之,xmodmap 是邪恶的。永远不要使用它。它的行为充其量是不稳定和不明确的。它没有做它所说的。制作自己的xkb地图。通过include-ing重用大部分布局并添加您需要的修改。

就我而言,解决方案是从希腊布局中导出第二组并在重要位置替换数学符号,并在第一组中进行一些修改。


大多数便宜的键盘在一次按下 3 个键时非常有限。这导致某些密钥出现不稳定且依赖于硬件的故障。我将尝试使用不同的修饰键(世界上最无用的键 - 菜单键,或类似无用的右键 Win 键),并可能购买更好的键盘。这两个问题的组合(被设计损坏的硬件 + 邪恶的欺骗性软件)造成了一种令人困惑的随机情况,起初让我无法将它们视为单独的问题。


阅读材料:

  • 我不会说 xmodmap 是邪恶的。它已经过时了。Xmodmap 处理起来要容易得多,但它也有局限性。我的建议是,如果 xmodmap 的功能足够,则使用它(特别是,如果您不想在不同的键组上使用不同的修饰符),并且如果您需要它的功能,则使用 XKB。 (5认同)
  • @Gilles 问题是您无法真正避免使用 `xkb`,因为您*开始*使用由 `xkb` 创建的布局(因此会烧毁关卡)。你可以使用 `xmodmap` 来简单地改变一个字符,或者交换两个......但是一旦你想添加任何东西,这不是一个好主意。我也认为 `xkb` 很困难:但如果你只是用 `xkbcomp` 修补现有布局,它的想法和难度与 `xmodmap` 相同。 (3认同)