在 archlinux 上的 xkb 指南中:https://wiki.archlinux.org/index.php/X_keyboard_extension 我们看到此配置将 LWIN 设置为 ISO_Level3_Shift
xkb_symbols {
key <LWIN> { [ISO_Level3_Shift ] };
modifier_map Mod5 { ISO_Level3_Shift };
}
xkb_compatibility {
interpret ISO_Level3_Shift { action= SetMods(modifiers=Mod5); };
}
现在我有点困惑。
modifier_map Mod5 { ISO_Level3_Shift };
ISO_Level3_Shift 是一个虚拟修饰符。所以我们需要以某种方式将其映射到真实修饰符。但是和之间有什么区别interpret ISO_Level3_Shift { action= SetMods(modifiers=Mod5); };
?为什么我们需要两者?在 xkb 文件中
compat/level5
我看到类似interpret ISO_Level5_Shift+Any { useModMapMods= level1; virtualModifier= LevelFive; action= SetMods(modifiers=LevelFive); }; interpret ISO_Level5_Shift { action= SetMods(modifiers=LevelFive); };
useModMapMods
这里的and是什么virtualModifier
意思?
答案1
免责声明:我仍在尝试理解 XKB,可能存在错误。但由于目前还没有其他答案,因此以下是我目前的理解。
关于 ISO_Level3_Shift 问题的第一部分:modifier_map
需要向后兼容旧的核心协议。例如,旧xmodmap
程序需要它才能正常工作。并且修改映射可能仍被广泛使用,因为人们拥有 ~/.Xmodmap 文件,与 XKB 相比,这些文件易于使用且易于理解。但现代方法是使用interpret ...
方法。
问题的第二部分关于 level5、useModMapMods 和 virtualModifier 对我来说比较难。可能我对 XKB 了解不够,无法给出简单的答案。我最好引用文档:useModMapMods= level1;
意思是 LevelOneOnly。来自https://www.x.org/releases/current/doc/kbproto/xkbproto.pdf第 54 页:
levelOneOnly 设置表示,如果符号匹配其组的第一级,则相关解释应仅使用修饰符映射绑定到此键的修饰符。否则,如果所考虑的符号不在其组的移位级别一,则服务器的行为就像键的修饰符映射为空一样。请注意,如果此类解释与没有修饰符的键匹配,则它仍可能应用于移位级别一以外的符号;levelOneOnly 标志仅控制确定匹配的方式以及解释匹配时应用的键修饰符。
据我所知,这virtualModifier= LevelFive
行代码再次是为了向后兼容。可以指定映射在interpret
任一部分或者直接在键定义中。
尽管我似乎能够独立理解上述每个陈述,但我仍然无法想出一个例子来说明这些陈述的用法ISO_Level5_Shift
和ISO_Level5_Shift+Any
解释。