SSD Nodes Learn 🎉 VPS $4.99/月起
指南 Matt Connor作者: Matt Connor

Linux 如何切换到 Colemak 键盘布局

了解如何在 Linux 文本控制台、X11 和 Wayland 中设置 Colemak 或 Colemak-DH,为什么 SSH 服务器通常无需配置,以及切换后 Vim hjkl 和 Ctrl 快捷键会如何变化。

Linux 中 Colemak 布局的位置

Linux 中的 Colemak 不是单一的系统级设置。键盘布局由当前读取键盘输入的组件应用,因此它位于以下三个位置之一:文本控制台、X11 服务器或 Wayland 合成器。设置错误的层后,通常不会看到任何变化。

还有第四种方式可以完全绕过操作系统。具有自身固件重映射功能的键盘(例如运行 QMK 或 VIA 的键盘)会发送您需要的字母对应的键码。因此,将它插入任何机器后,都无需配置即可使用 Colemak,包括服务器控制台和不属于您的机器。代价是,笔记本电脑键盘仍会输入 QWERTY。

本指南的其余部分介绍这三个软件层,说明远程服务器几乎从不需要其中任何一层,并解释切换布局对 Vim 和终端快捷键的影响。

检查系统已有配置

在进行任何修改前运行以下命令。这些命令会显示当前设置,以及 X 键盘数据库提供的 Colemak 变体列表。

localectl status
setxkbmap -query
localectl list-x11-keymap-variants us | grep colemak

最后一条命令应输出 colemakcolemak_dh。Colemak 已经在 xkeyboard-config 中提供多年。Colemak-DH 在 2.34 版本中加入,因此只有较旧的版本会缺少它。截至 2026 年 8 月,Ubuntu 24.04 和 Debian 13 随附的版本都比该版本更新。

如果 setxkbmap -query 报告无法打开显示,则表示您处于 Wayland 会话中,键盘布局由合成器管理。该情况将在下面的专门章节中介绍。

Colemak 或 Colemak-DH

Colemak 将17个按键移出 QWERTY 的原位置,保留了10个按键不变,其中包括 Z、X、C 和 V,因此撤销、剪切、复制和粘贴快捷键仍位于左手熟悉的位置。这种兼容性正是该布局采用当前设计的原因。

Colemak-DH 是 Colemak 的一种修改版。它重新安排了 D、B 和 G,并交换 H 与 M 的位置,因为标准 Colemak 需要用食指伸向键盘中间列,同时输入 D 和 H。官方修改版保留了 Colemak 中每个字母对应的手指,因此 Colemak 用户改用 DH 时只需适应少量变化,而不必重新学习整个布局。XKB 变体为 colemak_dh;对于左 Shift 旁边带有额外按键的键盘,则使用 colemak_dh_iso

从 QWERTY 切换时,无论选择哪一种都需要重新学习一次,因此根据舒适度选择即可,不必反复更换。第二次切换布局的成本大致与第一次相同,因为需要重新建立的是与按键位置相关的操作记忆。

在 X11 中使用 setxkbmap 和 localectl 设置 Colemak

setxkbmap us -variant colemak
setxkbmap -query

现在,setxkbmap -query 应报告 variant: colemak,在任意窗口中输入时都应生成 Colemak 字符。此更改仅在 X 会话持续期间有效,不会写入磁盘,因此适合安全地试用该布局一小时。

要让设置在重启后仍然生效:

sudo localectl set-x11-keymap us pc105 colemak
localectl status

参数顺序依次为布局、型号和变体。现在,localectl status 应显示 X11 Layout: usX11 Variant: colemak。除非添加 --no-convert,否则 localectl 还会将该设置转换为最接近的控制台键盘映射,因此在许多系统中,这条命令也能同时覆盖 tty。对于 Debian 和 Ubuntu,之后请检查 /etc/default/keyboard,因为 console-setup 启动时会读取该文件。

在 Wayland 上设置 Colemak

Wayland 会话没有可供配置的 X 服务器。合成器会加载键盘映射,并将其传递给每个应用,因此布局属于合成器设置。这就是 setxkbmap 在 Wayland 上表现异常的原因:它要么找不到显示器,要么只修改 XWayland,而原生 Wayland 应用会忽略该设置。

在 GNOME 中,该设置是一个 gsettings 键:

