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

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

我试图让我的键盘更有用,并用于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

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

keycode  10 = backslash bar includes includedin infinity infinity EuroSign EuroSign

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

此外,我将希腊字母映射到第三个和第四个条目(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

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

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

keycode  51 = zcaron Zcaron zcaron Zcaron dstroke Dstroke dstroke Dstroke

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

keycode  51 = zcaron Zcaron zcaron Zcaron dstroke Dstroke dstroke Dstroke zcaron Zcaron dstroke Dstroke zcaron Zcaron dstroke Dstroke

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

所以,我的问题是:

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

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

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

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

该系统是新更新的arch linux。


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

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

答案1

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

经过一番深入研究后,我发现它xmodmap实际上已被弃用,并在键盘模型上进行了粗略的修补xkb。该xkb模型不使用替代方案的线性数组,而是将布局拆分为groups,每个组都有几个处于不同班次级别的字符。这些xmodmap定义以非常有趣的顺序填充条目:组 1、级别 1,2、组 2、级别 1,2、组 1、级别 3....这些组的含义类似于“布局”,但并非如此通常使用修饰符但可以切换来访问。我使用的字符是个例外Mode_switch,但它只能访问组 2。

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

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

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

就我而言,解决方案是从希腊布局派生第二组,并在战略位置替换数学符号,并对第一组进行一些修改。


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


阅读材料:

相关内容