⌨️ 优化键盘布局,改善生活福祉


2025-12-22

Keyboard

Dev

前言

我过去一直在使用一个基于 QWERTY 的简单改造的键盘布局,核心映射是将 Cmd/Ctrl 键与 Capslock 互换,然后将 Cmd+U/I/O 映射为 & * _ 这样的,写 Rust 和 C++ 时常用的符号。但是经过长期使用,我发现这个方案对于左手小拇指的工作压力很大。

  • 无论 Shift 和 Cmd 都被交给了小拇指
  • QWERTY 的键盘布局还将很多编程常用的符号交给了 Shfit 与其它按键的组合键(如<>+:?)
  • 某些大写驼峰式的命名规范中要频繁按 Shift(Unreal 的命名规范是左小拇指地狱)

所以我决心重新设计自己的键盘布局。

新的键盘布局

地球的程式师们在过去已经开发出了多种优化编程体验的键盘布局,我参考了他们的设计。两个比较经典的设计范式是“层级”和 “Home Row Mod”。前者的思想是允许键盘有不同的虚拟输入层,后者则是一种安排修饰键的方式。我的新布局使用了上述两种范式,并仍基于 QWERTY。在设计时,我保留了许多 QWERTY 的特征,使得自己不会忘记如何使用别人的键盘,同时也让其它人能够使用我的键盘。

还需要说明一下的是,这次键盘布局改造是基于软件的而非硬件的。软件名称为 Kanata ,这是一个同时支持 MacOS、Windows、Linux 的开源的按键映射工具。我使用的物理键盘仍然是一个 68 键 QWERTY 布局的普通键盘。

布局设计

Kanata 支持层级设计,在 Kanata 中,键盘默认状态是名为 base 的层。因此我也用 Base 来称呼键盘的初始层或叫默认层。

我的 Base 层是其它层的入口,它采用了 Home Row Mods 范式,其思想是将手自然放置时的 8 个按键,在按住时变为修饰键,而点按时仍然是原来的键。具体映射如图所示。此外我的 Base 层还对两个符号位做了一点改变,我将 ; 改为了 回车 改为了 : , 不用担心因此这些符号丢失,我在符号层中给他们留了位置。将回车改近的好处不必多说, : 作为 Vim 中常用的按键,使用频率要远高于单引号,所以做了这样的设计。

在 Kanata 和其它按键映射软件中,按键可以采用名为 tap-hold-release 的模式,其行为是当按键被按下并段时间内被松开时,发送键 <A> ;当按键被按住(没有松开)并且用户在这个过程中按下并松开了其它键,则发送键 <B> 。A 和 B 可以自由设置。

Command 层:Cmd 修饰和 Vim 风格移动

我的设计中,Command 层是在按下 Command(MacOS 上)或 Ctrl(Windows 上)时进入的层。这一层让我可以使用 Vim 风格的光标移动方式。其行为可以直观地理解成: Cmd+H → 左, Cmd+J → 下……此外,图中没有写出行为的部分都是 Cmd+按键 的行为。

由于 Base 层将 F 和 J 映射到了 Cmd,所以可以使用 F+H/J/K/L 的方式来输出方向键, J+C/V 进行复制粘贴等等便利的事情。

Altaction 层:快速光标操作与退格

Altaction 层与 Command 层类似,也是允许我在 vim 系软件外使用 vim 风格的方式操作光标。不过其光标移动以单词位单位。映射到的目标,在 Windows 上就是 Ctrl+方向键 ,在 MacOS 上就是 Option+方向键 。我暂称其为 Altaction(因为 Option 在 Kanata 的物理按键名称还是 Alt)。此外,Altaction 层的空格键被映射成了退格键,删除单个字符就不用将手移到键盘右上方再移回来了。

所以我可以使用 S+H/J/K/L 来快速移动光标, S/L+空格键 来输出 退格键

符号层:便于输入符号而不移动手掌

符号层如其名,包含了各种符号。按住空格触发符号层。符号层的布局设计经过自身的使用经历的检验,在刚设计的两周间经过了反复地修改。最终,我定下了如图所示的现在这个设计。如果你好奇为什么这样安排,可以跟随下面的文字阅读图片。

  • 第二行前半部分来自原来数字键位 Shift 下输出的符号,它们本身使用频率不高不低,这样设计可以降低记忆成本,而 U/I/O 是右手的黄金位置,我给它们分配了 C++ 和 Rust 很常用的三个符号 & * _
  • 第三行是整个键盘的黄金位置,我在里面放了编程中十分常用的符号: - > 的组合在一些语言中经常见到,因此挨在一起; { [ 较常用,但在大部分时候会被 IDE 补全另一半,所以只将前半部分放在了这一行; , . / 是在终端经常输入。至于为何 ( ) 被放在了第三行,是因为我发现我的右手按 N 和 M 要比 H 要更舒适。而 ( ) 在各类编程语言中出现的频率都很高,因此将 N 和 M 的黄金位置留给了括号。
  • 其它位置中, ; “ 被 Base 层占据,所以放到了符号层。同时 在我常用的编程语言中的使用频率更高,所以把它放在了更好按的位置, 被放到了其下面。

大写状态:便于输入 UPPER_SNAKE_CASE

大写状态是为了输入 UPPER_SNAKE_CASE 的时候设计的。我将 Shift 的点按设计为进入大写状态,在大写状态下我输出的任何字母字符都是大写,大部分符号字符也是带有 Shift 修饰键的(主要是 - 要变为 _),想要退出大写状态,只要按下空格或点按 Shift。

游戏层:没有映射

这就是一个没有任何映射的遵循原本物理按键的层。当我玩游戏时或别人使用我的电脑时使用。按 Shift+ESC 可以在游戏层和 Base 层切换。

使用 Kanata

我十分推荐阅读官方文档 Kanata Configuration Guide 来了解 Kanata 的使用方式。它写得清楚和全面。

也欢迎查看我的配置仓库作为参考:

https://github.com/gloridifice/my-kanata-config