使用 setxkbmap 或 xmodmap 为某些键设置 Hyper 和 Super 修饰符

Aro*_*olm 10 keyboard keyboard-layout xmodmap xkb setxkbmap

问题:我想修改/重新定义我的键盘布局 (pc105 se),这样当我使用 mod3 (super) 和 mod4 (hyper) 按下某些键时,会返回一个与平常不同的字符。

例如

正常按下时,键码 61 会产生“减号”(-),而当按下 shift 时会产生“下划线”(_)。当按下第一个修饰符组 (AltGr) 'dead_belowdot' 和 'dead_abovedot' 时(无/有移位)。

我想要的是左括号或右括号(不带/带移位),当我按下 Super(赢)键的同时按下键,以及 Hyper 键的斜杠/反斜杠(我已配置为大写锁定)。

我尝试将 a 添加.Xmodmap到我的主目录并xmodmap ~/.Xmodmap使用以下语法运行它

keycode 61 = minus underscore a b c d e f g h i j k l m n o p
Run Code Online (Sandbox Code Playgroud)

但是,这将导致 AltGr 导致 c/d,而 win/caps lock 仍然只导致 -/_

我也尝试过直接修改 /usr/share/X11/xkb/symbols/se 并尝试以下更改:

key <BKSL>  { [apostrophe, asterisk, acute, multiply], [a,b,c,d], [e,f,g,h], [i,j,k,l]};
Run Code Online (Sandbox Code Playgroud)

但所有发生的都是 ' * ´ × ' * ' * (分别用于普通、altgr、win 和大写锁定)。我也试过

key <BKSL>  { [apostrophe, asterisk, acute, multiply, a,b,c,d, e,f,g,h, i,j,k,l]};
Run Code Online (Sandbox Code Playgroud)

但是,只要指定的字段超过四个,它似乎就会完全破坏密钥,并且密钥将恢复为默认的 pc105(我们?)行为。

由于我没有在 stackoverflow、超级用户或谷歌上找到任何关于如何处理我的场景的信息,我在这里问。

这是我的 xmodmap -pm

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

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

Aro*_*olm 12

两年后,我终于可以自豪地回答我自己的问题了。

我发现最简单、最可靠和最可扩展的方法是完全依赖xmodmap.

1. 获取特殊键的键码

运行xev以确定您希望用作模式切换器的键的​​键代码。然后按您感兴趣的键并记下keycode

$ xev
KeyRelease event, serial 40, synthetic NO, window 0x2600001,
    root 0x2a6, subw 0x0, time 1221887800, (885,743), root:(3447,805),
    state 0x2010, keycode 66 (keysym 0xff7e, Mode_switch), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False
Run Code Online (Sandbox Code Playgroud)

键码在第三行,键码 66。

对我来说,这些是我特别感兴趣的键,以及它们对应的键码:

  • Caps Lock, 键码 66
  • Pause|Break, 键码 128
  • Left Windows key, 键码 133
  • Num Lock, 键码 77

2. 设置切换键

这是我选择的设置,但您可以选择自己的设置。我已将其保存到文件中$HOME/.xmodmap

~/.xmodmap
keycode  66 = Mode_switch
keycode 127 = Multi_key
keycode 133 = Super_L
...
Run Code Online (Sandbox Code Playgroud)

这样我就绑定Caps LockMode_switch, Pause BreaktoCompose和左键WinSuper_L. 该Compose键特别有用,因为它允许将两个键组合为连字。例如,Compose后跟TM导致商标符号

3. 获取当前的键盘映射绑定 xmodmap

为了不破坏我的键盘布局,我想让我的按键尽可能接近我的原始布局。为了做到这一点,我打印了当前的键盘映射并查找了我想要更改的键码。

$ xmodmap -pke | ag 'keycode  51' 
Run Code Online (Sandbox Code Playgroud)

当然,您也可以轻松使用grepack,具体取决于您喜欢使用的工具。

$ xmodmap -pke | grep 'keycode  41' 
$ xmodmap -pke | ack 'keycode  31' 
Run Code Online (Sandbox Code Playgroud)

此输出的格式与您在~/.xmodmap这样的格式中指定的格式相同:

keycode  31 = i I i I rightarrow idotless rightarrow idotless i I rightarrow idotless i I rightarrow idotless
Run Code Online (Sandbox Code Playgroud)

4. 备份您现有的 xmodmap

以防万一出现问题,让您的当前xmodmap可用轻松回退绝不是一个坏主意。

$ xmodmap -pke > ~/.xmodmap.bak
Run Code Online (Sandbox Code Playgroud)

5. 将字符添加到您的钥匙的第 2、3、4 级

据我了解,.xmodmap文件的格式是这样的:

keycode <keycode> = <1st level> <Shift+1st> <2nd level> <shift+2nd> <3rd level> <shift+3rd level> <4th level> <shift+4th> ...
Run Code Online (Sandbox Code Playgroud)

现在,我不了解所有这些级别,但是Mode_SwitchCaps Lock在我的情况下)会给你 2 级并Alt Gr给我 3 级,这几乎是我感兴趣的全部,所以我保留了该行的其余部分,因为它在我的~/.xmodmap.bak并且只是将第 3、4、5 和 6 列(第 2 和第 3 级,加上移位)更改为有效字符(有关有效字符列表,请参见此处)。

~/.xmodmap
...
keycode  51 = apostrophe asterisk dollar ampersand acute multiply acute multiply apostrophe asterisk acute multiply apostrophe asterisk acute multiply
keycode  59 = comma semicolon parenleft parenright dead_cedilla dead_ogonek dead_cedilla dead_ogonek comma semicolon dead_cedilla dead_ogonek comma semicolon dead_cedilla dead_ogonek
keycode  60 = period colon bracketleft bracketright periodcentered dead_abovedot periodcentered dead_abovedot period colon periodcentered dead_abovedot period colon periodcentered dead_abovedot
keycode  61 = minus underscore braceleft braceright slash backslash braceleft braceright
keycode  65 = space space space space space underscore space space
...
Run Code Online (Sandbox Code Playgroud)

6. 测试你的 .xmodmap

现在让我们xmodmap执行.xmodmap并测试您全新的键盘布局。

$ xmodmap /home/user/.xmodmap
Run Code Online (Sandbox Code Playgroud)

7. 确保你的键盘布局在 x init 上加载

我将此添加到我的$HOME/.xinitrc

~/.xinitrc
...
[-f $HOME/.xmodmap] && xmodmap $HOME/.xmodmap
...
Run Code Online (Sandbox Code Playgroud)

我希望这可以帮到你!