..

客制化键盘

引子

今年五月份我开始折腾键盘,陆陆续续买了四五把键盘,从头到尾组过键盘、编译过键盘固件、画过键盘外壳模型,花了不少时间。作这篇博文一是为了分享自己的客制化键盘体验,刚开始折腾键盘时,少见有人主动分享自己的按键设置,也少见各种配列的分享文章,入门只能在群里请教大佬;二也是为了给折腾键盘这事收个尾,工具只是工具,能更好地完成需求就是好工具,再折腾下去对效率提升不大,反而徒增烦恼,故留个记录退烧。

我之前用的键盘是 Anne Pro 2,它是一把蓝牙有线双模连接、60% 配列、不支持热插拔(樱桃红轴)的键盘。我在 2020 年底购置了它,它很好用,我最喜欢它的改键软件 ObinsKit,可以随意指定 fn 的位置,支持按键复用,比如我是 Emacs 用户,又同时使用 Vim,就很喜欢将 CapsLock 按键设置为短按 Esc 长按 Ctrl,省力不少。

但它实在是有点旧了,电池寿命衰退,蓝牙模式下不打开 RGB 只能使用大概十天左右,轴本身的弹簧音也因为用久了变得很重,所以我在物色新键盘。现在的量产键盘虽卷,却很难挑到满意的,我希望买一把同样是 60% 配列、无旋钮无屏幕,能方便改键的键盘,刷了很久没看到特别心动的。虽然 Anne Pro 2 后面又更新了一代支持热插拔,但还是想体验下新品牌。机缘巧合接触到了 40% 配列,在网上常刷到这个配列效率很高的评论,我很好奇,如果舍弃了数字键、部分符号键,还怎么保持效率呢?这颗小小种子就这样埋在了我心里。

Figure 1: Anne Pro 2

Figure 1: Anne Pro 2

关注键盘后,发现键盘形式多样,除了配列按键数量的不同,还有直列斜列的区别。我加了一个直列键盘讨论群,在群里了解到了普朗克配列(也即直列,所有按键都是 1u,整齐排列),因为按键大小统一,方方正正,很有美感,另外还了解到了直列分体,比如 46 直列分体键盘,如下图。

Figure 2: 46 直列分体键盘

Figure 2: 46 直列分体键盘

但是这样的键盘还是太小众了,闲鱼上很少有卖家出售,群里也一直没有大佬开车。刷了几天后,我开始考虑另一把键盘,即 crkbd,也称 Corne 键盘。foostan/crkbd 是 GitHub 上一个开源的键盘项目,2018 年诞生,到现在能找到的资源不少。通常来说 Corne 是一把有线分体键盘(也有无线的版本),支持轴体热插拔,带有 RGB 和底灯(v3 版本),左右键盘通过 aux 音频线连接、各有一块屏幕,分体的任意一侧通过数据线连接电脑。当时正好看到闲鱼上一把 Corne 键盘在出售,价格合适,就直接拍下了。

Figure 3: Corne

Figure 3: Corne

第一次接触到这把键盘的朋友可能会好奇,如此少的按键,怎么使用?其实这些 DIY 键盘都有很成熟的改键方案,比如 Corne 通常使用 QMK 固件,通过 Vial 改键(Vial 是 VIA 改键的分支,此 VIA 非 Via)。像这种 40% 配列的键盘,一般是通过层、按键复用、按键覆写、宏来实现常规键盘的功能。

  1. 层(Layer)。层相当于重新分配键盘上每个按键的功能,比如默认层是字母层,按下切层键(切层键要放到默认层)切换到如数字层、符号层,甚至还可以为你的常用软件分配独立的层;层切换可以是按住时切换(抬起时恢复到默认层),双击时切换(在对应的层里再设置切到默认层的按键)。
  2. 按键复用(Quantum,Tap Dance)。按键复用就是把一个按键当多个按键使用,比如将 CapsLock 设置为短按 Esc 长按 Ctrl。除了设置短按长按时的按键,还可以设置连击时按键。
  3. 按键覆写(Key Overrides)。按键覆写可以让你重新定义按键配合修饰键的行为,我一般是用在媒体键上,比如我的系统按键层有一个音量加键,Shift + 音量加 = 音量减,Control + 音量加 = 切换静音。
  4. 宏(Macros)。宏主要是为了简化操作,比如 macOS 默认的区域截屏到剪贴板的快捷键是 Control + Command + Shift + 4,我会直接把它设置为宏,放到系统按键层里。

