macOS 下鼠须管 (Rime) 输入法配置与终端兼容性调优

2025年11月17日 | Ruichen Zhou
RimemacOSWezTerm输入法配置


macOS 下鼠须管 (Rime) 输入法配置与终端兼容性调优

在 macOS 上做开发时,输入法是每天都要打交道的工具。如果输入法在终端里有各种小问题,长期下来会很烦。

我使用的是 Rime 输入法引擎,在 macOS 上对应的前端叫 鼠须管 (Squirrel)。它的优点是可配置、跨平台、数据在本地;缺点是配置复杂、容易踩坑。

这篇文章主要记录几件事:

  • Rime / 雾凇拼音作为开源软件的大致背景;

  • 在 macOS 上安装鼠须管,并引入社区方案(雾凇拼音);

  • default.custom.yamlsquirrel.custom.yaml 做自定义;

  • 使用 Git 管理雾凇拼音,优雅更新词库;

  • 解决在 WezTerm 中遇到的几个具体问题:

    • Shift 切换时屏幕残留拼音;
    • 终端类 App 默认英文;
    • 小键盘回车行为和主键盘回车不一致。

WezTerm 的安装和详细配置可以单独写一篇,这里只会简单提一下。


一、Rime 与各平台前端

Rime 是一个输入法“引擎”,不同系统上用不同的“前端”把它挂到桌面环境里:

  • Linux

    • 通过框架集成:

      • IBus-Rime
      • Fcitx / Fcitx5-Rime
  • Windows

    • 前端叫 小狼毫 (Weasel)
    • 安装后在系统输入法列表里选择小狼毫
  • macOS

    • 前端叫 鼠须管 (Squirrel)
    • 本文主要讨论这一部分
  • Android

    • 比较常见的是“同文输入法 (Trime)”等

这几个前端的界面和集成方式不同,但底层的词库、方案、YAML 配置基本是一套逻辑。 这也是 Rime 的一个实际优点:配置可以在多平台之间复用(通过 Git 同步 Rime 配置目录即可)。


二、Rime / 雾凇作为开源软件:为什么值得折腾?

在讲安装和配置之前,先简单说说“它为什么值得折腾”。

  • 开源项目 Rime 输入法引擎和大量社区方案(包括雾凇拼音)都托管在 GitHub 等平台上,采用开源许可:

    • 任何人可以阅读源码与配置;
    • 可以提交 issue / PR 参与改进;
    • 不存在“黑箱上传什么数据”的问题——至少技术上你有机会自己审查。
  • 社区驱动的方案(以雾凇拼音为例) 雾凇拼音 (Rime Ice) 本质上是一个基于 Rime 的开源配置仓库

    • 包含拼音方案、词库、Emoji 映射、Lua 功能等;
    • 项目维护者会定期更新词库、修 bug、增加新特性;
    • 你可以通过 Git 直接同步这些更新,而不是手动下载压缩包。
  • Git 作为“更新通道”而不是负担 很多人一听到 Git 就觉得复杂,但在这里它的角色非常简单:

    • ~/Library/Rime 当成一个“订阅源”;
    • 不用管太多 Git 细节,只需要会 git pullgit status
    • 个人配置通过 *.custom.yaml 与上游配置解耦,不会被覆盖。

这几个特性结合在一起,使得 Rime / 雾凇拼音非常适合做“可长期维护的输入法方案”,而不是一次性折腾。


三、在 macOS 上安装鼠须管

3.1 使用 Homebrew 安装(推荐)

如果已经在用 Homebrew,安装鼠须管的命令很简单:

brew install --cask squirrel

安装完成后:

  1. 退出当前登录用户或重启一次(让输入法进程正常加载);
  2. 打开 系统设置 → 键盘 → 文本输入 → 输入源
  3. 点击“添加”,搜索“鼠须管”,添加为输入法。

3.2 输入法配置目录

鼠须管的用户配置目录在:

~/Library/Rime

后面所有自定义配置、方案、用户词库,都会放在这个目录里。 建议尽量只改这里,不要碰系统目录下的默认配置。


四、引入雾凇拼音方案(Rime Ice)

Rime 默认附带的拼音方案比较基础。为了有更好的词库和默认配置,我使用社区维护的 雾凇拼音 (Rime Ice)

项目地址(可自行搜索):iDvel/rime-ice

4.1 手动方式(概念说明)

