xkb编译是如何工作的?

Mar*_*tin 4 xorg xkb

在一种“从头开始的 Linux”环境中,我遇到了 xkbcomp 在 X 启动时失败的问题。我发现我什至无法在我的标准 Ubuntu 机器上编译键盘映射:

xkbcomp -w 10 -R/usr/share/X11/xkb -xkm rules/evdev dummy.km
Run Code Online (Sandbox Code Playgroud)

这会导致错误:

Warning: Changing root directory to "/usr/share/X11/xkb"
syntax error: line 16 of rules/evdev
last scanned symbol is:
Errors encountered in rules/evdev; not compiled.
Run Code Online (Sandbox Code Playgroud)

xkbcomp应该如何使用?

Gil*_*il' 7

/usr/share/X11/xkb/rules/evdev包含规则的规范。规则告诉 XKB 如何从零件构建键盘映射,它们不指定特定的键盘映射。的输入xkbcomp需要是键盘映射

\n\n

弄清楚输入应该是什么的最简单方法是\n阅读手册页(哈哈,不)\n阅读官方文档(好像)\n阅读误导性命名的Unreliable 指南(该指南非常好,它是链接在半官方X.org wiki上,但虽然它确实有信息,但实际上并没有说明这是 )\nerrr 的输入xkbcomp,在互联网上询问?哦,你刚刚这么做了。

\n\n

嗯,xkbcomp双向有效。因此,如果您只是要求它从显示器上反编译键盘映射,您将看到一些可接受的输入。

\n\n
xkbcomp :0 - | less\n
Run Code Online (Sandbox Code Playgroud)\n\n

语法是:

\n\n
xkb_keymap {\n  xkb_keycodes { \xe2\x80\xa6 };\n  xkb_types    { \xe2\x80\xa6 };\n  xkb_compat   { \xe2\x80\xa6 };\n  xkb_symbols  { \xe2\x80\xa6 };\n  xkb_geometry { \xe2\x80\xa6 };\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

后面大括号的内容xkb_xxx是进入目录中文件的内容/usr/share/X11/xkb/xxx。您可以使用include语句来告诉xkbcomp读取现有文件。请注意,您需要在文件名之间添加一个include指令。+有些文件包含多个xkb_xxx指令,请在括号中传递所需指令的名称。例如,要将美国布局与Composeon 一起使用Menu,请使用

\n\n
xkb_symbols { include "us+compose(menu)" }\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以要求setxkbmap提供可接受的输入xkbcomp。传递-print选项以查看输出,而不是将键盘映射推送到服务器。用setxkbmap、 、-compat-geometry-keycodes-types设置对应的xkb_xxx-layoutxkb_symbols

\n\n
setxkbmap -layout "us+compose(menu)" -print\n
Run Code Online (Sandbox Code Playgroud)\n\n

实际上,我在上面的遗漏中撒了谎,有一个更简单的方法:该信息位于Arch wiki上。如果您想了解如何配置系统,无论您是否使用 Arch Linux,Arch wiki 都是一个极好的资源。

\n