gsettings set org.gnome.desktop.input-sources sources "[('xkb', 'us+colemak')]"

设置会立即生效,无需注销。字符串 us+colemak 表示布局和变体,两者使用加号连接。

在 sway 中,将其写入 ~/.config/sway/config

input type:keyboard {
    xkb_layout us
    xkb_variant colemak_dh
}

使用 swaymsg reload 重新加载配置。swaymsg -t get_inputs 会列出所有输入设备及其正在使用的布局。当只有一个键盘出现异常时,应运行此命令进行检查。

在 KDE Plasma 中,打开“系统设置”,然后依次选择“键盘”和“布局”,添加带有 Colemak 变体的 English (US)。

设置文本控制台的 Colemak 帐户

控制台是通过 Ctrl+Alt+F3 进入的纯文本 tty,并且使用独立的键盘布局。在 X11 或合成器中设置的内容不会应用到控制台。如果您在纯虚拟控制台上的终端工作台中工作,这一点很重要。

在 Debian 和 Ubuntu 上,编辑 /etc/default/keyboard

XKBMODEL="pc105"
XKBLAYOUT="us"
XKBVARIANT="colemak"
XKBOPTIONS=""

然后应用设置:

sudo setupcon

在控制台中输入内容进行确认。console-setup 使用 ckbcomp 将该 XKB 描述转换为控制台键盘布局,因此在这些系统上,控制台和 X 共用同一份描述。

对于直接使用 kbd 键盘布局的发行版,请先查询名称:

localectl list-keymaps | grep -i -e colemak -e latin9
sudo localectl set-keymap en-latin9

kbd 软件包提供的 Colemak 控制台布局为 i386/colemak/en-latin9,因此通常应传入 en-latin9,而不是 colemak。请传入列表中存在的名称,因为不存在的名称会被拒绝。

sudo loadkeys en-latin9 会立即修改当前控制台,sudo loadkeys us 会将其恢复。将 loadkeys 视为测试操作,而不是配置操作:它只持续到重启;在 Debian 和 Ubuntu 上,启动时运行的 setupcon 会恢复 /etc/default/keyboard 所指定的设置。

无界面 VPS 需要配置 Colemak 键盘布局吗?

几乎不需要,理解原因很重要。SSH 传输的是字符,而不是按键位置。终端模拟器接收按键,您本地的键盘布局将其转换为字符,只有该字符会通过连接传输。服务器收到 n,无法知道生成它的是哪个物理按键。因此,您在笔记本电脑上设置的布局会应用于每个 SSH 会话、tmux 以及您在远程运行的每个编辑器,远程计算机完全不需要配置键盘。

在生产服务器上开始编辑键盘配置文件之前,请记住这一点。如果您 管理 Linux 服务器集群,键盘布局属于您面前的设备,而不属于整个服务器集群,因此不应纳入服务器初始化配置。新 VPS 上的前 10 分钟可以完成比这更有用的工作。

有两个例外需要提前规划。第一个是直接连接到计算机本身的控制台。服务商面板中的浏览器控制台通常会将自身作为键盘呈现给虚拟机,因此按键会以扫描码形式到达,服务器自身的控制台键盘映射决定显示哪个字符。这是服务器上设置的键盘布局会生效的唯一场景;SSH 停止工作时,您也需要通过它进行救援,因此控制台键盘映射配置到一半就停止会带来实际风险。

串行控制台的行为不同,因为它传输字符,并且使用您本地的键盘布局。第二个例外是共享计算机。控制台键盘映射对整个系统生效,因此在其他人也会登录的服务器上设置 Colemak 也会改变他们的布局,而他们不会知道原因。

Vim 的 hjkl 键会怎样

在 Colemak 布局中,h 不会移动。其他 3 个键仍然会移动。j 位于 QWERTY 布局的 Y 键下方,k 位于 QWERTY 布局的 N 键下方,l 位于 QWERTY 布局的 U 键下方,因此光标键分布在 3 行,而不是由 4 根手指下方的按键组成。

有 2 种可行方案,并且两种方案都有实际用户。

保留默认设置,重新记忆这些按键的位置。这样不会破坏设置中的其他内容,所有插件都能继续工作,其他人编写的 Vim 教程也仍可完全适用。