最朴素的用法是:

  1. 从仓库下载项目中的方案文件(若干 .yaml 和词库文件);

  2. 把这些文件放入:

    ~/Library/Rime
  3. 如果项目里有示例的 default.custom.yaml / squirrel.custom.yaml, 可以对比自己的配置,选择性合并(不要直接覆盖自己的改动);

  4. 在菜单栏点击鼠须管图标,选择“重新部署”。

这已经能正常使用了,但后续更新词库会比较麻烦,需要你反复下载、覆盖。

4.2 推荐方式:直接把 ~/Library/Rime 变成一个 Git 仓库

更优雅的方式是直接把雾凇拼音仓库克隆到 ~/Library/Rime

# 如果你之前已经有 Rime 配置,建议先备份
mv ~/Library/Rime ~/Library/Rime.bak

# 将雾凇拼音的仓库克隆到 Rime 配置目录
git clone https://github.com/iDvel/rime-ice ~/Library/Rime

这样做有几个好处:

  • ~/Library/Rime 变成了雾凇拼音的一个 完整 Git 仓库
  • 以后更新只需要 git pull
  • 仓库内自带的 .gitignore 会忽略 *.custom.yaml,你的个人配置不会被上游影响。

克隆完成后,记得重新部署一次鼠须管,让新方案生效:

  1. 切换到鼠须管输入法;
  2. 菜单栏图标 → “重新部署”(或 Ctrl + Option + ~ 快捷键);
  3. 等到系统提示部署完成。

到这里,你已经有了:

  • Rime 引擎;
  • 鼠须管前端;
  • 雾凇拼音方案与词库;
  • 并且整个配置目录在 Git 管理之下,后续可以无痛更新。

五、使用 Git 管理雾凇词库与更新流程

有了 Git 之后,雾凇拼音的维护会变得简单、可预期。

5.1 git status:个人配置为什么“看不见”?

~/Library/Rime 下执行:

cd ~/Library/Rime
git status

常见输出类似:

On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

而我们明明已经创建或修改了 default.custom.yamlsquirrel.custom.yaml,为什么 Git 说“工作区是干净的”呢?

原因是:雾凇拼音仓库中通常有类似配置:

*.custom.yaml

也就是说:

  • *.custom.yaml 被有意 排除在 Git 管理之外
  • 你的个人配置完全属于“本地私有”,不会出现在 Git 提交里;
  • 上游更新词库、Lua、schema 时也不会覆盖你的改动。

这个状态对我们来说非常理想,可以理解为:

上游管词库和默认方案,我只用 patch 文件管自己的习惯; 两者互不打扰。

5.2 更新词库的标准姿势

以后每隔一段时间,你只需要在终端运行这一行命令:

cd ~/Library/Rime && git pull && /Library/Input\ Methods/Squirrel.app/Contents/MacOS/Squirrel --reload

这条命令做了三件事:

  1. 进入配置目录

    cd ~/Library/Rime
  2. 从 GitHub 拉取最新雾凇更新

    git pull
  3. 让鼠须管重新部署配置

    /Library/Input\ Methods/Squirrel.app/Contents/MacOS/Squirrel --reload

一次真实的 git pull 输出大概是这样(节选):

remote: Enumerating objects: 267, done.
remote: Counting objects: 100% (267/267), done.
remote: Compressing objects: 100% (148/148), done.
remote: Total 222 (delta 187), reused 102 (delta 74), pack-reused 0
Receiving objects: 100% (222/222), 202.39 KiB | 1.84 MiB/s, done.
Resolving deltas: 100% (187/187), completed with 34 local objects.
From https://github.com/iDvel/rime-ice
   2a25d90..0802d2a  main       -> origin/main
Updating 2a25d90..0802d2a
Fast-forward
 README.md                        |    9 +-
 cn_dicts/base.dict.yaml          | 3714 +++++++++------
 cn_dicts/ext.dict.yaml           | 1175 +++--
 cn_dicts/tencent.dict.yaml       | 5020 ++++++++++----------
 ...
 rime_ice.schema.yaml             |  148 +-
 40 files changed, 7160 insertions(+), 5397 deletions(-)
 create mode 100644 lua/uuid.lua

你不需要看懂这些改动,只要知道:

  • 上游在不断优化词库和功能;
  • 你的 default.custom.yaml / squirrel.custom.yaml 不会被动
  • 输出末尾没有冲突提示,就是一次非常健康的 fast-forward 更新。

更新完再看一眼:

git status

只要还是:

