SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor · 更新于 2026-08-22

Linux 如何切换到 Colemak 键盘布局

了解如何在 Linux 文本控制台、X11 和 Wayland 设置 Colemak,为什么 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

最后一条命令应输出 colemak 和 colemak_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 切换过来的用户,两种布局都需要重新学习一次,因此应根据舒适度选择,确定后就不要反复更换。第二次切换布局的成本大致与第一次相同,因为需要重新建立的是与按键位置绑定的运动记忆。如果你仍未决定是否要离开 QWERTY,请先查看 Colemak、Dvorak 和 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: us 和 X11 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 根手指下方。

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

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

或者,将右手所在位置、原先对应 hjkl 的 4 个键重新映射。在 Colemak 布局中,这些键输入 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 原本就是向左移动。最后两行恢复被替换的命令:l 启动插入模式,k 重复上一次搜索。大写键也要进行相同处理,否则按 Shift 加光标键时会出现意外行为。

Vim 的 langmap 选项可以用更少的行实现类似功能:

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

每一对映射表示你输入的字符,后面跟着 Vim 应执行操作的字符。它只对普通模式生效,因此插入模式仍会正常输入 Colemak 文本。Vim 自带帮助文档说明了两个限制: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 中,请在“设置”中添加这两种输入源;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 连接到 VPS,则不需要。SSH 传输的是字符,因此键盘布局会在发送前由您的笔记本电脑处理。服务器收到的字节与 QWERTY 用户输入的字节相同。例外是服务商面板中的浏览器控制台。它会将虚拟机连接为键盘,并使用服务器自己的控制台键盘映射。SSH 失败时,该控制台是您的救援通道。因此,只有在确认无误后才修改它,并在 SSH 仍可用时进行测试。

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

两者都只需从 QWERTY 重新学习一次。因此,应根据舒适度选择,而不是考虑迁移成本。Colemak-DH 会重新放置 D、B 和 G,并交换 H 与 M。原因是标准 Colemak 使用食指伸向中间列来输入 D 和 H。XKB 变体名称为 colemak 和 colemak_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 则使用系统设置中的“布局”页面。