或者,将右手下方、原本对应 hjkl 的 4 个键重新映射。在 Colemak 布局中,这 4 个物理按键对应 h、n、e 和 i。在 Colemak-DH 布局中,相同的 4 个物理按键对应 m、n、e 和 i,因为 DH 将 H 和 M 互换了。

noremap n j
noremap e k
noremap i l
noremap l i
noremap k n

n 现在向下移动,e 向上移动,i 向右移动,h 原本就是向左移动。最后 2 行恢复被替换的命令:l 启动插入模式,k 重复上一次搜索。大写字母也要进行相同处理,否则 Shift 加光标键的行为会令人意外。

Vim 的 langmap 选项也能完成类似工作,而且所需配置行数更少:

set langmap=nj,ek,il,li,kn

每一对映射表示你输入的字符,后面跟着 Vim 应执行操作的字符。它只对普通模式生效,因此插入模式仍会正常输入 Colemak 文本。Vim 自带帮助文档说明了 2 个限制:langmap 不适用于 Ctrl 或 Alt 组合键,并且针对默认按键编写的插件映射在启用该选项后可能出现异常。

无论选择哪种方案,都应一次确定。一个月后放弃的重新映射,会让你再浪费一个月。

终端快捷键会发生什么变化

终端控制码由字符产生,而不是由物理按键产生,因此所有 Ctrl 快捷键都会随键盘布局移动。Ctrl+C、Ctrl+Z、Ctrl+X 和 Ctrl+V 会保持原来的位置,因为 Colemak 有意将 Z、X、C 和 V 保留在 QWERTY 中对应的位置。

您每天使用的 4 个快捷键会移动。Ctrl+D 用于结束输入,在新布局中位于 QWERTY 的 G 键位置。Ctrl+R 用于搜索历史记录,位于 QWERTY 的 S 键位置。Ctrl+E 用于跳到行尾,位于 QWERTY 的 K 键位置。Ctrl+U 用于清除整行,位于 QWERTY 的 I 键位置。

tmux 会保留默认前缀,因为 B 在 Colemak 中不会移动。在 Colemak-DH 中,B 会移动到顶排,前缀也会随之移动。如果您在 VPS 上保持 长时间运行的 tmux 会话,这会是您最先注意到的变化。将前缀重新绑定到您习惯的按键只需修改一行配置,而且比重新训练同一个条件反射更简单。

桌面快捷键遵循相同的规则。Super+E 上的绑定会随布局移动,因为它由字符定义。Super+F1 上的绑定会保持原位,因为功能键不会被键盘布局重新映射。

切换需要付出多长时间

没人能准确说出你的双手需要多久。触摸打字依靠运动记忆。你不是在学习字母位于哪里,而是在重建将单词转换为手指动作序列的反射。因此,唯一有帮助的输入是实际打字的时间。

人们报告的情况——这些是自行记录的练习日志,并非受控测量结果——通常是:第一周的速度远低于原来的水平,并在每天使用后的1到3个月之间恢复到原来的速度。个体差异很大,因此应将这些数字视为大致趋势,而不是固定计划。

有两个习惯会让过程变慢。一天中在 QWERTY 和 Colemak 之间来回切换,会让两套反射都不够稳定。因此,大多数完成切换的人都会在主要设备上完全采用新布局。忙碌的一周开始练习,会让你在时间压力下低效打字,并训练出低头看键盘的习惯。

请在需要之前就设置好恢复原布局的方法,因为你再次需要 QWERTY 的时刻,往往正是某个东西发生故障且有人正在等待的时候。

如何快速切回 QWERTY

在 X11 中,setxkbmap us 会立即恢复 QWERTY。在控制台中,sudo loadkeys us 的作用相同。要撤销持久化设置,请运行 sudo localectl set-x11-keymap us

切换方式比在尚无法输入的布局中键入命令更实用:

setxkbmap -layout us,us -variant colemak, -option grp:win_space_toggle

此命令将 Colemak 设为第一个布局,将普通 US 设为第二个布局,并通过 Super+Space 在两者之间切换。colemak, 末尾的逗号不是笔误:它为第一个布局指定 colemak 变体,为第二个布局指定无变体。在 GNOME 中,请在 Settings 中添加这两个输入源,Super+Space 已可用于切换。

