Hotdry.

Article

keyd:基于层堆叠的 Linux 系统级键位重映射守护进程

深入解析 keyd 的层堆叠模型、四种层切换模式、复合层与宏系统,提供可落地的配置参数与工程实践要点。

2026-06-13systems

在 Linux 桌面环境中,键盘重映射工具层出不穷,但大多数方案要么局限于 X11(如 xmodmap),要么依赖特定 Wayland 合成器的私有协议。keyd 采用了一条截然不同的路径:作为系统级守护进程直接监听 evdev 设备,在输入事件到达显示服务器之前完成转换,从而实现了真正的跨会话(X11/Wayland/TTY)统一映射。

核心设计:层堆叠与修饰符一体化

keyd 的配置哲学建立在「层(Layer)」这一概念之上。每个层本质上是一组键绑定,多个层可同时处于激活状态,形成按激活顺序查询的堆叠结构。默认层名为 main,所有自定义层均在此基础上叠加。值得注意的是,keyd 将传统修饰键(Control、Meta、Shift、Alt)也实现为层,例如 [control:C] 表示该层激活时自动附加 Control 修饰符,但层内绑定本身不受修饰符影响 —— 这种设计使得自定义修饰键与系统原生修饰行为能够无缝协作。

层堆叠的查询顺序遵循「后激活者优先」原则。当用户同时激活 capslock 层(自定义导航层)和 shift 层时,后按下的层绑定会覆盖前者。这一机制为构建复杂的输入上下文提供了基础。

层切换的四种模式与复合层

keyd 提供了四种核心的层切换动作,分别对应不同的交互范式:

  • layer(<name>):按住激活键时保持层有效,释放后自动回退
  • oneshot(<name>):单击后层仅对「下一个」按键有效,适合快速修饰
  • toggle(<name>):单击切换层的开关状态,适合在两种模式间长期切换
  • swap(<name>):将当前层与目标层交换,需谨慎使用以避免陷入无法退出的状态

复合层(Composite Layer)是 keyd 的高级特性,允许通过 + 连接多个层名(如 [capslock+shift])。只有当所有组成层同时激活时,复合层才会生效。这在实现「组合修饰」场景时极为有用 —— 例如 CapsLock + Shift + H 映射为 Shift+Left,而单独按 CapsLock 或 Shift 仍保持原有功能。

宏系统与动态绑定

keyd 的宏系统支持按键序列、延时插入、Unicode 字符甚至 shell 命令执行。宏表达式格式如下:

macro(C-t 100ms google.com enter)

上述宏先发送 Ctrl+T,等待 100 毫秒后输入网址并回车。对于需要与层切换联动的场景,keyd 提供了 layermoneshotmtogglem 等变体,可在层切换前后执行宏。

更为强大的是 keyd 的 IPC 机制。通过 keyd -e 接口,外部程序可在运行时动态注入绑定,无需重启守护进程。keyd 附带的 keyd-application-mapper 正是利用这一能力,监听窗口焦点变化并自动切换键位映射,实现「应用感知」的键盘配置。

高阶技巧:键重载与 Homerow Mods

overload 动作允许单个按键根据按压时长或上下文呈现不同行为。最经典的用例是「homerow mods」—— 将 ASDF/JKL; 等基准行按键同时映射为修饰键。

[main]
a = overloadi(a, overloadt2(control, a, 200), 150)

上述配置中,若「a」在 150 毫秒内紧跟其他字符输入,则直接输出「a」;若孤立按压超过 200 毫秒,则激活 Control 层。lettermod 宏是此类配置的快捷写法,接受层名、键名、空闲超时、按住超时四个参数。

对于需要更精细控制的场景,overloadt2 会在检测到 intervening key(中间按键)时立即解析为修饰键行为,而 timeout 动作则支持基于时长的二态切换。

工程实践要点

配置文件采用类 INI 格式,位于 /etc/keyd/*.conf,必须以 [ids] 段开头指定目标设备(* 通配所有键盘,-<id> 排除特定设备)。include 指令支持配置片段复用,但需注意:被包含文件不应含 [ids] 段,且不支持嵌套包含。

关键风险:keyd 直接操作内核输入子系统,配置错误可能导致键盘完全失效。务必牢记应急序列:Backspace + Escape + Enter 可强制终止 keyd 进程。建议在测试新配置时保持备用输入手段(如 SSH 或虚拟键盘)。

鼠标支持目前标记为实验性,部分设备可能被误识别为键盘,导致指针异常。若需管理鼠标(如清除 oneshot 修饰符于点击时),建议显式列出设备 ID 而非使用通配符。

总结

keyd 通过层堆叠模型将键位重映射从简单的「键对键」映射提升为上下文感知的输入管理系统。其跨显示服务器的兼容性、运行时动态绑定能力以及对复杂交互模式(复合层、宏、重载)的原生支持,使其成为 Linux 高级用户和效率追求者的利器。对于需要统一多环境键位习惯、构建个性化编辑工作流或实现应用感知输入的场景,keyd 提供了目前生态中最为完整和工程化的解决方案。


资料来源

systems

内容声明:本文无广告投放、无付费植入。

如有事实性问题,欢迎发送勘误至 i@hotdrydog.com