nothing to commit, working tree clean

就可以认为当前状态是非常完美的: 上游更新到最新,你的配置稳稳地叠在上面。


六、配置文件结构与修改原则

鼠须管的默认配置文件在系统目录,不建议直接改。用户级配置应该用 *.custom.yaml 的形式覆盖/补丁。

常用的两个文件:

  • default.custom.yaml

    • 控制 Rime 核心行为,例如按键绑定、候选数、启用的方案列表等。
  • squirrel.custom.yaml

    • 只影响 macOS 前端,例如皮肤、每个 App 的默认中英文模式等。

基本原则:

  • 使用 patch: 节点做“补丁”,不去手动编辑原来的 default.yamlsquirrel.yaml
  • 使用 "xxx/yyy/+" 的方式追加,而不是整块覆盖已有配置;
  • 修改后要“重新部署”,否则不会生效。

可以简单理解为:

上游的 xxx.yaml 是“系统文件”; 你的 xxx.custom.yaml 是“用户补丁层”。


七、WezTerm 环境下遇到的问题

我的终端主力是 WezTerm,它是一个 GPU 渲染的终端模拟器,支持多平台。在 macOS 下配好鼠须管之后,遇到三个具体问题:

  1. 用 Shift 切换英文时,终端里会短暂残留拼音;
  2. 在终端类应用中,希望默认是英文模式,而不是上次状态;
  3. 小键盘回车和主键盘回车在输入法中的行为不一致。

下面分别说明处理方式。

说明:WezTerm 的安装和配置不在本文展开。简单说,就是一个独立安装的终端 App,Bundle ID 为 com.github.wez.wezterm,后面会在 Rime 配置里用到。


八、问题一:Shift 切换残留“幽灵字符”

8.1 现象

  • 在 WezTerm 中处于中文输入状态,输入拼音,例如 ceshi
  • 按下 Shift 想切换到英文;
  • 逻辑上拼音已经被清掉,但终端画面上依然显示 ceshi,直到再敲一个键才会消失。

这会给人一种“屏幕和实际状态不同步”的感觉。

8.2 思路

鼠须管中,Shift 键的行为可以配置。常见行为包括:

  • clear:清空预编辑区(不上屏);
  • commit_code:把拼音原样作为英文上屏,然后切到英文;
  • noop:不做处理。

默认配置在有些终端里会出现渲染不同步。我的做法是把 Shift 行为改为 commit_code

  • 当前已输入的拼音直接上屏当英文字母;
  • 同时切换到英文模式;
  • 不再出现“残影”。

8.3 配置示例

编辑 ~/Library/Rime/default.custom.yaml,追加或修改:

patch:
  ascii_composer:
    good_old_caps_lock: true
    switch_key:
      Caps_Lock: clear      # 保持 Caps Lock 行为:清空并切换
      Shift_L: commit_code  # 左 Shift:上屏编码并切换到英文
      Shift_R: commit_code  # 右 Shift:同上
      Control_L: noop
      Control_R: noop

修改后:

  1. 保存文件;
  2. 鼠须管菜单 → “重新部署”;
  3. 在 WezTerm 中测试:输入拼音后按 Shift,应直接上屏为英文,并切换英文模式,屏幕不再残留。

九、问题二:终端软件默认英文模式

9.1 需求

在终端和代码编辑器里,我更希望:

  • 每次切到终端或编辑器时,默认使用 英文
  • 在聊天软件、浏览器里可以保持上次状态或者默认中文。

Rime 支持按 App 设定不同的默认模式,靠的是应用的 Bundle ID

9.2 查 Bundle ID

可以用 AppleScript 查询:

osascript -e 'id of app "WezTerm"'
# 输出类似:com.github.wez.wezterm

同理可以查 VSCode、iTerm2 等。

9.3 配置示例

编辑 ~/Library/Rime/squirrel.custom.yaml

patch:
  app_options:
    # WezTerm 终端
    com.github.wez.wezterm:
      ascii_mode: true      # 默认英文

    # 其他常见开发工具(按需启用)
    com.microsoft.VSCode:
      ascii_mode: true
    com.googlecode.iterm2:
      ascii_mode: true

部署后:

  • 切到 WezTerm 时,默认是英文输入;
  • 切到 VSCode / iTerm2 等同理;
  • 其他 App 不受影响。

十、问题三:小键盘回车 (KP_Enter) 行为不一致

10.1 现象

