Colemak Mod-DH 与标准 Colemak:如何选择及启用
Colemak Mod-DH 移动 6 个字母,将 D 和 H 放到食指下方。了解改动、适合切换的人群,以及 Linux 中如何启用 colemak_dh,系统不支持时如何处理。
Colemak Mod-DH 的改动
Colemak Mod-DH 是标准 Colemak 的变体,共移动了 6 个字母。D 和 H 从中间的两列下移到食指下方,G、B、V 和 M 则占据它们原来的按键。其他所有按键,包括最先学习的基准键,都与标准 Colemak 完全相同。
该变体的名称体现了它的改动。在标准 Colemak 中,D 位于标有 G 的按键上,H 位于标有 H 的按键上。这两个按键都在键盘的中间列。食指只有向侧面移动整只手才能够到这些按键,因此 Mod-DH 项目将它们视为这一优秀布局中最薄弱的部分,并将这两个字母下移了一行。
如果你还在学习键盘布局,请直接选择 Mod-DH,不必继续阅读对比内容。如果你已经能够不假思索地使用标准 Colemak 打字,那么你需要接受数周的打字速度下降,换取速度测试无法体现的舒适度提升。本指南会先准确说明改动,然后介绍 Linux 相关内容:应请求使用的变体名称,以及系统不提供该变体时的处理方法。
两种布局并排比较
标准 Colemak,仅字母键:
q w f p g j l u y ;
a r s t d h n e i o
z x c v b k m , . /Colemak Mod-DH,仅字母键:
q w f p b j l u y ;
a r s t g m n e i o
z x c d v k h , . /共有 6 个字母不同。可以将其理解为左手的 4 次移动和右手的 1 次交换,因此更容易看懂。左侧的变化是:D 从主行下移到底行,G 从顶行下移到 D 留出的中间列,B 上移到 G 原来的顶行位置,V 向右移动 1 个键位,填入 B 留出的位置。右侧的变化是:H 和 M 互换位置,使 H 位于食指下方,M 位于中间列。
将这些图按每行 10 列理解,因为矩阵式(正交排列)键盘就是这样构成的。在普通的错列键盘上,Mod-DH 左下角还有另一种排列方式,后文会进一步介绍。
为什么标准 Colemak 中 D 是个问题?
您的食指分别放在两个基准键上:左手标有 F 的键在两种布局中都输入 T,右手标有 J 的键在两种布局中都输入 N。每根食指还负责旁边的一列,即标有 G 和 H 的键。手指不够长,无法在不移动的情况下同时覆盖这两列,因此手必须横向移动,另外三根手指也会随之离开基准键。横向移动是盲打中代价最高的动作,而 Mod-DH 正是为了消除这一动作。
标准 Colemak 将 D 放在标有 G 的键上,将 H 放在标有 H 的键上,因此中间两列的按键都承载常用字母。Mod-DH 则按照上图的布局,将 D 放在标有 V 的键上,将 H 放在标有 M 的键上。在交错排列的键盘上,这两个键分别位于对应食指基准键右侧约半个键宽的位置,因此食指可以在自己的列内向下弯曲,手无需移动。接替中间两列的字母分别是左侧的 G 和右侧的 M。
这一论点是否成立,取决于各字母的输入频率。
The data behind this chart
[
{
"label": "H",
"frequency_pct": 6.1
},
{
"label": "D",
"frequency_pct": 4.3
},
{
"label": "M",
"frequency_pct": 2.4
},
{
"label": "G",
"frequency_pct": 2.0
},
{
"label": "B",
"frequency_pct": 1.5
},
{
"label": "V",
"frequency_pct": 1.0
}
]以下是普通英文文本中常见的已发布统计数据。根据统计语料库的不同,数值会有几个百分点的小幅变化,但排名保持稳定。在您输入的所有字母中,H 占 6.1%,D 占 4.3%,而 M 占 2.4%,G 占 2.0%,V 占 1.0%。Mod-DH 并没有消除横向伸展,而是将这种伸展用于低频字母,而不是高频字母;为此需要进行 6 次字母移动。
哪些内容保持不变?
- 左侧的主键位 A R S T 和右侧的 N E I O 不变。这 8 个键承担了你大部分的输入,也是你最先学会的 Colemak 部分。
- 顶排只有 1 个键不同:左侧为 Q W F P,右侧为 J L U Y 和分号键。
- 右手侧的标点键不变。
- 数字行和修饰键不变。
- 在 2 种布局中,绑定到 WASD 的游戏行为相同,因为这 4 个物理键在 2 种布局中都对应相同的字母。
有一项内容不会在切换后保持不变。标准 Colemak 将 Z、X、C 和 V 保留在 QWERTY 的原键位上,因此 Ctrl+Z、Ctrl+X、Ctrl+C 和 Ctrl+V 仍位于你从第一次使用计算机起就一直使用的手指下方。Mod-DH 需要使用左下行放置 D,因此这一组键必须让位。
目前有 2 种该区域的排列方式,且上面的示意图只是其中 1 种。普通排列将 Z、X 和 C 保留在标有 Z、X 和 C 的键上,并将 V 向右移动 1 个键,放到标有 B 的键上。angle mod 则将整组向左移动 1 个键,使左手食指弯曲后落在 D 上,而不是向右下方伸去按它。ISO 键盘在左 Shift 和 Z 之间有 1 个备用键,angle mod 会使用这个键。ANSI 键盘没有该键,因此 ANSI 版本必须重新安排 Z 的位置。由于 Z 是英语中出现频率最低的字母,这种调整尚可接受。
因此,打包变体名称中会包含键盘类型。选择与当前键盘匹配的变体,然后按标有 Z 的键。输出的字符会告诉你使用的是哪种排列方式,以及哪些编辑快捷键刚刚发生了变化。
是否应从标准 Colemak 切换?
- 您仍在学习,或仍在使用 QWERTY:选择 Mod-DH。它并不比标准 Colemak 更难学习,而且您以后无需再考虑本页内容。如果您还没有决定使用 Colemak,那么那是前一个问题;Colemak 与 Dvorak 和 QWERTY 的比较可帮助您做出决定。
- 您已经能熟练输入标准 Colemak:收益确实存在,但幅度很小,代价是数周的适应时间。仅更换 6 个字母就足以打破肌肉记忆,其中最重要的 2 个字母由食指负责,而它们出现在大量英语单词中。完成切换的用户表示,他们会经历几天输入速度极慢的阶段,并需要几周才能恢复原来的速度。
- 您已经拥有可编程键盘:这是成本最低的情况。更改只需构建一次固件,恢复原布局也只需再次构建。试用 1 个月,然后保留您更喜欢的布局。
- 您每天大部分时间使用另一种语言输入:上面的频率数据针对英语。接受这一论点前,请先检查您自己的语言,因为 D、H、G 和 M 在不同语言中的重要程度并不相同。
- 您的手感到疼痛:键盘布局只是多个影响因素之一,桌面高度、椅子、键盘和您每天坐在那里的时长也同样重要。不要指望只替换几个字母,就能解决其余设置导致的问题。
如何在 Linux 上输入 Colemak Mod-DH?
先确认系统中已有的布局。截至 2026 年 8 月,Mod-DH 变体已包含在 xkeyboard-config 中。所有桌面 Linux 都使用这个键盘布局数据库。
localectl list-x11-keymap-variants us | grep colemak当前系统会列出 colemak 以及 Mod-DH 条目。colemak_dh 是 ANSI 版本,colemak_dh_iso 是 ISO 版本,colemak_dh_ortho 用于矩阵键盘,colemak_dh_wide 和 colemak_dh_wide_iso 是宽版,会将右手区域向外移动一列。UK 布局也包含 Mod-DH 变体。如果使用 UK 键盘,请对 gb 执行相同的命令。如果 grep 没有输出,说明系统中的 xkeyboard-config 版本早于这些变体,下一节适用于这种情况。
在 X 会话中先测试,不要立即永久配置。
setxkbmap -layout us -variant colemak_dh
setxkbmap -querysetxkbmap -query 会打印当前生效的布局和变体,以便确认更改已生效。输入几句话,然后使用 setxkbmap -layout us 恢复。如果系统中不存在该变体,命令会失败并显示 Error loading new keyboard description,布局保持不变。
注意,该命令不会执行以下操作。它只影响正在运行的 X 会话,注销后设置就会消失;在 Wayland 下也不起作用,因为键盘映射由合成器管理。永久设置布局需要根据桌面环境分别配置,相关步骤已写在这里:在控制台、X11 和 Wayland 中永久设置 Colemak。其中的每一步都适用于此变体。该指南中凡是写作 colemak 的地方,都改为写作 colemak_dh。
如果系统没有 colemak_dh 变体怎么办?
有 3 种方式可以获得该布局,但它们失效的位置不同。
自定义 xkb 变体。 将按键定义写入 symbols 文件并注册该变体,然后像使用软件包提供的变体一样按名称使用它。这是相同的机制,因此行为也完全一致,并且同时适用于 X11 和 Wayland 会话。代价是需要维护:您在 /usr/share/X11/xkb 下编辑的文件属于 xkeyboard-config 软件包,升级时可能会被替换,而且每台需要配置的机器都必须重新安装该文件。
用户空间重映射器。 keyd 通过 evdev(内核输入层)读取键盘,再通过 uinput(内核的输入注入设备)写回重映射后的按键。重映射发生在任何显示服务器读取按键之前,因此同一个文件可同时覆盖 X 会话、Wayland 会话和纯文本控制台。将映射写入 /etc/keyd/default.conf:
[ids]
*
[main]
e = f
r = p
t = b
y = j
u = l
i = u
o = y
s = r
d = s
f = t
h = m
j = n
k = e
l = i
v = d
b = v
n = k
m = h每行表示:左侧指定的物理按键现在发送右侧指定的按键。未改变的按键无需列出。分号键需要双向更改,上面的示例有意省略了它:运行 keyd list-keys,获取您的构建版本使用的按键名称,然后添加对应的两行。加载配置并观察效果:
sudo systemctl enable --now keyd
sudo keyd reload
keyd monitorkeyd monitor 会输出 keyd 识别到的每个按键。通过它可以发现某个按键是否被重复重映射。启用 keyd 前,请先将系统布局恢复为纯 US QWERTY,因为 keyd 的输出仍会按照当前配置的布局解释。连续进行两次重映射会产生任何布局都无法匹配的字母。
键盘固件。 QMK、ZMK 和 Vial 将布局写入键盘内部。键盘直接发送您需要的字母,主机不会知道发生过重映射。使用 QMK 时,需要先构建再刷写:
qmk setup
qmk list-keyboards
qmk compile -kb planck/rev6 -km default
qmk flash -kb planck/rev6 -km default上面的键盘名称和键映射名称仅为示例。将 planck/rev6 替换为 qmk list-keyboards 为您的键盘输出的名称,再将 default 替换为包含 Mod-DH 布局的键映射目录名称。
如果键盘固件支持 Vial 或 VIA,也可以通过 USB 使用图形编辑器完成相同操作,因此无需编译器即可移动按键。
哪种方法可以在文本控制台中继续使用?
只有固件会始终跟随键盘。xkb 变体只属于一台机器上的一个会话。keyd 只属于一台机器,并且需要在该机器上使用 root 权限。键盘属于您自己:将它插入救援 shell、UEFI 设置界面、新安装的系统或串行控制台后,它仍会输入 Mod-DH,因为另一端无需了解任何配置。
这对远程操作的重要性低于许多人的预期,但对本地控制台更重要。通过 SSH 连接 VPS 时,服务器根本看不到您的布局:终端会将按键转换为字符并发送字符,因此远程机器的键盘映射与此无关。真正会受到影响的是您直接面对的控制台,例如启动失败后的救援 shell,或 您在备用 TTY 上长期保留的工作台。Linux 虚拟控制台有自己的键盘映射系统,与 xkb 分开,桌面环境设置不会影响它。
在 Debian 和 Ubuntu 上,控制台键盘映射由 ckbcomp 根据 xkb 数据生成,因此控制台可以使用相同的变体名称:
ckbcomp us colemak_dh | sudo loadkeys -该设置会持续到下次重启。要保留它,请在 /etc/default/keyboard 中设置 XKBLAYOUT 和 XKBVARIANT,然后运行 sudo setupcon。在没有 console-setup 的发行版上,您只能使用 kbd 附带的键盘映射,而这些映射大多是 QWERTY:在假定存在 Colemak-DH 映射之前,先使用 localectl list-keymaps | grep -i colemak 检查。如果不存在,keyd 是更简便的方案,因为一个文件即可同时覆盖控制台和图形会话。
切换后哪些设置会出问题?
两层重映射。 刷入 Mod-DH 的键盘,再将主机设置为 colemak_dh,最终输出的字符不会属于任何一种布局,因为两层映射会叠加。按下标有 S 的按键:键盘发送 R,主机布局将其识别为 R 键,然后输出 P。只在一个位置执行映射。
键盘对应的错误底排。 在 ISO 键盘上选择 colemak_dh,或在 ANSI 键盘上选择 colemak_dh_iso,会导致左下方附近的字母位置错误。切换后立即按下标有 Z 的按键,因为两种排列的差异就在这个区域。
登录屏幕。 GDM 和 SDDM 使用各自的键盘配置,因此会话使用的不是 QWERTY 时,密码提示符仍可能使用 QWERTY。keyd 和固件可以避免这个问题,因为它们在 greeter 绘制任何内容之前就已生效。
Caps Lock。 Colemak 发布的布局还会将 Caps Lock 改为 Backspace,但不同实现对是否包含此映射意见不一。切换后立即检查这个按键。等到输入句子中途才发现,体验很差。
速度暂时下降。 预计前两天的输入速度会差到让您考虑切换回原布局。这很正常,任何人更换布局都会经历同样的过程。
FAQ
如果我已经使用标准 Colemak,还值得切换到 Colemak Mod-DH 吗?
如果您已经可以不假思索地打字,通常不值得。共有 6 个字母发生变化,其中 2 个是常用的食指字母,这足以打乱您花费数月建立的肌肉记忆。切换过的用户通常会经历几天的极慢打字,并需要几周才能恢复原有速度。它带来的主要是舒适度提升,而不是速度提升:D 和 H 不再需要手部横向移动。如果您的食指感到不适,或者您使用的是可编程键盘、回退只需刷写一次固件,可以考虑切换。
Colemak Mod-DH 会破坏 Ctrl+Z、Ctrl+X、Ctrl+C 和 Ctrl+V 吗?
它会改变这一组快捷键中的一部分,而标准 Colemak 不会。标准 Colemak 将 Z、X、C 和 V 保留在 QWERTY 的原位置,因此这 4 个快捷键都仍在您预期的位置。Mod-DH 需要使用左下行放置 D,因此必须移动某些按键。在普通布局中,Z、X 和 C 保持不变,V 向右移动 1 个按键。在 angle mod 布局中,这组按键整体向左移动 1 个位置,并重新安置 Z。切换后按下标有 Z 的按键,即可查看您的实现实际提供了哪种布局。
如何检查 Linux 系统是否包含 colemak_dh 变体?
运行 localectl list-x11-keymap-variants us | grep colemak。其中列出的任何变体都可以按名称选择。在 X 会话中使用 setxkbmap -layout us -variant colemak_dh 测试,并使用 setxkbmap -query 确认。如果缺少该变体,setxkbmap 会输出 Error loading new keyboard description,布局也不会改变。这种情况下,您可以使用自定义 xkb 变体、keyd 重映射器或键盘固件。
Colemak Mod-DH 能在 Linux 文本控制台中使用吗?
不能单独使用。虚拟控制台有自己的键盘映射,由 loadkeys 加载,不会读取桌面环境的 xkb 设置。在 Debian 和 Ubuntu 上,ckbcomp us colemak_dh | sudo loadkeys - 会将 xkb 变体转换为当前启动周期使用的控制台键盘映射;在 /etc/default/keyboard 中设置 XKBVARIANT,然后执行 sudo setupcon,即可使设置在重启后保留。keyd 可以在任何发行版的控制台中工作,因为它在内核输入层执行重映射。键盘固件同样可以在控制台中工作,并且无需在计算机上安装任何软件。
应为键盘选择哪个 Mod-DH 变体?
应根据键盘的物理结构选择。colemak_dh 适用于 ANSI 键盘,即具有宽而平的 Enter 键和较长左 Shift 键的键盘。colemak_dh_iso 适用于 ISO 键盘,即具有较高 Enter 键、且左 Shift 与 Z 之间多出 1 个按键的键盘。colemak_dh_ortho 适用于列排列笔直的矩阵键盘。宽版变体会将右手向外移动 1 列,只有在您确定需要这种布局时才应使用。如果左下区域附近的字母输出错误,说明您选择了错误的变体。