轨迹球触发鼠标层
本文只列 ZMK 官方提供的能力及其参数,以及由此构成的状态机。不含第三方驱动能力(位移阈值)、不含背光联动,两者需另行讨论。
| # | 机制 | 官方提供的行为 | 出处 |
|---|---|---|---|
| M1 | zip_temp_layer温层输入处理器 | 挂在输入监听器上,收到输入事件即启用指定层;设定毫秒数内无事件则自动关闭 | docs/keymaps/input-processors/temp-layer |
| M2 | require-prior-idle-msM1 的可选属性 | 距上一次按键未达设定毫秒数时,不允许启用该层 | 同上 · 绑定定义 yaml |
| M3 | excluded-positionsM1 的可选属性 | 列出的物理键位按下时不触发退层。未列出的键位按下即退层 | 同上 · 绑定定义 yaml |
| M4 | &mkp_input_listener鼠标按键输入监听器 | 鼠标按键行为的专用监听器,可挂载输入处理器。官方示例即为挂载 M1 | docs/keymaps/behaviors/mouse-emulation |
M3 是反向定义的:官方没有「按某键退层」这条规则,只有「列出的键不退层」。也就是说退层是所有键位的默认行为,豁免才是例外。
| 代号 | 官方位置 | 含义 | 官方默认值 |
|---|---|---|---|
| L | zip_temp_layer 第 1 位置参数 | 要启用的鼠标层序号 | 必填 |
| T_hold | zip_temp_layer 第 2 位置参数挂在轨迹球监听器上时 | 轨迹球停止后鼠标层继续保持的毫秒数 | 必填 |
| T_click | zip_temp_layer 第 2 位置参数挂在 M4 上时 | 一次点击之后鼠标层继续保持的毫秒数 | 必填 |
| T_idle | require-prior-idle-ms | 距上一次按键需经过的毫秒数,未达到则轨迹球不能触发切层 | 0 即默认不生效 |
| P | excluded-positions | 按下后不触发退层的物理键位号列表(零基) | 空 即默认全部键退层 |
一、T_idle 与 P 是节点属性,全局共享;T_hold 与 T_click 是引用时的位置参数,可分别设定。因此轨迹球侧与点击侧必然共用同一套静默期与豁免清单,只有两个超时值能分开取。
二、T_idle 默认 0、P 默认空,两项都必须显式配置。P 若留空,连鼠标按键自己按下都会把层踢掉,功能不成立。
全部状态与转移,无其他隐藏状态。注意 S0 的虚线自环:静默期内轨迹球事件不被丢弃,光标照常移动,被阻止的只是切层。
| 当前 | 事件 | 结果 | 计时器 / 备注 |
|---|---|---|---|
| S0 | 轨迹球输入事件,且距上次按键 ≥ T_idle | → S1 | 计时器 ← T_hold |
| S0 | 轨迹球输入事件,但距上次按键 < T_idle | S0 不变 | 光标仍移动,仅层不切换 |
| S0 | 任意按键 | S0 不变 | 输出常规字符;T_idle 起算点刷新 |
| S1 | 轨迹球输入事件 | S1 保持 | 计时器 ← T_hold |
| S1 | 按下 P 内的键位(鼠标按键) | S1 保持 | 不触发退层;经 M4 重新触发,计时器 ← T_click |
| S1 | 按下不在 P 内的键位 | → S0 | 立即退出,不等超时 |
| S1 | 计时器归零 | → S0 | 超时退出 |
以下两条在官方文档与绑定定义中均无表述,需实机确认。它们不改变状态机结构,但决定参数怎么取。
U1「S1 → S0,按下不在 P 内的键位」这一转移中,该次按键本身输出哪个层的内容?
先退层再解析 → 输出默认层字符;先解析再退层 → 输出鼠标层内容,即用户停顿后打字,第一个键变成一次鼠标点击。
影响:若为后者,T_hold 必须压到很小以降低撞上概率,「T_hold 可取大值」的前提作废。此项应在定任何参数值之前先验。
U2鼠标按键的按下,是否计入 T_idle 所说的「上一次按键」?
若计入,每次点击都会刷新静默期起算点,随后 T_idle 内轨迹球无法触发切层。由于 T_idle 是全局属性,该效应同时作用于点击续期路径。
验证:配好 M4 那条之后,测「点击 → 令层退出 → 立即拨球」能否立刻重新进入 S1。