我想为我的键盘布局添加更多级别,因此我决定启用 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。