讲到这就顺便说说我的按键配置思路。按键配置因人而异,我看过不少人的按键配置,几乎没有完全相同的,主要还是看个人的需求,在使用过程中边用边调整。我的想法是尽可能保证原来斜列的习惯,按照日常编程需要排列按键。

Figure 4: 默认层

Figure 4: 默认层

默认层将回车和退格放到拇指区,并将修饰键和切层按键主要放在拇指区。

Figure 5: 符号数字层

Figure 5: 符号数字层

符号和数字放在同一层,方便打出 3*(2-1) 之类的式子,同时按使用频率重新排列符号键。

Figure 6: 系统控制层

Figure 6: 系统控制层

系统控制层其实主要是鼠标层,M0 就是 macOS 截图的宏按键,音量、媒体控制、屏幕亮度我都用了按键覆写实现一键多用,节省按键。鼠标键主要分配给了右手。

Figure 7: 游戏层

Figure 7: 游戏层

游戏层主要是不使用按键复用,避免误触带来的困扰。

我用了大概三天上手了 Corne,主要是通过重新学习打字的方式,跟着 typingclub.com 的教程把基础键位和符号键的课程过了一遍。

Figure 8: Typing Club 统计数据

Figure 8: Typing Club 统计数据

Corne 键盘的好处在于,如果你熟悉之后,打字时手腕不需要移动,省去了重新定位盲键的时间,大大提高了键盘使用效率。不过我的打字速度并不快,英文打字在 55WPM 上下,和那些动辄 100WPM 的大佬没法比,只是满足日常使用的水平。下图为 Emacs 中使用 speed-type 测试的结果。

Figure 9: 打字速度测试

Figure 9: 打字速度测试

另外,得益于 QMK 改键方案,我可以使用鼠标键。鼠标键功能我非常喜欢,它允许你使用按键模拟鼠标指针上下左右和鼠标左键右键那些行为。我个人不排斥使用鼠标,但有时手在鼠标和键盘之间来回切换,很影响效率,我之前一直用下面几种方式来避免这种情况:

  1. IDE 中使用 Vim 键位和快捷键。IntelliJ 有 Vim 插件,功能实现的比较全面,除了支持常规的光标移动外,也支持窗口管理和标签切换。VSCode 也有 Vim 插件,支持方面和 IntelliJ 差不多。Xcode 对 Vim 的支持糟糕一些,只支持 Vim 光标移动的键位,窗口管理和标签切换未实现。我的经验是 Vim 键位和 IDE 快捷键都能实现需求时,优先使用 Vim 键位,比如 Control + ] 跳转到方法或变量定义,就优于 IDE 的按住 Command 点按鼠标左键。
  2. 浏览器使用 Vimium 插件。Vimium 插件允许你通过 Vim 键位控制网页,大部分情况可以满足基本的浏览需求,但一些需要捕获按键事件的网页(比如键盘按键测试网页)就不能使用了。
  3. 系统应用切换和窗口管理使用第三方软件。应用切换我使用 Alfred,这个不用过多介绍吧,使用 macOS 的朋友应该都熟悉,就是类似系统 Spotlight 那样的检索工具。窗口管理则是使用 Amethyst,这是一个开源软件,支持按特定规则自动平铺应用,支持自由配置键位实现应用焦点切换,比如我就配置了 Shift + Option + J/K 将当前焦点切换到上/下一个应用。

这三种方式可以覆盖大部分鼠标需求,但还是会碰上比如 QQ/微信 切换聊天窗口、翻阅聊天记录等不可避免用回鼠标的情况。这类对鼠标精度要求不高的场景,完全可以用鼠标键处理。QMK 的鼠标键控制鼠标移动虽然只能直上直下,但习惯后,还是比把手移动到鼠标区快不少。

