ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ZMK Key Repeat 行为指南:用 `key_repeat` 一键重发上次按键

ZMK Key Repeat 行为指南:用 `key_repeat` 一键重发上次按键 固件嵌入式智能硬件蓝牙【免费下载链接】zmkZMK Firmware Repository项目地址https://gitcode.com/gh_mirrors/zm/zmk点击查看免费下载本文是 ZMK 固件key_repeat按键重复行为的完整实战指南讲解如何用key_repeat绑定一个按键使其在按下时自动重发键盘上一次发送过的键码并深入解释usage-pages配置项、底层事件监听原理与官方测试用例。读完本文你将能直接在自己的 keymap 中正确配置并使用该行为且能判断它何时会失效、如何扩展捕获 Consumer 页的媒体键。行为概述它到底“记住”了什么key_repeat行为的定义非常简洁触发它时它会重发上一次被发送/触发的键码见 docs/docs/keymaps/behaviors/key-repeat.md。从源码实现看它的“记忆”并不是记住一个按键的物理位置而是记住一次完整的键码状态事件。核心数据结构定义在 app/src/behaviors/behavior_key_repeat.cstruct behavior_key_repeat_data { struct zmk_keycode_state_changed last_keycode_pressed; struct zmk_keycode_state_changed current_keycode_pressed; };其中last_keycode_pressed保存“最近一次按下”的键码状态含 usage page、usage id、显式/隐式修饰键、时间戳等字段current_keycode_pressed则是触发 repeat 时复制出来的“正在重发”状态用于在释放 repeat 键时正确地上报一次释放事件。也就是说key_repeat不是简单的“按住连发”而是每按一次就重发一次最近的那个键码按下时发一次 press松开时补一次 release。行为绑定在 keymap 中怎么用key_repeat是一个零参数行为binding-cells 0在 keymap 中直接写引用标签即可key_repeat行为节点的设备树定义位于 app/dts/behaviors/key_repeat.dtsikey_repeat: key_repeat { compatible zmk,behavior-key-repeat; #binding-cells 0; usage-pages HID_USAGE_KEY; display-name Key Repeat; };对应的 binding 元数据schema在 app/dts/bindings/behaviors/zmk,behavior-key-repeat.yaml 中声明其中usage-pages属性类型为array且required: true说明这是一个必须显式给定的数组属性由系统预置的key_repeat.dtsi提供默认值。一个典型的最小 keymap 片段参考官方测试 app/tests/key-repeat/behavior_keymap.dtsi#include dt-bindings/zmk/keys.h #include behaviors.dtsi / { keymap { compatible zmk,keymap; default_layer { bindings key_repeat kp A kp LCTRL kp C_VOL_UP ; }; }; };典型使用场景把key_repeat放到拇指位或某个顺手的位置需要连续输入刚才那个字符例如连续敲同一字母、连续删除时不再反复敲原键而是直接按 repeat 键即可。它重发的是“逻辑键码”而非“物理按键”因此上一个键是任意行为如 tap-dance、hold-tap 的点按分支产出的键码repeat 也能原样重发。usage-pages 配置默认只记键盘页如何扩展到媒体键默认情况下key_repeat只跟踪 HIDKey键盘/键区usage page上的最后一次按键来自其他 usage page例如 Consumer 消费类页即媒体键的事件会被忽略。这一点在设备树默认值usage-pages HID_USAGE_KEY;中体现见上文 app/dts/behaviors/key_repeat.dtsi。如果你希望 repeat 同时捕获并重发 Consumer 页的用法比如音量、播放暂停等媒体控制需要更新已有行为节点的usage-pages属性key_repeat { usage-pages HID_USAGE_KEY HID_USAGE_CONSUMER; }; / { keymap { ... }; };两个常量宏的定义在 app/include/dt-bindings/zmk/hid_usage_pages.h#define HID_USAGE_KEY (0x07) // Keyboard/Keypad #define HID_USAGE_CONSUMER (0x0C) // Consumer而具体的键码宏如kp A、kp C_VOL_UP都在 app/include/dt-bindings/zmk/keys.h 中通过ZMK_HID_USAGE(HID_USAGE_KEY, ...)/ZMK_HID_USAGE(HID_USAGE_CONSUMER, ...)组合出完整 usage因此当你的 repeat 键捕获了 Consumer 页后C_VOL_UP、C_PLAY_PAUSE、C_MUTE等媒体键码也能被重发。配置了多个 usage page 后监听逻辑会对每个已启用的 usage page都记录最近一次按下事件按 usage page 各自独立记录这意味着“上一次 Key 页按键”和“上一次 Consumer 页按键”分别有各自的记忆。底层实现事件监听、显式修饰键与三个边界行为key_repeat的实现是一个典型的 ZMK 事件订阅者 行为驱动组合全部逻辑在 app/src/behaviors/behavior_key_repeat.c监听链路谁在“记”最后一次按键行为通过ZMK_SUBSCRIPTION(behavior_key_repeat, zmk_keycode_state_changed)订阅zmk_keycode_state_changed事件。监听函数key_repeat_keycode_state_changed_listenerL83-L105的工作流程是只关心按下事件ev-state为真时释放事件直接放行ZMK_EV_EVENT_BUBBLE遍历所有key_repeat设备实例对每个实例再遍历其配置的usage_pages若事件的usage_page命中某个已配置的 page就把整个事件结构体复制进last_keycode_pressed关键细节记录时会执行data-last_keycode_pressed.implicit_modifiers | zmk_hid_get_explicit_mods();把当前处于按下状态的显式修饰键如按住 Shift合并进记忆从而保证 repeat 时连修饰状态一起还原——这正是按住 Shift 输入A后repeat 能重发大写A的原因。按下与释放重发是怎么完成的repeat 键按下L33-L49若last_keycode_pressed.usage_page为 0即从未记录过任何按键直接返回ZMK_BEHAVIOR_OPAQUE什么都不发否则把记忆复制到current_keycode_pressed刷新时间戳为当前时间然后raise_zmk_keycode_state_changed(...)以按下状态重发该键码。repeat 键释放L51-L65若当前正在重发的键码有效则刷新时间戳并把state置为false补发一次释放事件完成一次完整、干净的 press/release 周期。由源码和测试可确认的三个边界行为从未按过键时按下 repeat什么都不发生。对应测试目录 app/tests/key-repeat/send-nothing-if-no-keys-pressed-yet重发后不会污染记忆current_keycode_pressed与last_keycode_pressed分离重发过程不会覆盖“最近一次真实按键”的记忆只跟踪 usage page 白名单内的事件其他 page如鼠标事件被忽略见测试 app/tests/key-repeat/ignore-other-usage-page-events。官方测试集行为被如何验证仓库在app/tests/key-repeat/下为 key_repeat 行为维护了 5 组基于native_sim的测试每组包含native_sim.keymap、events.patterns和keycode_events.snapshot测试目录验证点ignore-other-usage-page-events非 Key 页事件不会被记录press-and-release-after-key-usage按下 repeat 重发 press、释放补发 releasepress-and-release-with-explicit-modifiers重发时携带当前显式修饰键send-nothing-if-no-keys-pressed-yet无记忆时按下 repeat 不产生任何输出tap-when-rolling连续滚动输入时 repeat 能正确工作测试通过events.patterns中的 sed 正则如s/.*hid_listener_keycode_//p过滤事件流并与keycode_events.snapshot快照比对验证重发的键码序列与修饰键行为完全符合预期。如果你修改了该行为可运行 app/run-test.sh 或 app/run-ble-test.sh 执行对应测试套件回归验证。常见问题速查repeat 后想重发媒体键音量/播放没反应检查key_repeat节点的usage-pages是否已加上HID_USAGE_CONSUMER默认只跟踪键盘页。按住 repeat 键会连发吗不会。它是“按一次重发一次 press/release”与操作系统层面的按键长按连发是两回事想要按住连发应把它绑定到kp语义之外的行为组合例如搭配宏自行实现。Repeat 能重发组合键如 CtrlC吗可以。它重发的是最后一次记录的键码事件及其隐式修饰键因此显式按住 Ctrl 时触发的C会被记录为带修饰的键码并整体重发。与key_repeat近似的常见误区不要与key_press、kp混淆——后者是直接发送指定键码前者是重发“最近一次”的键码二者用途完全不同。综上key_repeat是一个小巧但行为边界清晰的行为默认只记忆并重发键盘页的最近一次按键通过usage-pages可扩展至 Consumer 媒体键其记忆带隐式修饰键、press/release 成对补发且无记忆时静默无效。理解了 app/src/behaviors/behavior_key_repeat.c 的实现细节后你就能在 keymap 中精准地利用它并预判它在各种输入节奏下的表现。赞分享固件嵌入式智能硬件蓝牙【免费下载链接】zmkZMK Firmware Repository项目地址https://gitcode.com/gh_mirrors/zm/zmk点击查看免费下载相关推荐QMK Repeat Key 完全指南重复键、反向重复Alt Repeat与回调机制的源码级解析QMK Repeat Key 完全指南重复键、反向重复Alt Repeat与回调机制的源码级解析 QMK 的 Repeat Key重复键功能允许用一个嵌入式固件驱动开发硬件开发ZMK Key Toggle 行为kt完全指南实现 Shift Lock 与免按住 ALT-TABZMK Key Toggle 行为kt完全指南实现 Shift Lock 与免按住 ALT TAB 导读 Key Toggle键切换是 ZMK 固件固件嵌入式智能硬件蓝牙Key MapperAndroid设备按键重映射终极指南Key Mapper是一款功能强大的开源Android应用程序它赋予用户重新定义设备按键和指纹识别器手势的能力。通过这个项目你可以创建完全个性化的操作方式移动开发上一篇外接显示器亮度 3 步搞定MonitorControl 免费完整配置指南下一篇LeetDown iOS降级工具教程五步把 iPhone 5/5s 与 iPad 4 装回旧系统创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表