XKB mod3 不断映射到 Mode_switch 而不是 ISO_Level5_Shift

问题描述

我的系统是 Ubuntu 20.04,它在 /usr/share/X11/xkb/symbols 上使用 XKB 布局文件。

我想在我自己的键盘布局上使用 Level5,以增加我可以使用单一布局输入的符号数量。

我自己的想法是将其用作替代大写系统(与 Ca​​psLock 结合使用),并使用 Shift 替代字母的替代形式。

但是,当我使用该布局时,ISO_Level5_Shift 似乎不起作用。如以下 xmodmap 命令所示,它改为绑定到 Mode_switch

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

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

我尝试了不同的黑客,没有解决方案。这是我目前使用的一个(这意味着,我首先选择 LSGT 作为开关,然后交换 Left Shift 和 LSGT):

partial modifier_keys
xkb_symbols "e4_modifiers" {
    include "level5(lsgt_switch)"
    
    key <LSGT> {
        type[Group1] = "ONE_LEVEL",symbols[Group1] = [ Shift_L ]
    };

    key <LFSH> {
        type[Group1] = "ONE_LEVEL",symbols[Group1] = [ ISO_Level5_Shift ]
    };

};

这是我自己的布局文件的开始:

default partial alphanumeric_keys
xkb_symbols "e4" {
    include "us"
    include "level3(ralt_switch)"
    
    // changes to modifiers
    include "kyme4(e4_modifiers)"
    name[Group1] = "Kaymoskvan (E4)";

    key.type[Group1] = "KYM_8_T1";

为了让布局正常工作,我创建了一些自定义键类型:

partial default xkb_types "default" {
    virtual_modifiers LevelThree,LevelFive,Alt;

    type "KYM_8_T1" {
        modifiers = Shift+Lock+LevelThree+LevelFive+Control;
        
        map[None] = Level1;
        map[Shift] = Level2;
        map[LevelThree] = Level3;
        map[Shift+LevelThree] = Level4;
        map[Lock] = Level5;
        map[Lock+Shift] = Level6;
        map[Lock+LevelThree] = Level3;
        map[Lock+Shift+LevelThree] = Level4;
        map[LevelFive] = Level5;
        map[LevelFive+Shift] = Level6;
        map[LevelFive+LevelThree] = Level7;
        map[LevelFive+Shift+LevelThree] = Level8;
        map[LevelFive+Lock] = Level1;
        map[LevelFive+Shift+Lock] = Level2;
        map[LevelFive+LevelThree+Lock] = Level8;
        map[LevelFive+LevelThree+Shift+Lock] = Level7;

        map[Control] = Level7;
        preserve[Control] = Control;
        map[Control+Shift] = Level8;
        preserve[Control+Shift] = Control;
        map[Control+LevelFive] = Level8;
        preserve[Control+LevelFive] = Control;
        map[Control+Shift+LevelFive] = Level7;
        preserve[Control+Shift+LevelFive] = Control;

        level_name[Level1] = "Base";
        level_name[Level2] = "Shift";
        level_name[Level3] = "Alt";
        level_name[Level4] = "Shift Alt";
        level_name[Level5] = "Caps";
        level_name[Level6] = "Shift Caps";
        level_name[Level7] = "Ascii";
        level_name[Level8] = "Shift Ascii";
    };

Internet 上的人们建议我使用 xmodmap 重新映射修饰符,但它会将修饰符无限期地绑定到一个键,直到重新启动,我认为所有这些都太具有侵入性。我还有其他不使用 Level5 的布局,并且我用作修饰符的键绑定到其他东西。

对于多个组,它们不适用于单个布局文件。

有没有办法只使用 XKB 来解决这个问题?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)