内部技术对齐 · 仅限 ZMK 官方能力

自动鼠标层 — 官方能力、参数与状态机

轨迹球触发鼠标层

固件ZMK
范围官方文档记载的机制,不含第三方驱动
日期2026-09-20

本文只列 ZMK 官方提供的能力及其参数,以及由此构成的状态机。不含第三方驱动能力(位移阈值)、不含背光联动,两者需另行讨论。

1官方能力

#机制官方提供的行为出处
M1zip_temp_layer
温层输入处理器
挂在输入监听器上,收到输入事件即启用指定层;设定毫秒数内无事件则自动关闭docs/keymaps/input-processors/temp-layer
M2require-prior-idle-ms
M1 的可选属性
距上一次按键未达设定毫秒数时,不允许启用该层同上 · 绑定定义 yaml
M3excluded-positions
M1 的可选属性
列出的物理键位按下时不触发退层。未列出的键位按下即退层同上 · 绑定定义 yaml
M4&mkp_input_listener
鼠标按键输入监听器
鼠标按键行为的专用监听器,可挂载输入处理器。官方示例即为挂载 M1docs/keymaps/behaviors/mouse-emulation

M3 是反向定义的:官方没有「按某键退层」这条规则,只有「列出的键不退层」。也就是说退层是所有键位的默认行为,豁免才是例外。

2参数

代号官方位置含义官方默认值
Lzip_temp_layer 第 1 位置参数要启用的鼠标层序号必填
T_holdzip_temp_layer 第 2 位置参数
挂在轨迹球监听器上时
轨迹球停止后鼠标层继续保持的毫秒数必填
T_clickzip_temp_layer 第 2 位置参数
挂在 M4 上时
一次点击之后鼠标层继续保持的毫秒数必填
T_idlerequire-prior-idle-ms距上一次按键需经过的毫秒数,未达到则轨迹球不能触发切层0
即默认不生效
Pexcluded-positions按下后不触发退层的物理键位号列表(零基)空
即默认全部键退层
两点参数结构上的事实

一、T_idle 与 P 是节点属性,全局共享;T_hold 与 T_click 是引用时的位置参数,可分别设定。因此轨迹球侧与点击侧必然共用同一套静默期与豁免清单,只有两个超时值能分开取。

二、T_idle 默认 0、P 默认空,两项都必须显式配置。P 若留空,连鼠标按键自己按下都会把层踢掉,功能不成立。

3状态机

S0 默认输入层 按键输出常规字符 轨迹球正常移动光标 S1 鼠标层 L P 内键位 = 鼠标按键 轨迹球正常移动光标 轨迹球输入事件 且 距上次按键 ≥ T_idle 计时器 ← T_hold 按下不在 P 内的任意键 → 立即退出 或 计时器归零 → 超时退出 轨迹球事件 → 计时器 ← T_hold 按下 P 内键位 → 计时器 ← T_click(经 M4) 轨迹球事件但 距上次按键 < T_idle → 光标照常移动,不切层 两个状态下轨迹球都正常移动光标,层只决定按键的含义

全部状态与转移,无其他隐藏状态。注意 S0 的虚线自环:静默期内轨迹球事件不被丢弃,光标照常移动,被阻止的只是切层。

4流转规则

当前事件结果计时器 / 备注
S0轨迹球输入事件,且距上次按键 ≥ T_idle→ S1计时器 ← T_hold
S0轨迹球输入事件,但距上次按键 < T_idleS0 不变光标仍移动,仅层不切换
S0任意按键S0 不变输出常规字符;T_idle 起算点刷新
S1轨迹球输入事件S1 保持计时器 ← T_hold
S1按下 P 内的键位(鼠标按键)S1 保持不触发退层;经 M4 重新触发,计时器 ← T_click
S1按下不在 P 内的键位→ S0立即退出,不等超时
S1计时器归零→ S0超时退出

5两处官方未定义的行为

以下两条在官方文档与绑定定义中均无表述,需实机确认。它们不改变状态机结构,但决定参数怎么取。

U1「S1 → S0,按下不在 P 内的键位」这一转移中,该次按键本身输出哪个层的内容?

先退层再解析 → 输出默认层字符;先解析再退层 → 输出鼠标层内容,即用户停顿后打字,第一个键变成一次鼠标点击。

影响:若为后者,T_hold 必须压到很小以降低撞上概率,「T_hold 可取大值」的前提作废。此项应在定任何参数值之前先验。

U2鼠标按键的按下,是否计入 T_idle 所说的「上一次按键」?

若计入,每次点击都会刷新静默期起算点,随后 T_idle 内轨迹球无法触发切层。由于 T_idle 是全局属性,该效应同时作用于点击续期路径。

验证:配好 M4 那条之后,测「点击 → 令层退出 → 立即拨球」能否立刻重新进入 S1。