Linux 下使用 xkb 将 CapsLock 键映射为 Ctrl 键, 同时将 Ctrl 键映射为 Hyper 键

Linux 下使用 xkb 将 CapsLock 键映射为 Ctrl 键, 同时将 Ctrl 键映射为 Hyper 键

💡 原文中文,约2300字,阅读约需6分钟。
📝

内容提要

文章介绍Linux下重映射键盘键的方法:通过XkbOptions的ctrl:hyper_capscontrol可将CapsLock映射为Ctrl、左Ctrl映射为Hyper;swapcaps则仅交换Caps与Ctrl。作者因Wayland下setxkbmap报错,改用NixOS配置自定义XkbOption覆盖symbols/ctrl,使X11和Wayland均可用。但Wayland下Emacs Pgtk不识别Hyper_L,故回归X11。另可考虑用keyd完成按键映射。

🔎

延伸解读

XkbOptions 的两种现成方案

文章指出,通过 XkbOptions 可直接实现按键重映射:ctrl:hyper_capscontrol 将 CapsLock 映射为 Ctrl,左 Ctrl 映射为 Hyper;swapcaps 则仅交换 CapsLock 与左 Ctrl。用户可用 localectl list-x11-keymap-options 查看所有选项,并通过环境变量 XKB_CONFIG_ROOT 定位源码,了解具体映射逻辑。

Wayland 下的兼容性挑战

作者尝试在 Wayland 下用 setxkbmap 自定义布局时遇到报错,于是改为在 NixOS 配置中重写 XkbOption,覆盖 symbols/ctrl 文件,使 X11 和 Wayland 均能生效。但随后发现 Wayland 下的 Emacs Pgtk 无法识别 Hyper_L 键,最终因依赖 Hyper 键而回归 X11。

替代工具 keyd 的可行性

文章末尾提到,除了 xkb 之外,还可以考虑使用 keyd 完成按键映射,并给出了其 GitHub 链接。keyd 的配置看起来较为简单,为读者提供了另一种选择,尤其适合在 xkb 方案遇到兼容性问题时尝试。

❓

Q&A

如何用 xkb 把 CapsLock 映射为 Ctrl,同时把左 Ctrl 映射为 Hyper?

设置 XkbOptions 为 ctrl:hyper_capscontrol 即可。该选项会修改键盘符号定义:将 CapsLock 键替换为 Control_L,并将左 Ctrl 键替换为 Hyper_L,同时更新修饰键映射。

ctrl:hyper_capscontrol 和 swapcaps 这两个 XkbOption 有什么区别?

ctrl:hyper_capscontrol 将 CapsLock 变为左 Ctrl,将左 Ctrl 变为左 Hyper;而 swapcaps 仅交换 CapsLock 和左 Ctrl 的功能,即 CapsLock 变为 Ctrl,左 Ctrl 变为 CapsLock。

在 Wayland 下 setxkbmap 报错 'Error loading new keyboard description' 怎么办?

可以自定义一个 XkbOption,通过覆盖 symbols/ctrl 文件来实现按键重映射。例如在 NixOS 配置中,使用 extraLayouts 定义新的 symbolsFile,并设置 options 为 ctrl:nocaps,这样在 Wayland 和 X11 下都能生效。

为什么作者最终放弃了 Wayland 而回到 X11?

因为在 Wayland 下,Emacs Pgtk 无法识别 Hyper_L 键,而作者非常依赖 Hyper_L 键,所以选择回到 X11。

除了 xkb,还有哪些工具可以实现按键映射?

还可以考虑使用 keyd 来完成按键映射,其配置相对简单,具体可参考 keyd 的 GitHub 页面。

如何查看 XkbOptions 的所有可选项及其源码?

可以使用 localectl list-x11-keymap-options 列出所有可选项。要查看源码,可通过环境变量 XKB_CONFIG_ROOT 找到 xkeyboard-config 的安装路径,然后查看对应的 symbols 文件。

🏷️

标签

➡️

继续阅读