QMK BMEK 默认键位详解:三层 HHKB 风格 Keymap 的构建与实现

发布时间:2026/9/17 6:43:19
QMK BMEK 默认键位详解:三层 HHKB 风格 Keymap 的构建与实现 QMK BMEK 默认键位详解三层 HHKB 风格 Keymap 的构建与实现【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmwareBMEK 是一款融合了 HHKB 与 Alice 类键盘优点的紧凑键盘其默认键位default keymap以 HHKB 风格布局为基础在保留左侧宏功能列和分体式空格键的同时去掉了左 Shift 的拆分、并将退格与右 Shift 拆分为独立按键。读完本文你将能够完整理解 keyboards/bemeier/bmek/keymaps/default/README.md 所描述的默认键位方案掌握make bemeier/bmek/rev3:default的构建方式并能结合 keymap.c 中的 ASCII 层图逐层分析 QMK 键位定义的实现细节。默认键位的设计取舍BMEK 键盘说明文档 指出BMEK combines the best of HHKB Alice-likesPCB 与外壳设计均为开源。默认键位的官方描述只有一句话式的概括见 keymaps/default/README.md与标准 HHKB 布局相比默认键位保留了左侧宏功能列F13–F16 所在的最左一列保留了分体式空格键Alice 类布局特征采用了 HHKB 风格的布局选项没有拆分的左 Shift整条左下侧边是一个完整的大 Shift、拆分的退格键、拆分的右 Shift。这套取舍直接体现在 keymap.c 使用的LAYOUT_hhkb宏上。info.json 中同时定义了LAYOUT_all与LAYOUT_hhkb两种键位模板两者物理位置不同之处正是左下侧边——LAYOUT_all中该区域为拆分键如[3,1]宽 1.25u 与[4,1]分离而LAYOUT_hhkb中合并为单个 2.25u 的{matrix: [3, 1], x: 1.5, y: 3, w: 2.25}。默认键位选用后者因此左 Shift 是一整块按键右下的右 Shift[3, 13]宽 1.75u则独立于 Fn 键[3, 14]。构建默认键位固件在配置好 QMK 构建环境后按 BMEK 键盘说明 的命令编译# 编译 HHKB 风格布局 默认键位 make bemeier/bmek/rev3:default # 如需 VIA 兼容固件 make bemeier/bmek/rev3:via命令中bemeier/bmek/rev3的rev3指 PCB 版本号。仓库下keyboards/bemeier/bmek/同时提供了rev1、rev2、rev3三个版本目录每个目录内是一个独立的 keyboard.json 构建配置三个版本的device_version分别为0.0.1rev1、0.0.2rev2、0.0.3rev3各版本的核心差异在matrix_pins的行列引脚映射上。例如 rev3 的列为[B6, C6, C7, F7, F6, F5, F4, F0, B7, D0, D1, D2, D3, D5, D4]行为[F1, B4, B5, D6, D7]而 rev1 的行列引脚完全不同如 rev1 的列为[F1, B0, B1, ...]。因此务必查看自己 PCB 丝印选择对应 rev 编译否则矩阵行列错位、按键位置全部错乱。其余构建项三版一致处理器atmega32u4引导加载器atmel-dfudiode_direction为COL2ROW并启用bootmagic、extrakey、sleep_led、nkro、rgblight等特性tapping.term设为 175msRGB 灯珠数为 6WS2812 数据线接E6引脚。nkron-key rollover特性与 5 行 × 15 列的矩阵规模一致6 行硬件引脚中有一行rev3 的行D7参与但布局未用到全部组合用于容纳最左侧的宏列。逐层解析默认 Keymapkeymap.c 定义了keymaps数组共 3 个层每层都使用LAYOUT_hhkb(...)宏并在宏参数内以 ASCII 线框图标注了每个物理按键的用途。这种图 码并置的写法是 QMK 社区维护键位图的可读性实践。第 0 层Default 层线框图摘自 keymap.c 注释┌─────┐ ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┐ ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ │ F13 │ │ ESC │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ │ 7 │ 8 │ 9 │ 0 │ - │ │ \ │ │ ├─────┤ ├─────┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┘ ┌─┴───┬─┴───┬─┴───┬─┴───┬─┴───┬─┴───┬─┴───┬─┴─────┤ │ F14 │ │ TAB │ Q │ W │ E │ R │ T │ │ Y │ U │ I │ O │ P │ [ │ ] │ BSPC │ ├─────┤ ├───────┴┬────┴┬────┴┬────┴┬────┴┬────┴┐ └─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴───────┤ │ F15 │ │ CTRL │ A │ S │ D │ F │ G │ │ H │ J │ K │ L │ ; │ │ ENTER │ ├─────┤ ├────────┴┬────┴┬────┴┬────┴┬────┴┬────┴┐ ┌┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴──────┬────┤ │ F16 │ │ SHFT │ Z │ X │ C │ V │ B │ │ B │ N │ M │ , │ . │ / │ SHFT │ Fn │ └─────┘ └─────────┼─────┼─────┴┬────┴─────┴─────┤ ├─────┴─────┴────┬┴─────┼─────┼─────┴───────┴────┘ │ GUI │ ALT │ SPACE │ │ SPACE/Fn_1 │ ALT │ CTL │ └─────┴──────┴────────────────┘ └────────────────┴──────┴─────┘对应源码为keymaps[0]keymap.c 第 33-37 行。几个值得注意的映射点左侧宏列KC_F13、KC_F14、KC_F15、KC_F16四个功能键即 README 所说的 left macro columns——它们正是 HHKB 没有、而 BMEK 作为 Alice 类布局保留的左侧额外按键左下角完整的KC_LSFT对应LAYOUT_hhkb中合并的 2.25u 键位[3,1]随后是分体空格三件套KC_LGUI、KC_LALT、KC_SPC右下角LT(1, KC_SPC)是关键设计——该键平时是空格长按时切入第 1 层Function Layer 1: Nav配合独立的KC_RALT、KC_RCTL构成了 SPACE/Fn_1 的复合键右下角 Fn 键MO(1)按住不放时临时激活第 1 层松开即回落到第 0 层。LT与MO是 QMK 中两类常用的层切换键码分别对应长按切层 短按原键与纯按住切层两种交互模型。第 1 层Function Layer 1导航层keymaps[1]keymap.c 第 52-56 行通过MO(1)Fn 键或LT(1, KC_SPC)长按进入定位为效率导航层F1–F12 功能键行填补 HHKB 风格主层没有 F 键的缺口同时右上角保留KC_INS、KC_DEL编辑/系统键区KC_PSCR截屏、KC_SCRL滚动锁、KC_PAUS暂停占据第二行右侧KC_UP位于第二行方向键整体落在右半区KC_HOME、KC_PGUP、KC_LEFT、KC_RGHT、KC_END、KC_PGDN、KC_DOWN音量与媒体左下区放置KC_VOLD、KC_VOLU、KC_MUTE、KC_EJCT数字小键盘映射右侧KC_PAST*、KC_PSLS/、KC_PPLS、KC_PMNS-借助 ExtraKey 特性把部分键位映射为数字键盘键顶层入口左上角为QK_BOOT对应线框图的 RST即重启进入固件引导KC_PWR电源键在其右侧左下角TG(2)可切换toggle到第 2 层实现导航层内进入配置层的二级导航。第 2 层Firmware ConfigRGB 配置层未完成keymaps[2]keymap.c 第 71-75 行在源码注释中标记为 TODO大部分位置为XXXXXXX占位符QMK 中表示预留未定义的键码目前只有少量 RGB 控制键码可用UG_TOGG、UG_NEXT、UG_PREV开关灯效、切换下/上一个灯效模式UG_HUEU、UG_HUED调节色相UG_SPDU、UG_SPDD调节灯效速度UG_SATU、UG_SATD调节饱和度UG_VALU、UG_VALD调节亮度。这些UG_*键码属于 QMK 的 RGB Underglow 控制键码族在 quantum/keycodes.h 中定义并由 quantum/process_keycode/process_quantum.c 统一处理。结合 rev3/keyboard.json 中rgblight.saturation_steps 8、brightness_steps 8、led_count 6的配置可知这些键码的调节步长由该构建配置决定——饱和度与亮度各只有 8 级台阶调节按键时以 1/8 的粒度变化。注意第 2 层的TG(2)位置与第 1 层相同左下区域同一物理键从第 0 层进入的路径是长按空格LT(1, KC_SPC)或按住 FnMO(1)→ 按下TG(2)所在位置切到第 2 层。由于TG是切换型键码第 2 层会一直生效再次按下同一物理位置此时为第 2 层映射才能切回——从源码结构看作者将切回入口同样留在了TG(2)对应的键位上形成自洽的 toggle 循环。键盘级实现细节除键位层外BMEK 的键盘级代码还包含一个电源管理钩子bmek.c 中的shutdown_kb()bool shutdown_kb(bool jump_to_bootloader) { if (!shutdown_user(jump_to_bootloader)) { return false; } #ifdef RGBLIGHT_ENABLE rgblight_setrgb(255, 0, 0); #endif return true; }该钩子在键盘关机或被拉入引导加载器前执行先调用shutdown_user()让用户空间有机会否决关机流程若通过则在启用RGBLIGHT_ENABLE时把灯效设为红色作为关机指示。这与第 1 层中KC_PWR电源键的用途相呼应按下电源键触发关机流程红色灯效提示用户键盘正在进入睡眠/关机。小结与延伸默认键位文档本身极简其图实际在 keymap.c 的注释中阅读键位时请以该文件的 ASCII 线框图为准——这一点与 keyboards/bemeier/bmek/readme.md 中 the keymap shown above may not accurately reflect the default keymap of the firmware 的提醒一致布局层面LAYOUT_hhkb与LAYOUT_all的完整坐标映射可在 info.json 中核对两者仅左下侧边结构不同硬件层面编译前务必确认 PCB 版本rev1/rev2/rev3因为 三个 rev 目录的 keyboard.json 中矩阵引脚映射互不相同若需要运行时修改键位而非重新编译可编译make bemeier/bmek/rev3:via使用 VIA 兼容固件info.json中dynamic_keymap.layer_count声明为 5 层多于默认键位实际使用的 3 层为动态重映射留出了余量。【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考