如何使 ISO_Level5_Shift 工作?

如何使 ISO_Level5_Shift 工作?

我想为我的键盘布局添加更多级别,因此我决定启用 level5 键。我已经在 上设置了 level3 Menu,并且希望将 RAlt 映射到 ISO_Level5_Shift。

但是,setxkbmap没有选择。/usr/share/X11/xkb/rules/evdev.lst仅包含以下有关 lv5 开关的选项:

lv5:lsgt_switch_lock
lv5:ralt_switch_lock
lv5:lwin_switch_lock
lv5:rwin_switch_lock

好像映射一个简单的键是不可能的。这已经暗示了麻烦。了解setxkbmap内部的作用后,很容易构造一个选项来启用 lv5 开关并将其设置为 right Alt

-option "lv5:ralt_switch"

而且,尽管setxkbmap采用此选项并成功返回,但没有映射。


找到类似问题的答案后这里我构建了一个自定义xkbcomp文件。

xkb_keymap {

    xkb_geometry {
        include "pc(pc104)"
    };


    xkb_keycodes {
        include "evdev"
        include "aliases(qwerty)"
    };


    xkb_types {
        include "complete"
    };


    xkb_compatibility {
        include "complete"
        include "ledscroll(group_lock)"
    };


    xkb_symbols {
        include "pc+us+ru:2+inet(evdev)"
        include "group(rctrl_rshift_toggle)"
        include "ctrl(swapcaps)"
        include "keypad(oss)"
        include "kpdl(dot)"
        include "terminate(ctrl_alt_bksp)"
        include "level3(modifier_mapping)"
        include "level3(menu_switch)"
        include "level5(modifier_mapping)"
        include "level5(ralt_switch)"

        key <AB06> {
            type= "EIGHT_LEVEL",
            symbols[Group1]= [               n,               N, n, n, u, i, o, p ],
            symbols[Group2]= [     Cyrillic_te,     Cyrillic_TE, n, n, u, i, o, p ]
        };

    };


};

这应该将菜单键指定为 ISO_Level3_Shift,将 RAlt 指定为 ISO_Level5_Shift。并且按键已分配,但出现错误:

$ xkbcomp  ~/new.xkbcomp.xkb :0
Error:            Key <MDSW> added to map for multiple modifiers
                  Using Mod3, ignoring Mod5.

xkbcomp尽管出现错误,但仍返回代码 0。

键上的映射N应使级别 5 到 8“u”、“i”、“o”和“p”,但 RAlt 在所有八个级别上发送通常的 n 和 N(如果级别 >4 实际工作)。

在尝试确定如何解决此错误时,我发现该错误<MDSW>是在“pc”的规则文件中设置的。

/usr/share/X11/xkb/symbols/pc:

xkb_symbols "pc105" {
    // Fake keys for virtual<->real modifiers mapping:
    key <LVL3> {    [ ISO_Level3_Shift  ]   };
    key <MDSW> {    [ Mode_switch       ]   };
    modifier_map Mod5   { <LVL3>, <MDSW> };
};

这是另一个奇怪的事情:我包括 pc104 键盘型号,但此代码引用 pc105 并且根本不应该来源。然而……xkb_symbols "pc104"却无处可寻。这个“symbols/pc”文件是/usr/share/X11/xkb/其中设置或修改<MDSW>Mod* 键分配的唯一其他文件。另一个文件是“symbols/level5”文件,它在xkb_symbols "modifier_mapping".

// Ensure a mapping to a real modifier for LevelFive.
partial modifier_keys
xkb_symbols "modifier_mapping" {
  replace key <MDSW> {
    type[Group1] = "ONE_LEVEL",
    symbols[Group1] = [ ISO_Level5_Shift ]
  };
  modifier_map Mod3 { <MDSW> };
};

我认为,这种冲突可能会阻止 lv3 交换机和 lv5 交换机同时工作,但我不确定。令人担忧的是,在另一个答案Mode_switch键存在于 Mod* 键中,加载我的键后,new.xkbcomp.xkb我在任何地方都看不到它:

$  xmodmap -pm
xmodmap:  up to 4 keys per modifier, (keycodes in parentheses):

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

答案1

这是我将 ISO_Level5_Shift 放在 Control_R 上的工作解决方案。您需要应用相同的逻辑。

  • 运行xev以查找要与 ISO_Level5_Shift 关联的按键的键码。将鼠标光标移到窗口中的小恐慌上,按下某个键即可在输出中查看其键码。就我而言,代码是 105。
  • 第二,我跑了xmodmap。我看到 Control_R 与 mod4 相关联。
  • 所以我就xmodmap -e "clear mod4释放了钥匙。请注意,它会释放所有键,因此您可能需要在需要时将其他键重新关联起来。
  • 然后xmodmap -e "keycode 105 = ISO_Level5_Shift"将 Control_R 与修饰符关联起来。
  • 最后,xmodmap -e "add mod3 = ISO_Level5_Shift"启用级别 5。

相关内容