【问题标题】:XKB mod3 keeps getting mapped to Mode_switch instead of ISO_Level5_ShiftXKB mod3 不断映射到 Mode_switch 而不是 ISO_Level5_Shift
【发布时间】:2021-05-14 13:30:20
【问题描述】:

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

(编辑:使用 xkbcomp 添加映射列表:)

$ xkbcomp $DISPLAY - > keyboard.xkb
$ grep modifier_map keyboard.xkb
    modifier_map Control { <LCTL> };
    modifier_map Shift { <LFSH> };
    modifier_map Shift { <RTSH> };
    modifier_map Mod1 { <LALT> };
    modifier_map Lock { <CAPS> };
    modifier_map Mod2 { <NMLK> };
    modifier_map Mod5 { <LVL3> };
    modifier_map Control { <RCTL> };
    modifier_map Mod4 { <LWIN> };
    modifier_map Mod4 { <RWIN> };
    modifier_map Mod3 { <MDSW> };
    modifier_map Mod1 { <META> };
    modifier_map Mod4 { <SUPR> };
    modifier_map Mod4 { <HYPR> };

我尝试了不同的技巧,但没有解决方案。这是我目前使用的(也就是说,我先选择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";
    };

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

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

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

【问题讨论】:

    标签: linux x11 keyboard-layout


    【解决方案1】:

    一些对我有用的建议:

    如果您要编写自己的 KYM_8_T1_LEVEL 类型,我建议您使用 Mod1、Mod2 ... 作为修饰符:

    modifiers= Shift+Mod3+Mod5;
        map[Shift]= Level2;
        map[Mod5]= Level3;
        map[Shift+Mod5]= Level4;
        map[Mod3]= Level5;
        map[Shift+Mod3]= Level6;
        map[Mod3+Mod5]= Level7;
        map[Shift+Mod3+Mod5]= Level8;
    

    关于您的修改器问题,将您的 xkb 配置转储到文件中:

    xkbcomp $DISPLAY - > keyboard.xkb
    

    打开它并向下滚动到修改器贴图部分。在键盘上不存在该键或您不希望该键充当修饰符的情况下,删除其中包含修饰符的每一行。然后根据自己的喜好编辑修饰符。我的目前看起来像这样:

    modifier_map Control { <LCTL> };
    modifier_map Control { <RCTL> };
    modifier_map Shift { <LFSH> };
    modifier_map Lock { <LFSH> };
    modifier_map Shift { <RTSH> };
    modifier_map Mod1 { <LALT> };
    modifier_map Mod1 { <RALT> };
    modifier_map Mod2 { <CAPS> };
    modifier_map Mod3 { <SCLK> };
    modifier_map Mod4 { <SUPR> };
    modifier_map Mod5 { <LWIN> };
    

    xmodmap 将我的活动修饰符显示为:

    $ xmodmap -pm
    xmodmap:  up to 2 keys per modifier, (keycodes in parentheses):
    
    shift       Shift_R (0x3e)
    lock        Shift_L (0x32)
    control     Control_L (0x25),  Control_R (0x69)
    mod1        Alt_L (0x40),  Alt_R (0x6c)
    mod2        Mode_switch (0x42)
    mod3        ISO_Level5_Shift (0x4e)
    mod4        Super_L (0xce)
    mod5        ISO_Level3_Shift (0x85)
    

    然后根据自己的喜好修改键绑定。我在发帖时的密钥 如下所示:

    key <AE01> {
        type[group1]= "GLEN_LEVEL",
        type[group2]= "FOUR_LEVEL",
        symbols[Group1]= [               1,          exclam,     onesuperior,    onesubscript,         onehalf,           U2153,      onequarter,           UFF11 ],
        symbols[Group2]= [               6,               7,               8,               9 ]
    };
    

    如果您将 Mode_switch 映射到一个键,您可以使用它在布局之间切换。如果我不使用 Mode_switch,则使用符号 [Group1] 中的键。如果我在我的电脑上按住 Mode_switch 键 ,则会显示 symbols[Group2] 中的符号。

    保存您的更改。然后将以下行添加到您的 .xinitrc 文件中,以便每次启动 X 时都会加载您的配置更改:

    # Set keymapping, compose key, and level 8 symbols
    if [ -s ~/keyboard.xkb ]; then
        xkbcomp keyboard.xkb $DISPLAY
    fi
    

    一旦你确信你已经解决了所有的错误,而不是每次都加载 keyboard.xkb,你可以通过 xkb 目录并编辑所有文件以匹配你的 keyboard.xkb 配置,这样你就没有按照您在本文中的要求加载单独的脚本。

    【讨论】:

      猜你喜欢
      • 2021-01-31
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      • 2020-09-28
      • 2019-04-03
      • 1970-01-01
      相关资源
      最近更新 更多