【发布时间】:2021-05-14 13:30:20
【问题描述】:
我的系统是 Ubuntu 20.04,它使用 /usr/share/X11/xkb/symbols 上的 XKB 布局文件。
我想在我自己的键盘布局中使用 Level5,以增加我可以在单一布局中键入的符号数量。
我自己的想法是将其用作替代大写系统(与 CapsLock 结合使用),并使用 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