有两个密码提示在桌面会话之外运行,需要分别处理。登录欢迎界面会在应用会话设置前启动,因此应通过注销来测试,不要仅凭设置内容判断。如果磁盘已加密,密码短语提示由 initramfs 运行,而 initramfs 使用自己的键盘布局副本。在 Debian 和 Ubuntu 上,修改 /etc/default/keyboard 后使用 sudo update-initramfs -u 重新构建 initramfs,然后重启一次进行测试,同时确保仍有其他方式访问这台机器。

是否可以让一个程序继续使用 QWERTY?

布局会在应用程序获取按键之前应用。X server 或 compositor 将扫描码转换为字符,再把字符交给应用程序,因此应用程序无法请求其他布局。它只能重新映射收到的内容。这就是 Vim 的修复需要写入 Vim 配置的原因,也是没有通用的按窗口布局切换开关可用的原因。

有两种方法可行。第一种是按设备设置。如果 QWERTY 输入来自单独的键盘,请在该设备上设置布局,而不是设置系统布局:

xinput list
setxkbmap -device 12 -layout us

xinput list 获取 id,并依次在每个键盘上输入内容进行确认。sway 也可以根据 swaymsg -t get_inputs 为每个输入标识符使用相同的设置;比 type:keyboard 更具体的选择器优先级更高。

第二种方法是在应用程序内部重新映射,就像 Vim 的 langmap 一样。游戏几乎总是提供按键绑定界面,在其中重新绑定移动键,比从外部对抗布局更省时。对于既没有按键绑定界面、也不支持应用内重新映射的程序,请绑定上面的布局切换键,并在启动程序前按下该键。

FAQ

我需要在 VPS 上设置 Colemak 吗?

如果您通过 SSH 连接,则不需要。SSH 传输的是字符,因此键盘布局会在发送前由您的笔记本电脑处理,服务器收到的字节与使用 QWERTY 的用户发送的相同。例外是服务商控制面板中的浏览器控制台。该控制台会将虚拟机作为键盘连接,并使用服务器自己的控制台键盘映射。SSH 失效时,控制台是您的救援通道。因此,只有在确认无误后才修改它,并在 SSH 仍可用时进行测试。

我应该学习 Colemak 还是 Colemak-DH?

两者都只需在 QWERTY 的基础上重新学习一套肌肉记忆,因此应根据舒适度选择,而不是考虑迁移成本。Colemak-DH 会重新安排 D、B 和 G,并交换 H 与 M,因为标准 Colemak 需要用食指向中间列伸展来输入 D 和 H。XKB 变体名称分别是 colemakcolemak_dh;对于左 Shift 旁边带额外按键的键盘,则使用 colemak_dh_iso。运行 localectl list-x11-keymap-variants us | grep colemak 可查看系统提供了哪些布局。

在 Colemak 下,Vim 的 hjkl 按键会怎样?

h 保持原位。j 移到 QWERTY 的 Y 所在位置,k 移到 QWERTY 的 N 所在位置,l 移到 QWERTY 的 U 所在位置,因此光标按键会分布在三行中。您可以重新学习它们移动后的位置,这样所有插件和教程都无需改变;也可以重新映射右手下的4个按键:Colemak 使用 h、n、e 和 i,Colemak-DH 使用 m、n、e 和 i。Vim 的 langmap 选项也能在普通模式下完成相同的工作,但它不适用于 Ctrl 组合键,并且可能导致插件映射混淆。

多久才能恢复到以前的输入速度?

预计需要数周而不是数天,因为这是运动记忆,唯一的输入方式是练习。用户自行记录的练习日志通常显示,第一周的速度远低于原速度的一半,并在每天练习1到3个月后恢复到原来的水平。每天在 QWERTY 和 Colemak 之间交替使用会延长这一过程,因为两种反射都无法稳定下来。

为什么 setxkbmap 在我的桌面环境中没有任何作用?

几乎可以确定是因为会话使用 Wayland。在 Wayland 下,合成器负责管理键盘映射,并将其推送给每个应用,因此 setxkbmap 要么找不到显示,要么只修改 XWayland,原生应用则会忽略该修改。请改为在合成器中设置布局:在 GNOME 中使用 org.gnome.desktop.input-sources gsettings 键,在 sway 配置中使用 xkb_variant,或者在 KDE Plasma 的系统设置中打开“布局”页面。

#colemak#keyboard#linux#terminal#productivity