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

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

问题:我想修改/重新定义我的键盘布局(pc105 se),以便当我按下带有 mod3(super)和 mod4(hyper)的某些键时,返回与平常不同的字符。

例如

键码 61 在正常按下时产生“减号”(-),在按住 Shift 键时产生“下划线”(_)。在按住第一个修饰键组 (AltGr) 时产生“dead_belowdot”和“dead_abovedot”(不使用/使用 Shift)。

我想要的是,当我按下该键并且同时按下 Super(win)键时,出现左括号或右括号(不带/带 shift),以及 Hyper 键(我已将其配置为 Caps Lock)的斜线/反斜线。

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

keycode 61 = minus underscore a b c d e f g h i j k l m n o p

但是,这将导致 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]};

但发生的只是 ' * ´ × ' * ' * (分别表示 normal、altgr、win 和 caps lock)。我也试过

key <BKSL>  { [apostrophe, asterisk, acute, multiply, a,b,c,d, e,f,g,h, i,j,k,l]};

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

由于我在 stackoverflow、superuser 或 google 上都找不到关于如何处理我的情况的任何信息,所以我在这里询问。

这是我的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)

答案1

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

我发现最简单、最可靠、最可扩展的方法是完全依靠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

键码在第三行,键码 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
...

这样,我就将 绑定Caps LockMode_switchPause BreakCompose左键WinSuper_LCompose键特别有用,因为它允许将两个键组合起来进行连字符。例如,Compose后跟TM会得到商标符号

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

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

$ xmodmap -pke | ag 'keycode  51' 

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

$ xmodmap -pke | grep 'keycode  41' 
$ xmodmap -pke | ack 'keycode  31' 

其输出格式与您指定的格式相同,~/.xmodmap如下所示:

keycode  31 = i I i I rightarrow idotless rightarrow idotless i I rightarrow idotless i I rightarrow idotless

4. 备份现有xmodmap

为了防止出现问题,保持当前xmodmap可用状态并能轻松恢复永远不是一个坏主意。

$ xmodmap -pke > ~/.xmodmap.bak

5. 为键盘的第 2、3、4 级添加字符

据我了解,该.xmodmap文件的格式如下:

keycode <keycode> = <1st level> <Shift+1st> <2nd level> <shift+2nd> <3rd level> <shift+3rd level> <4th level> <shift+4th> ...

现在,我不明白所有这些级别,但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
...

6. 测试你的.xmodmap

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

$ xmodmap /home/user/.xmodmap

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

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

~/.xinitrc
...
[-f $HOME/.xmodmap] && xmodmap $HOME/.xmodmap
...

我希望这可以帮到你!

相关内容