疫情过去多年后终于也从居家办公变成混合办公,久违地翻出自己的键盘库存准备找一个拿到办公室去用,看到很多小型键盘,想起四五年前入坑键盘时候的沉迷,不仅用 4x12 这种小型 ortholinear 键盘,甚至把键盘布局也都直接改成了 Colemak-DH 之类的非 QWER 类型,不过后来又渐渐换回了普通布局和键盘,一方面在家经常需要两人根据会议情况交替使用同一个桌面布置,二是有时直接使用笔记本键盘的时候也会很不方便,现在基本上收敛到了 Logitech MX Keys Mini 这一款几乎和 Macbook 内置键盘布局一样,同时无线续航超长且稳定,并且支持 2.4 GHz 无线连接(也是为了在家同一套桌面系统切换不同人的电脑不用重新连蓝牙方便)的轻巧键盘。不过久违地拿出我的 Planck 4x12 来用了一下,发现虽然一开始字母有点容易按错,但想不到自己对于需要切换 layer 来输入的数字和符号的肌肉记忆居然也都还在,有点惊奇,于是好奇地调研了一下键盘圈这几年来的变化。
小型键盘圈子似乎对于 Planck 这样的正交布局逐渐没有那么热衷了,甚至连 Planck EZ 这一款现成的入门产品也不再生产了,大家现在的热情似乎主要偏移到左右手分离式、蓝牙无线和 low profile 方向去了,感觉是在(伪)人体工学的道路上飞速前进。这同时也推进了开源键盘固件的发展,QMK 获得了不少关于 Home Row Mods 的改进,同时还有像 Vial 这样不需要重新编译固件就能实时修改键盘的复杂功能的工具出现,在低功耗蓝牙键盘领域除了 ZMK 之外也有 RMK 这样基于 Rust 的新秀。比较高端的键盘社区似乎也变得更大众化,出现了不少不需要经年累月地等待 group buy 以及自己手工组装,而是可以直接购买的量产中高端键盘。不得不说还是让人有点小激动的。
所以我又简单 catch up 了一下键盘圈子里的一些近况。一个是关于 Home Row Mods (HRM),也就是直接用 ASDF 等这些常规键作为 shift、cmd 之类的 modifier,例如按一下是 A,但按住则变成 Ctrl,这对于超小型键盘(例如只有 34 个键的 Ferris)来说基本上是必须的。它的好处是你基本上不用移动手就能完成所有的组合键,也减少了小拇指的负担。我其实没有真正用过 HRM 这么激进的配置,但会用类似的 Mod Tap 功能(例如 Caps lock 的位置普通是 ESC,按住变成 Ctrl),因为我常用的键盘主要的 modifier 是够用的,但更主要的原因还是 HRM 在纸上听起来很美好,但是实际操作起来槽点众多。
因为 Mod Tap 最基本的实现是靠一个 Tapping Term 的时间阈值(例如 200 毫秒)来实现的,按下键时会有一个倒计时开始,如果在 200 毫秒内放开按键,则当作 tap,如果按住超过 200 毫秒则作为 hold。但是现实中这个时间阈值并不容易设置:设置得太短,则必须飞速敲击键盘,稍有延迟则会被判断为 modifier 键;反过来设置得太长,则在使用 modifier 键的时候键盘会有种反应很慢的感觉,比如 Ctrl+C 需要按住等到 Ctrl 键触发才能按出来。这里最麻烦的地方就在于人类并不能像机械那样精准地按键,等你开始使用 HRM 之后就会发现原来自己按键如此不整洁,可能会在前一个按键放开之前已经按下了下一个按键,或者先后按下的键并不是按先后顺序放开,有些键按得快有些键按得慢,等等……总之使用 HRM 的时候这些问题就都会暴露出来。好在把像 Caps Lock 这样没那么常用的位置的按键做成 Mod Tap 的话碰到问题的概率会小很多。
好消息是近年这方面有了长足的改善,一个是键轴的进化,另一个是固件方面的升级。键轴方面现在出现了很多霍尔效应磁轴 (Hall effect switches) 及变种,同机械键轴相比可以全程感知按键深度,很多 HE 键轴键盘可以设置浅按和深按是不同的功能,听起来似乎很适合做一个硬件层面的 Mod Tap 实现:轻点一下是 ESC,深按则变成 Ctrl。磁轴还有另一个优势就是可以做到非常灵敏,在按下后抬起 0.1mm 就可以检测到并且当作释放按键,对于经常误触发 modifier hold 的情况来说是一个福音。因为我之前对静电容键轴很喜欢,所以立刻就想试一试磁轴键盘了。
于是找到了 Keychron 的 Q2 HE 8k 这一款在键盘布局上比较合我心意的键盘,上手体验感觉很不错,不论手感还是声音都非常优秀,很显然键盘构造在声音方面下了不少功夫,键轴事先上了油,甚至空格键内部也贴好了吸音绵改善音效,不禁感叹现在想要买到比较中高端的键盘真是比以往容易太多了。不过其实自己并不能明显感觉出磁轴和传统机械键轴的区别来,也完全用不到 8k 这么高的 polling rate。最关键的是刚才提到的优点其实也都没法在我所关注的应用场景下发挥出来:浅按深按的区别不能用来做 Mod Tap,因为在深按的过程中会先触发浅按,所以实际会变成 ESC 或 Ctrl+ESC 而不是 Ctrl。主要原因是磁轴这块市场更多的是在游戏竞技市场的驱动下发展出来的,比较典型的应用场景是:轻按是走路,深按是跑步,这样在触发跑步之前先触发走路的动作并不会有什么坏处。而超高灵敏度这一块也无法用到,原因是虽然现在各种键盘的可定制程度越来越高,甚至甚多厂会直接使用开源的 QMK 来做固件,但在预制键盘厂商里真正做到完全和官方 QMK 兼容的仍然是少数,尤其是像磁轴键盘这种需要 PCB 有专门的 sensor 以及固件里有特殊驱动功能的情况。
具体到 Keychron,他们家出了很多款键盘,型号眼花缭乱,其中 Q 系列是完全兼容 QMK 的(例如有和 Q2 HE 同样布局的低端版非磁轴的 Q2),代码也都可以直接在 QMK 官方 repo 找到(虽然听说经常会延迟很久才放出来)。另外一些其他系列的键盘则“有可能”在 Keychron 自己的 QMK fork 里的某些奇怪的 branch 里找到。
比如这个 Q2 HE 8k,我先试探性地问了一下大模型如何定制固件,它给
hallucinate 出来了一些步骤,大致上是合理的,并帮我找到了 Keychron 的 QMK
fork,我在一个叫作 2025q3 的分支里找到了
keyboards/keychron/q2_he 这个路径,和大模型说的
q2_he_8k 不同,追问之下,大模型说这 8k 是 Keychron
用来强调他家键盘 polling rate 的“marketing
term”,所以这就是我要找的固件代码。听起来很合理,而且固件代码里附的键盘照片也看着完全一直,所以我就盲信了……在头大中倒腾了好几天才发现其实
Keychron 除了 Q2 HE 8k 和普通的 Q2 之外,确实还出了一款叫作 Q2 HE 的键盘
😵💫,外观看起来和 Q2 HE 8k
一样的(所以照片匹配),但是固件完全不同,而且为了有处理 8k polling rate
的能力,芯片也完全换了。
8k 系列之前用的是 STM32 的芯片,bootloader
使用 DFU (Device Firmware Upgrade) 协议来烧制固件,和 QMK
的工具链完美契合,直接用 qmk compile 编译,然后让键盘进入
bootloader 模式(通常是通过 PCB 上的 reset
或者在按住最左上角键的同时插入 USB),然后通过 QMK Toolbox
就可以直接烧制固件了。但是这在 Q2 HE 8k 是行不通的。因为 QMK Toolbox
无法识别 bootloader 模式的键盘,直接使用更底层的命令行工具
dfu-util 也是不行的,因为真正的问题在于 8k 系列已经没有在用
STM32 的芯片了,而是一个有 1MB 现存的更强的芯片(官方未公布,但根据 spec
有可能是 HPMicro 的 HPM5300
系列芯片),并不使用 DFU 协议,而是作为一个通用 Boot ROM,所以 QMK
Toolbox 无法使用。Keychron 官方 web app 通过 WebHID
直接与设备通信来实现固件烧制。但是官方 app 禁用了 Q2 HE 8k
键盘烧制用户定制固件的功能,要绕开这个限制有几个可行的路线:1. 直接对
web app 进行逆向工程找出烧制固件用的协议;2. 官方 app
可以进行固件升级,可以注入 Javascript
代码拦截官方固件下载,以本地固件文件进行替换;3.
使用芯片厂商提供的烧制工具。选项 3 听起来最不
hacky,不过也并不知道芯片是不是 HPMicro 的,HPMicro 提供的工具居然直接是中文文档哈哈,而且不支持
MacOS,可能需要用虚拟机再加上 USB 映射等方式……
总之不论怎样都是很麻烦的,但其实真正无法解决的问题还是固件代码根本就不存在。其实倒腾过程中一直有一个让我头大的疑点:为什么固件代码在 QMK 里,但是芯片和烧制过程显然都是不兼容的?虽然 Keychron 的 github 仓库看起来很乱,但应该也不至于直接把不 work 的代码上传上来吧?结果答案其实很简单:前面找到的 Q2 HE 的 QMK 固件代码是给另一个键盘和芯片用的,Q2 HE 8k 的固件代码并没有开放出来,甚至都不一定是基于 QMK 做的。
不过归根结底我为什么一定要定制固件呢?其实像 Q2 这样的 65%
布局,绝大部分我需要用到的按键都已经有了,其实并不需要复杂的 Mod-Tap
功能。唯一缺少的是 ~ 键——因为这个布局省略了 function
行,通常 ~ 键的位置会被换成更常用的 Esc 键。QMK
里为了解决这个问题专门有一个叫作 Grave Escape
的键:单独按下是 Esc,Cmd+Esc 则会输出 backtick,Shift+Esc 则输出
tilde,让一个键同时作为 Esc 和 ~ 两个键使用。Keychron
官方的定制工具 Keychron
Launcher 其实支持把 Esc
设置成这样,但设置完之后这个键没有任何输出,不知道是不是在支持磁轴和 8k
polling 的时候对 QMK 进行阉割瘦身的时候搞坏了。不过其实 Grave Escape
本身在 MacOS 下也不能很好地工作,实际还是需要去修改固件代码使用 Key Overrides
的方式来做。
虽然 backtick 和 tilde 在写代码的时候还是比较常用的,但客观来讲通过 Fn 或者其他一些不太方便的方式输入也不是太大的问题。只是在对自己键盘的固件可定制性方面,如果完全是商业化封闭固件也就算了,明明是基于极其灵活强大的固件框架但却无法加以利用大概才是让人纠结的地方吧。这一方面来说,完全客制化的键盘通常就好很多,这里翻出有点落灰的 Planck,在这个 40% 布局的键盘下面 Mod Tap 是必须的,所以我也很期待试一试 QMK 近些年在软件层面的改进。我的 Planck 是 OLKB 的 rev6.1 PCB,固件已经在 QMK 的官方仓库里了,所以其实直接更新一下 QMK 代码重新编译一下就可以了。
不过这里还有另一个新工具我想试用一下:近些年出了一个叫作 Vial 的键盘配置工具,可以直接对键盘的 keymap 进行实时修改,不需要经过编译、烧制等复杂步骤。之前 VIA 也能做到这一点,但 Vial 比 VIA 要强大很多,能够深度定制 QMK 的各种复杂功能,包括 Mod Tap 和 Tap Dance 相关的设置等等。
为了让键盘和 Vial 兼容,需要先烧制一个兼容的固件。Vial 维护了一个自己的 QMK fork,从里面直接编译即可,网上甚至还能找到定期自动编译的固件直接下载即可,也省去了设置 QMK 开发环境的麻烦。不过 Planck 键盘在 Vial 的仓库里只移植了 rev6_drop 和 rev7,OLKB 的 rev6 并没有。Vial 官网有添加键盘支持的详细文档,不过 Drop 的 rev6 和 OLKB 的 rev6 应该区别不大,说不定可以直接复用固件,不过保险起见可以把 rev6_drop 下面的 vial keymap 复制到 rev6 下面,仍然编译 rev6 的固件。
- brew install qmk/qmk/qmk # install QMK dev tools
- git clone --depth 1 https://github.com/vial-kb/vial-qmk.git
- export QMK_HOME=$(pwd)/vial-qmk
- cd vial-qmk && qmk doctor # and follow instructions
QMK 的代码库感觉在这些年已经变成了庞然大物,推荐使用
--depth 1。验证 QMK 开发环境 OK 之后,直接把
keyboards/planck/rev6_drop/keymaps/vial 文件夹拷贝到
keyboards/planck/rev6/keymaps/ 下面,然后对 keymap
做一些想要的修改,大部分东西其实可以后期通过 Vial
的图形界面修改,所以这里我只把默认 layer 数量加大一下,在
config.h 里加入
#define DYNAMIC_KEYMAP_LAYER_COUNT 8,另外 QMK 最近还加了
Chordal Hold 的功能,主要用来解决快速输入是误触发 modifier
的问题,因为通常间隔最小的快速输入是同一个手的几个手指轮转,所以 Chordal
Hold
会根据前后两个按键是否分别属于左右手来进行行为判断。这个功能在左右手分离式键盘里可以自动适配,但在一体式键盘里需要自己定义左右手的布局。在
keymap.c 里加入:
- #ifdef CHORDAL_HOLD
- const char PROGMEM chordal_hold_layout[MATRIX_ROWS][MATRIX_COLS] = LAYOUT_ortho_4x12 (
- 'L', 'L', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R', 'R',
- 'L', 'L', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R', 'R',
- 'L', 'L', 'L', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'R', 'R',
- '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*'
- );
- #endif
然后使用 make planck/rev6:vial 编译。编译出来的固件在
.build/planck_rev6_vial.bin。之后下载安装 QMK
Toolbox,按住键盘最左上角的键的同时插入 USB 口,QMK Toolbox
里会显示检测到 DFU 设备,Flash 按钮也会变得可用,点 Flash
就可以烧入新的固件啦。之后安装好 Vial,打开就会自动识别出 Planck
键盘,不过这个是使用官方的默认 keymap,还需要的另一个一次性操作就是在
Vial 的 UI 上手工配置一下自己喜好的 keymap,之后可以导出为一个 json
文件作为备份。我把自己导出的 keymap 放在 github
了,感兴趣的同学可以参考,不过其实主要是给若干年后的自己……还好之前玩键盘的时候很多东西都做好了备份和文档,否则今天突然再捡起来真是完全摸不着头脑,所有东西都忘干净了。
最后最重要的是尝试 QMK 对 Mod Tap 支持加的新功能,在官方的 Tap-Hold Configuration Options 页有所有选项的详细文档,并且所有这些选项都可以在 Vial 里实时设置(在 QMK Settings - Tap-Hold 页),按照自己的喜好设置即可。
前面还提到了 RMK,这是一个比较新的用 Rust 写的键盘固件框架,直接支持 Vial,不过目前用户群体还没有 QMK 那么大,键盘支持需要自己添加。而且他默认是像 ZMK 一样使用 uf2 bootloader,键盘会模拟出一个 U 盘,直接把固件文件复制进去即可。但是我的 Planck 上的 MCU 用的是前面提到的 DFU bootloader。因为 RMK 还比较新,网上文档和示例都还比较少,移植起来感觉会很费劲,于是我抱着试一试也不吃亏的心态直接把 Planck QMK 固件的代码和 RMK 的文档丢给 Claude Code 让他去做移植,它真倒腾出来一个 bin 文件让我可以用 QMK Toolbox 烧录,不过烧录进去之后键盘直接变成了砖头。为了把原来的 QMK 固件烧回来,我需要让键盘进入 DFU 模式,但是砖掉的键盘左上按键已经不 work 了,所以必须要使用 PCB 上的 reset 按钮,正发愁是不是又平添了很多麻烦需要把键盘整个拆开,突然发现这个(之前 Group Buy 买的别人设计的)TYPEAU.40 的 Planck 金属外壳底部居然开了一个小孔,用展开的曲别针可以直接按到 PCB 底部的 reset 按钮,按住 reset 再连接 USB,就能立刻进入 DFU 模式了。真是意外原来做一个键盘外壳还有这样的讲究,看来所谓好的“设计”就是要对整个领域足够熟悉,对各个方面都考虑周到,真正在许多不太常碰到的 corner case 的时候才会显示出不同设计的优劣啊。
之后我又让 Claude Code 尝试了几次,它每次都能“发现”新的问题,并开始调整什么时钟频率之类的超出我知识范围的东西,结果在连续变砖几次之后他宣告放弃,说自己看不出还能有哪里不对,但给了我很多建议,比如去向 ZMK 作者求助,换一个 RMK 直接支持的芯片,或者再仔细考虑考虑是不是其实 QMK 才是更好的选择,哈哈……鉴于我也没有想要去深挖这个问题,而且确实 RMK 看起来还在迅速发展的过程中,我决定接受他的第三条建议。
简单 Review 一下这一次头脑发热尝试的几款键盘。所有的评价都是依据个人主观喜好来算的。首先 Wooting 60HE v2 是 HE 键盘先驱 Wooting 新出的一款键盘,在上一代的基础上做了很多改进,不论是手感还是声音上几乎不需要做额外的改装就能媲美不错的定制键盘。
- 键盘布局: 标准 60% 键盘,无方向键和 tilde 键。
- 固件可定制性: 私有闭源固件,但定制软件 wootility 易用且功能强大。
- 硬件可定制性: 键轴可热拔插,兼容第三方磁轴,整个键盘容易拆卸再组装。
- 手感: 除了自带 Lekker Tikken 磁轴 42cN 初始弹力有点硬之外都很好。
- 声音: 声音很好听,略微有点响。
- 做工: 精致又扎实。
- 颜值: 紧凑好看,带子很特别(虽然我装反了)。
Keychron Q2 HE 8K 是来自中国的键盘厂商 Keychron 的一款磁轴键盘。
- 键盘布局: 65% 布局,无 tilde 键。
- 固件可定制性: 私有闭源固件,定制软件 keychron launcher 功能有限,且一些 QMK 特有功能键在这一款键盘上并未实现。
- 硬件可定制性: 键轴可热拔插,PCB 兼容各种磁轴。
- 手感: 很好,自带磁轴 30cN 初始弹力很适合我。
- 声音: 声音很好听,已经做过各种改善声音的措施。
- 做工: 很精致,但外延突出显得很笨重。
- 颜值: 白色款比较好看,黑色款一般。
布局和外形几乎一样的 Keychron Q2 QMK 几乎把 Q2 HE 8k 的优缺点反过来:固件是完全开源的,在官方 qmk 仓库里有源码可以直接编译,灵活性超强。但并不是磁轴,而且配色比较难看,做工也差了一节,声音方面特别是空格这样的大键听着有很大的回声(当然价格也便宜了一半多)。
Flow 2 68 是 Lofree 最近出的一款无线键盘(非磁轴,并且是 low profile 键轴)。固件不开源,但支持使用 VIA 定制,不过需要从一个奇怪的 Dropbox 链接(搜索 lofree flow 2 via json 可以在一个 reddit 贴找到链接)下载一个 json 文件才行。
- 键盘布局: 65% 布局,无 tilde 键(默认放到右边)。
- 固件可定制性: 私有闭源固件,可以通过 VIA 定制。
- 硬件可定制性: 键轴可热拔插。
- 手感: 键轴手感不错,键帽明明有材质但很滑的感觉。
- 声音: 几乎静音。
- 做工: 很精致。
- 颜值: 很有现代感。
虽然并不需要使用 Home Row Mod,但是有了 Wooting 的高可定制磁轴键盘之后还是忍不住想尝试一下,尝试的目标主要是如下几个: 1. 验证一下磁轴是否对于 HRM 有所帮助。 2. 试一试微调一个最适合自己的配置。 3. 看一看自己打字是否有一些坏习惯会在 HRM 中暴露出来可以加以改善。 4. 体验一下 HRM 的优缺点,看自己愿不愿意长期使用。
第一个问题是非常明确的 YES,等以后磁轴更加普及,得到各种开源固件的广泛支持之后应该会让 HRM 的体验更进一步提升。因为 HRM 最大的痛点在于 ASDF 等键原本是在按下的时候就会上屏,现在为了确定是 tap 还是 hold,只能等到抬起来的时候才能做出判断,这导致在按这些键的时候会出现一个延迟,特别是其他的如 QWER 等键是直接会看到反馈的,对比起来延迟就更加明显,比较敏感的人会觉得输入有一种“随机”卡顿的感觉,把延迟夸张一点的话就仿佛是在丢包率很高的网络连接下在远程终端下输入。
改善卡顿的一个方法就是把 tap term 时长设得很短,虽然不能让延迟完全消失,但可以尽量缩短。问题在于必须要在 tap term 的时长限制内抬起按键,否则就会变成 hold 功能。通过改进自己的打字方式,用钢琴术语说就是使用更 staccato (断奏)而不是 legato(连奏)的方式去按键可以尽量缩短这个时间。HRM 在 low profile 键盘上更常见的其中一个原因也是 low profile 的键轴移动和回弹距离都很短,所以在手能跟上的情况下能做到很干脆的“断奏”。当然正常机械键轴的不同设计也有不同的 travel distance,比如 Wooting 的 Lekker Tikken 键轴是 4mm 左右,而 Gateron Jade Ultra 则更短,在 3mm 左右。
但磁轴的巨大优势是能够无视实际物理上的(最大)travel distance,通过固件的 rapid trigger 功能自由调控每一个按键的按下触发距离和回弹触发距离,这里尤其重要的是后者,磁轴能做到在手指刚刚抬起 0.1mm 的时候就触发 key release。如果自己打字按键动作比较干净的话,打开 HRM 八个键的 rapid trigger ,通常机械键盘常用的 200ms 的 tap term 至少可以降低到 120ms。
上图是我用这个 (vibe coding 出来的) 按键统计工具得到的正常状态和开启 Rapid Trigger 状态下数据对比。考虑每个按键的 hold 时间,mean / median / 90-percentile / 95-percentile 可以从 106ms / 103ms / 134ms / 142ms 降低到 85mm / 82mm / 108mm / 115ms,大概能降低 20~30 毫秒,按键重叠率也从 43% 降低到 26% 左右。我自己的使用体验是,如果不打开 rapid trigger,比较短的 tap term 会无意触发很多 modifier 键导致误操作,对我来说这是让 HRM 从完全不可用变得勉强可以尝试的必要功能。经过一两周的尝试和微调,我找到的比较适合自己的设置是:tap term 降低到 120ms,ASDF 等这八个 HRM 键开启 rapid trigger(按下是正常的 1.3mm 触发,放开是快速 0.1mm 触发)。
使用 HRM 暴露出来的打字过程中的“坏习惯”还不少,总之就是按键过程比较不干净,而且在不同的上下文(字母组合)的时候会有不同的行为。当然这些习惯是这么多年来使用键盘逐渐养成的,因为在正常键盘下面使用是没有问题的,所以并不能严格成为“坏”习惯,如果不是非要使用 HRM 的话,也没有纠正的必要。 从下面的统计图可以看到快速打字的时候两个按键之间的间隔,负数为重叠。
从下方重叠最长的 15 个样例里可以看到有不少是和 Shift 键重叠,这是 intended behavior,但也有不少是正常打字之间的重叠,例如“failing”中的 a 和 i 两个字母会有很大的重叠。当有重叠的按键组合涉及到 HRM 的几个按键时,就会比较麻烦了。如果不做任何特殊处理,以 a-i 为例,假设事件序列是:按下 a、按下 i、在 tap term 结束之前放开 a、放开 i,会出现的结果是上屏的是 ia 而不是 ai,因为 a 是 HRM 键,需要等到放开时才判定为输入 a,而 i 是普通键,在按下时就直接触发。所以在使用 HRM 的时候对于 tap term 内的重叠,通常采用的做法是直接判定前一个按键为 tap(在 Wooting 里有个 JIT 选项可以设置)。这样的选项通常可以解决大部分问题,但如果你习惯于快速按下 Shift 加上某个键来输入大写字母或者符号,在这样的规则下就会失败,如果两个按键间隔太短,则会判定为两个 tap,于是不得不在碰到 Shift 的时候有意放慢输入节奏,等待 120 毫秒。当然也有反过来的选项:把快速重叠直接判定为 hold,这样又会导致想 a-i 之类的字母组合在快速输入时误触发 modifier 键。
总而言之 HRM 要运用自如对于按键的操控要求还挺高的:为了缩短延迟而快打,需要的是每一个按键很快很干脆,而不是两个按键之间的间隔,但对于大部分人来说大概这两个因素是强相关的,从而导致一系列的问题需要用软件规则来做一些修补。好好奇钢琴高手会不会能按出很漂亮的统计图出来。
至于 HRM 的优缺点:优点自然是 ⌘、⇧之类的都更容易按了,熟悉之后还挺爽的,当然如果经常使用单手来按一些组合键(例如一只手在用鼠标,另一只手在按 ⌘+C、⌘+V)的话,HRM 的按键分配需要根据自己的需求合理配置一下,比如如果把 F 设置成 ⌘,那要按 ⌘+V 就很难了。缺点当然是需要练习和适应,从尝鲜和好玩的角度来说问题不大。而且我在两周的尝试之后也并没有能找到一个能完全防止误触的配置。此外即使按键能做到绝对干净,也还是无法完全消除延迟,如果你对于轻微的卡顿不太敏感,那应该问题不大,但是如果你对于不同按键上屏时间有 O(10mm) 的差距这件事情很敏感,那就会很痛苦了。
还有一个问题是在 Vim 里会使用 HJKL 来移动光标,需要长距离移动的时候会按住其中一个键,让他自动 repeat,但在 HRM 设定之下按住就变成了 Hold 功能。这其实是一个非常常用的需求,例如在 QMK 里有一个叫作 quick tap 的功能,可以在 tap 之后立刻 hold,就会变成 repeat tap key 的行为。Wooting 的固件目前还不支持这个功能,但其实 HRM 的许多优化功能也是最近刚加的,也许在不久的将来就会加上。
最终结论是:Home Row Mod 果然暂时还是不太适合我!