使用带小键盘的键盘时:

  • 在拼音输入状态下,主键盘 Enter 可以把拼音原样上屏为英文(或完成候选);
  • 小键盘 Enter 的行为却不同,可能是清空、取消,或者不起作用。

Rime 里,这两个按键的键值不同:

  • 主键盘回车:Return
  • 小键盘回车:KP_Enter

10.2 目标

希望在“输入拼音时”(composing 状态):

  • 小键盘 KP_EnterReturn 行为一致;
  • 即按下时,把当前内容按普通回车的逻辑处理。

10.3 配置示例

仍然是编辑 ~/Library/Rime/default.custom.yaml,在 patch: 下追加:

patch:
  # 前面可以有 ascii_composer 等配置

  "key_binder/bindings/+":
    - { accept: KP_Enter, send: Return, when: composing }

这里的含义是:

  • 当输入法处于 composing 状态时(正在拼音输入,还没上屏);
  • 如果按下的键是 KP_Enter
  • 就把它当作 Return 处理。

部署后,小键盘回车和主键盘回车在输入法层面的行为就统一了。


十一、开源输入法的优点与限制(与上文呼应)

前面第二节从宏观上讲了 Rime / 雾凇作为开源软件的背景,这里再结合实际使用做个简单总结。

11.1 优点

  • 可配置性强 几乎所有行为都可以通过 YAML 配置调整,包括按键、方案、候选布局、App 级别策略等。

  • 跨平台 一套方案可以在 macOS / Windows / Linux 上复用,只要把配置目录同步过去,甚至配合 Git 做版本管理。

  • 隐私友好 词库、用户输入历史默认在本地,没有强制的云同步;如果你愿意,也可以自己写同步脚本。

  • 社区活跃 像雾凇拼音这样的方案,会持续维护词库与功能,你只要 git pull 就能跟上节奏。

11.2 限制

  • 学习成本 初次接触时,default.yaml / *.custom.yaml / schema 等概念比较多,需要一点时间适应。

  • 兼容性问题 某些 GPU 终端、特殊 App 或远程桌面场景下,可能需要手动调配置才能达到理想效果,例如这篇提到的 WezTerm。

  • 缺少“现成模板” 虽然社区有不少方案,但大家使用习惯和环境不同,往往需要自己再改一轮。


十二、常见问题与排查方法

简单列几个我踩过或容易踩的点。

12.1 修改配置后没有效果

检查顺序:

  1. 保存文件时是否使用了 Tab 缩进(应使用空格);
  2. patch: 的缩进层级是否正确;
  3. 是否在鼠须管菜单中点击了“重新部署”,或者执行了前面那条带 --reload 的命令。

12.2 改错导致 Rime 无法部署

症状:

  • 点击“重新部署”后,输入法闪一下,重新变回旧配置;
  • 或者直接提示错误。

处理方法:

  1. 逐个检查最近修改的 *.custom.yaml
  2. 可以借助命令行 YAML 校验工具(可选);
  3. 实在不行,把本次改动先移走,确认恢复正常后再一段段加回来。

12.3 不确定某个 App 的 Bundle ID

使用 AppleScript:

osascript -e 'id of app "WezTerm"'
osascript -e 'id of app "Visual Studio Code"'

保证名字和 Launchpad 里显示的一致。


十三、小结

整套调整做完之后,macOS 上的输入体验会更接近预期:

  • 在终端和编辑器里默认是英文;
  • Shift 切换不会在 WezTerm 里留下“幽灵字符”;
  • 小键盘回车和主键盘回车行为统一;
  • 雾凇拼音作为开源方案,通过 Git 一行命令就能持续更新词库,而你的 *.custom.yaml 安全地叠在上层。

如果把这篇的逻辑抽象一下,大概就是:

  1. 开源引擎 + 社区方案:Rime + 雾凇,解决“能不能用、好不好用”的问题;
  2. Git 管理配置目录:解决“以后怎么维护、怎么更新”的问题;
  3. default.custom.yaml / squirrel.custom.yaml 补丁层:解决“如何按照自己习惯调整”的问题;
  4. 针对具体场景(如 WezTerm)的按键与模式调优:解决“在自己的工作流里是不是顺手”的问题。

这样一来,这不仅是一篇“怎么安装一个输入法”的笔记,而是一套可长期维护的、基于开源软件的输入方案。如果你以后写 WezTerm 的配置文章,也可以和这篇串起来,变成“终端 + 输入法”的整套工作流。