我使用以下方式修改了键盘布局xkb
:
- CapsLock 键已被重新分配为 Control_L。
replace key <CAPS> { [ Control_L ] };
modifier_map Control { <CAPS> };
- 左控制键 (<LCTL>) 已被重新分配为 3 级修饰符 (ISO_Level3_Shift)。
replace key <LCTL> {
type[Group1] = "ONE_LEVEL",
symbols[Group1] = [ ISO_Level3_Shift ]
};
include "level3(modifier_mapping)"
- 数字 2 键 (<AE02>) 的 3 级已分配给符号 F2。
key <AE02> {[2, at, F2]};
问题:
按下LCtrl+2
键盘上的 时,xev
显示F2
正在注册该键符号。此外,Alt+F2
已分配在 gnome 的键盘快捷键设置中打开迷你命令提示符。当我按下F2
键盘上的实际键时,此快捷键有效。但它确实不是与之合作Alt+LCtrl+2
,这是应该的。
我可以说 gnome 快捷方式确实部分识别了这些 xkb 更改,因为它CapsLock+Alt+t
会打开终端。目前似乎只有具有 3 级修饰符的快捷方式有问题。
另一个例子:
;
我已为PgDown
(或)分配了 3 级符号Next
。
Super+PgDown
应该移动到下一个桌面。当按下键盘上的 PgDown 键时,此功能有效,但无法与 配合使用Super+LCtrl+;
。(xev
确实显示LCtrl+;
已注册为 PageDown)
答案1
测试后编辑
经过一番思考和测试,我意识到前两个步骤在这里不是必需的。它们只需要重新映射按键的功能,如拱门维基。这里仅使用进行actions
重新映射就足够了。
...
key <AE02> { symbols[Group1]= [ 2, NoSymbol, FK02 ],
actions[Group1]= [ NoAction(), NoAction(), RedirectKey(keycode=<FK02>, clearmods=levelThree) ]
};
...
include "level3(ralt_switch)"
原始答案
适应这一点arch wiki 部分但使用Right Alt
大写锁定似乎有效。
我需要修改3个文件:
-
- 包括以下内容
/usr/share/X11/xkb/compat/complete
(或者将您的修改写入新文件中并使用include "custom_file"
可能是更好的主意。为了简单起见,我在同一个文件中进行了此操作)
- 包括以下内容
default xkb_types "complete" {
include "basic"
include "mousekeys"
include "pc"
include "iso9995"
include "level5"
include "extra"
include "numpad"
type "CUST_ALT" {
modifiers = Shift+LevelThree;
map[None] = Level1;
map[Shift] = Level2;
map[LevelThree] = Level3;
map[Shift+LevelThree] = Level3;
level_name[Level1] = "Base";
level_name[Level2] = "Shift";
level_name[Level3] = "Level3";
};
};
-
- 包括以下内容
/usr/share/X11/xkb/compat/complete
- 包括以下内容
default xkb_compatibility "complete" {
include "basic"
augment "iso9995"
augment "mousekeys"
augment "accessx(full)"
augment "misc"
augment "xfree86"
augment "level5"
augment "caps(caps_lock)"
interpret ISO_Level3_Shift+Any {
useModMapMods= level1;
virtualModifier= LevelThree;
action= SetMods(modifiers=LevelThree);
};
};
-
- 最后将你的重新映射包含在你的符号文件中
...
...
key <AE02> {
type= "CUST_ALT",
symbols[Group1]= [ 2, NoSymbol, FK02 ],
actions[Group1]= [ NoAction(), NoAction(), RedirectKey(keycode=<FK02>, clearmods=levelThree) ]
};
...
...
include "level3(ralt_switch)"
...
- 注意:
NoSymbol
表示“不覆盖此键盘映射”,不同于 VoidSymbol 会用“VoidSymbol”覆盖键盘映射 - 注意2:确保
include "level3(ralt_switch)"
还包含在您的符号文件中,以将 RightAlt 映射为第三级修饰符!
答案2
(编辑、修正、简化)
解释:
当使用修饰符在 xkb 中模拟某个键时
ISO_Level3_Shift
,它将设置一个真正的修饰符位( ,如默认 xkb 配置文件中设置的那样)。为了让 Gnome 键盘快捷键识别这样的模拟键,需要手动清除额外的修饰符位,如的答案Mod5
中所示 ,使用操作。@avila
clearMods
RedirectKey
解决方案:
按照@avila
编辑的答案,修改key <AE02>
部分如下(OP 的其余配置保持不变):
key <AE02> {
type = "THREE_LEVEL",
symbols = [ NoSymbol, NoSymbol, NoSymbol ],
actions = [ NoAction(), NoAction(),
RedirectKey(
keycode = <FK02>,
clearmods = LevelThree
)
]
};