Corne 用熟练之后,我就又买了另一把 Corne 备用,毕竟上手之后就很难再用回常规的斜列键盘了。得益于 Corne 的资料丰富,闲鱼上物料也很多,像我这样完全不想自己焊接的人,也可以直接买到焊接好的 PCB(120 左右,感谢开源,感谢中国制造),到手后安装好主控和屏幕(主控是 rp2040,屏幕就是支持 SSD1306 驱动的 0.91 寸 oled 屏幕,总共大概 50 左右),再用 3D 打印机打印外壳和定位板就可以简单组装使用了(如果没有 3D 打印机也可以直接在淘宝上订购亚克力外壳,图纸就在 GitHub 仓库中,定制三套外壳大概 50 左右)。我之前为了折腾 Corne 屏幕做层显示,自己修改和编译过固件,所以没有编译固件和刷入固件这方面的困扰。固件编译很容易被网络问题卡住,代码修改上的问题很少(QMK 文档很全面),整体难度不高,还是比较容易上手的。当然如果你对固件编译不熟悉,我更推荐直接购买成品。

Corne 用熟练之后,在键盘讨论群里又看到了大家对曲面分体的讨论,似乎更顺手,因为是曲面,会比平面更符合人体工学。

曲面分体键盘变体很多,目前常见的大概有几类,比如 Dactyl 键盘,里面按照配列不同可以分为 Scylla(4x6+5)、Skeletyl(3x5+3)、TBK Mini(3x6+3);比如 Cygnus 键盘(天鹅座),也有 3x5、3x6、4x6 这样的子类。

Figure 10: 天鹅座

Figure 10: 天鹅座

因为曲面键盘焊接大多是飞线,所以一般是不支持热插拔和 RGB 的,但现在支持热插拔的曲面分体也多了起来,我正好在闲鱼刷到一把 Scylla 键盘,不带 RGB,支持热插拔,价格合适,就入手了。

使用这些小众键盘还是需要折腾的,比如我入手的 Scylla 键盘,原作者直接使用了官方编译的固件,导致无法使用鼠标键。这个功能对我来说很重要,好在键盘本身是开源的,花了一晚上时间,找到了官方固件代码,简单修改,开启鼠标键支持重新编译后刷入了。当然折腾与否主要还是取决于你的需求。现在像 Corne、Sofle、Dactyl 这类键盘,有线方案一般使用 rp2040 主控,内存已经不再是限制,Vial 支持通常是功能全开的。

曲面键盘的体验和平面键盘是很不一样的。曲面键盘通过抬高和放低特定区域,使得手指正好舒服地落在相应按键下,触手可及,习惯之后会有一种愉悦感。

Figure 11: Scylla

Figure 11: Scylla

在使用一段时间后,我觉得 Scylla 的按键数还是多了些,数字区还好,拇指区五个按键确实太多了,而且最靠下的两个按键会挡住其上方的两个按键,像我都是不安装最下方两个按键的键帽使用。

现在让我选一个合适的配列,我会更倾向 3x6+3,即拇指区三个按键,主区 3x6 直列 1u 排列的方案,比如下图的 TBK Mini。

Figure 12: TBK Mini

Figure 12: TBK Mini

配列大体因人而异,我讲讲为什么我更青睐 3x6+3 的布局。我认为 3x6+3 的布局正好是兼容了手腕移动和按键合理的最简布局。主区 3x6 在使用过程中正好不需要移动手掌。如果增加一行数字区到 4x6,在按数字区时,手掌是需要上移的。如果往下精简到 3x5,字母区就不可避免要和修饰键共用按键,共用按键带来的延迟问题和冲突问题很麻烦,比如把按键 A 指定为短按 A、长按 Ctrl,那很可能会出现连打过程中 A 未按预期出现及 Control + A 这样的快捷键难以按出的问题。而拇指区,三个按键正好可以覆盖 Option(Alt)、Command(Win)、Space 三个按键,太多了拇指按不过来,移动范围太大,太少了这三个基础按键就要挤压切层按键的数量了,会让切层变得麻烦。

尾巴

絮絮叨叨说了很多,感谢你看到这里。