rime 安装问题记录

记录范围

本文记录在 NixOS + fcitx5 上把 Rime 中文输入(薄荷输入法 oh-my-rime)装好、并修掉打字体验问题的完整过程:部署方式 → 逐个问题的根因与修法 → 客观验证判据 → 归档与后续更新。所有结论均来自本机实测,未验证的一律标注。

环境

项值
系统NixOS 26.05 (Yarara),内核 7.2.8
桌面会话KDE Plasma,X11(不是 Wayland)—— 这一点是后面 P1/P2 的关键前提
输入法框架fcitx5 5.1.19 + fcitx5-rime 5.1.13(librime 1.16.1)
Rime 用户目录~/.local/share/fcitx5/rime(fcitx5 前端的固定位置)
所用方案薄荷输入法(rime_mint,万象词库)+ 五笔98

一、部署方式:复用已有实例,不重新下载

U 盘上已有一份完整可用的实例(Windows 小狼毫时代 clone 的 oh-my-rime,含个人自定义与用户词库)。直接整份复用它,比从 GitHub 重新拉一份更好 —— 因为下面这些个人痕迹是重新下载拿不到的:

文件内容
default.custom.yaml方案列表只留 rime_mint + wubi98_mint(去掉了小鹤双拼/地球拼音/五笔86/t9)
rime_mint.custom.yamlmenu/page_size: 9(每页 9 个候选)
user.yaml上次选中的方案 = rime_mint
*.userdb ×3用户词库(学过的词与调频):rime_mint / melt_eng / terra_pinyin

步骤

# 1) 备份本机原有 rime 用户目录(几乎必然是空的默认方案)
mv ~/.local/share/fcitx5/rime ~/.local/share/fcitx5/rime.bak-$(date +%Y%m%d)
# 2) 整份复制已有实例
cp -a "<实例目录>" ~/.local/share/fcitx5/rime
# 3) 删掉跨平台不可复用的编译产物,让本机重建
rm -rf ~/.local/share/fcitx5/rime/build
# 4) 重启 fcitx5 → rime 自动重新部署(45MB 大词库约 20 秒)
systemctl --user restart app-org.fcitx.Fcitx5@autostart.service

两个必须知道的约束

  1. 不要用 git clone 复制实例。个人配置(*.custom.yaml / user.yaml / installation.yaml / *.userdb)都在实例仓库的 .gitignore 里,git clone 不会带走它们 —— 而那些恰恰是最有价值的部分。必须用文件级复制。
  2. build/ 不能跨平台复用。它是 librime 编译出的 *.prism.bin / *.table.bin,与 librime 版本绑定(Windows 侧是 rime 1.13.1,本机是 1.16.1),留着只会带来版本错配风险。删掉让它重建。

二、问题清单

#现象根因修法
P1在 Hermes 里打字延迟明显、快打时个别字母直接漏成英文落到输入框,需要放慢到 60% 才跟得上waylandFrontend = true 导致该模块不导出 GTK_IM_MODULE / QT_IM_MODULE → Chromium/Electron 只能走自己那套 XIM 实现(XIM 本身不一定慢,但 Chromium 的实现又慢又易丢键)waylandFrontend = false; + 注销重新登录
P2终端(Konsole)完全无法输入中文Konsole 是 Qt 程序,而 QT_IM_MODULE 缺失 → 根本没接上输入法(探测显示 IM_MODULE_CLASSNAME=QComposeInputContext)同 P1(一次修复同时解决)
P3薄荷的「算式计算器」功能失效,日志报 lua 加载失败nixpkgs 的 librime-lua 链接 Lua 5.2,而脚本用了 Lua 5.3+ 的整除语法 //用 lua5_4 重编 librime-lua 插件并覆盖给 fcitx5-rime
P4候选词浮窗偏小、字也偏小classicui 默认 Font=Sans 10,default 主题内边距很小写 classicui.conf(Font 16pt)+ 自定义主题加大内边距
P5之前放在 systemPackages 里的 rime-ice 包从未生效librime 只读 fcitx5-rime 包内的 share/rime-data 与用户目录;放进系统 profile 的数据不会被读移除该包;方案数据改用用户目录实例(见第一节)
P6复用过来的实例,git 工作树显示 71 个文件被修改Windows 检出的 CRLF 行尾(69 个文件纯行尾差异)+ 2 处注释里的空格归一化为 LF → 之后 git pull 更新词库才可用

P1 / P2:打字延迟与终端无输入法(最核心)

根因在 NixOS 模块的一行条件判断里(nixos/modules/i18n/input-method/fcitx5.nix):

environment.variables = {
  XMODIFIERS = "@im=fcitx";
  QT_PLUGIN_PATH = [ "${fcitx5Package}/..." ];
}
// lib.optionalAttrs (!cfg.waylandFrontend) {     # ← 门槛在这里
     GTK_IM_MODULE = "fcitx";
     QT_IM_MODULE = "fcitx";
   };

waylandFrontend 的默认值本来就是 false;本机配置里写成了 true(注释写着「Wayland 环境必须开启」),但本机实际是 X11 会话。于是这两个变量被整条吞掉:

证据(修复前实测)含义
IC […] program:Hermes frontend:xim打字的编辑器走 XIM,而不是原生输入模块
GTK3 探测:GTK_IM_MODULE=ximGTK 程序在没设变量时回落到 XIM
Qt6 探测:IM_MODULE_CLASSNAME=QComposeInputContextQt 程序没有任何输入法 → 终端打不了中文
/etc/set-environment 里只有 XMODIFIERS两个 IM 模块变量确实被条件挡掉

旁证:XIM 本身并非绝对瓶颈 —— 同样走 XIM 的 Firefox 打字是流畅的,慢的是 Chromium/Electron 那条 XIM 实现。另外输入模块其实早就就位,只差变量:profile 里存在 lib/gtk-3.0/3.0.0/immodules/im-fcitx5.so,fcitx5-with-addons 里带 Qt 插件且 QT_PLUGIN_PATH 已指向它。

修法:把 waylandFrontend 改为 false,nixos-rebuild switch,然后必须注销重新登录 —— 环境变量只在登录时注入,不重登则所有已运行的 GUI 程序仍是旧环境(实测:rebuild 后会话里 plasmashell / konsole / firefox / Hermes 的 /proc/<pid>/environ 里都没有这两个变量)。

提示:想先花 10 秒验证结论而暂不重登,可以带变量启动单个程序试 —— GTK_IM_MODULE=fcitx QT_IM_MODULE=fcitx <程序>。

P3:计算器 lua 加载失败(Lua 版本不兼容)

日志原文:lua/mint_calculator_translator.lua:2430: unexpected symbol near '/' —— 第 2430 行是 n = n // 2(整除,需要 Lua 5.3+)。同一个文件换 Lua 版本直接对照:

Lua结果
5.4.7语法 OK
5.2.4(nixpkgs 的 librime 实际链接的):2430: unexpected symbol near '/'(与日志逐字一致)

关键点:librime 包本身没有 lua 参数,Lua 支持在独立插件包 librime-lua 上(它才有 lua 参数,propagatedBuildInputs = [ lua ])。所以覆盖链要一路递进去:

# configuration.nix 的 fcitx5 addons 里,替换原来的 fcitx5-rime:
(fcitx5-rime.override {
  librime = librime.override {
    plugins = [ (librime-lua.override { lua = lua5_4; }) librime-octagram ];
  };
})

注意:改这个必须有「覆盖真的生效」的证据 —— 单看 nix-instantiate --eval 返回的属性是惰性 thunk(<CODE>),会给出假阳性。要查系统 drv 的依赖图里 fcitx5-rime 到底引用了哪个 librime drv,或构建后 ldd 看链接的 liblua.so 版本。

修复后实测:运行中的 librime 链接 liblua.so.5.4,该实例 lua 报错 0 条。

P4:候选窗字体与尺寸

fcitx5 下候选窗由它自己的 classicui 绘制 —— 薄荷自带的皮肤(squirrel.yaml / weasel.yaml)在 fcitx5 上不生效,那是给 macOS/Windows 前端的。配置项真名与默认值从 libclassicui.so 的 .rodata 里取到:Font(默认 Sans 10)、MenuFont、TrayFont(默认 Sans Bold 10)、Vertical Candidate List、PerScreenDPI 等,写在 ~/.config/fcitx5/conf/classicui.conf。

尺寸(内边距)在主题里:复制一份 default 主题到 ~/.local/share/fcitx5/themes/<名>/ 并放大 [InputPanel/TextMargin](5→8)、[InputPanel/ContentMargin](2→8)、[InputPanel/Background/Margin](2→6)、[InputPanel/Highlight/Margin](5→8),然后在 classicui.conf 里 Theme=<名>。字体用系统已有的中文字体名(本机 Noto Sans CJK SC 16),否则汉字会走 fontconfig 回退链。

P5:为什么 rime-ice 放进 systemPackages 没用

实测证据链:运行中的 rime 插件写死的共享数据目录是 …fcitx5-rime-5.1.13/share/rime-data(其中 rime_ice* 数量 = 0);而该包只是躺在 profile 的 /run/current-system/sw/share/rime-data 里,librime 根本不去那里读。旁证是用户目录里只有 luna_pinyin_simp 的 userdb —— 说明实际一直在用 Rime 默认方案,那份 rime-ice 从未加载。NixOS 模块源码也印证:enableRimeData 已移除,注释明确说方案数据要用 fcitx5-rime.override { rimeDataPkgs = ...; } 定制(那是共享数据层,只读),而个人实例应放用户目录。

P6:复用实例的 git 工作树「脏」

71 个文件显示被修改,diff 统计 2,359,517 行增 / 同数删 —— 典型的行尾符差异。用 git diff --ignore-cr-at-eol --stat 判定:只剩 2 处真实差异,都是无意义的(注释行里的一个空格、一个空白行)。归一化为 LF 后 git status 干净,git pull 才可用。顺手验证性质的收益:上游 9 月版与 4 月版的该 lua 脚本逐字节同尺寸、仍用 // —— 所以 git pull 不会修好计算器,那是 librime 的 Lua 版本问题(见 P3)。

三、最终配置

# /etc/nixos/configuration.nix 关键片段

# 1) 环境变量:必须是 X11 会话才关掉 waylandFrontend
i18n.inputMethod = {
  enable = true;
  type = "fcitx5";
  fcitx5 = {
    waylandFrontend = false;   # X11 会话。true 会让模块不导出 GTK/QT_IM_MODULE(见 P1)
    addons = with pkgs; [
      qt6Packages.fcitx5-chinese-addons
      (fcitx5-rime.override {                        # 用带 Lua 5.4 的 librime(见 P3)
        librime = librime.override {
          plugins = [ (librime-lua.override { lua = lua5_4; }) librime-octagram ];
        };
      })
      fcitx5-gtk
      qt6Packages.fcitx5-configtool
    ];
  };
};

# 2) 方案数据不再放 systemPackages(见 P5),只留基础工具
environment.systemPackages = with pkgs; [ git curl gcc gnumake python3 pkg-config usbutils ];

用户态文件(不进 Nix):

路径作用
~/.local/share/fcitx5/rime/Rime 用户目录 = 薄荷实例本体(可写:build/、userdb、*.custom.yaml 都在这)
~/.config/fcitx5/conf/classicui.conf候选窗字体(Font/MenuFont/TrayFont)与主题
~/.local/share/fcitx5/themes/<名>/theme.conf自定义主题(放大候选窗内边距)

四、验证方法(客观判据)

# 1) 输入模块链路:frontend 应为 fcitx5,不再是 xim
fcitx5-diagnose 2>&1 | grep -E "program:|frontend:"

# 2) Qt/GTK 是否接上输入法(不应是 QComposeInputContext / xim)
fcitx5-diagnose 2>&1 | grep -A6 "## Qt6"
fcitx5-diagnose 2>&1 | grep -A12 "## Gtk"

# 3) 环境变量是否注入当前进程(重登后)
tr '\0' '\n' < /proc/<某GUI进程pid>/environ | grep -E "GTK_IM_MODULE|QT_IM_MODULE"

# 4) rime 是否部署成功:编译产物 + 方案列表 + 无 lua 报错
ls ~/.local/share/fcitx5/rime/build/          # 应有 rime_mint.prism.bin / table.bin 等
sed -n '/^schema_list:/,/^[a-z]/p' ~/.local/share/fcitx5/rime/build/default.yaml
ldd $(ls -d /nix/store/*fcitx5-with-addons*/lib/fcitx5/librime.so | head -1) | grep -i lua   # 应是 liblua.so.5.4

另:实际的个人配置是否生效,看编译后的 schema —— 例如 build/rime_mint.schema.yaml 里应有 page_size: 9,build/default.yaml 的 schema_list 应只剩 rime_mint 与 wubi98_mint。

五、归档与更新

实例已归档到 U 盘(可移动介质上的配置实例库):

/run/media/cat/Ventoy/S500data/sotlinux/rime/oh-my-rime/    # 103MB,183 个文件
  ├── default.custom.yaml / rime_mint.custom.yaml / user.yaml   # 个人自定义
  ├── *.userdb ×3                                               # 用户词库
  ├── dicts/ lua/ opencc/ 方案文件                              # 方案本体
  └── .git                                                      # 保留 → 可 git pull 更新词库
# 排除了 build/(编译产物,跨平台/版本不可复用)

更新词库(实例内保留了 git,且个人文件都被 .gitignore 忽略,所以 pull 不会覆盖你的自定义):

cd ~/.local/share/fcitx5/rime && git pull
systemctl --user restart app-org.fcitx.Fcitx5@autostart.service   # 触发重新部署(~20s)

六、遗留与注意

    • 来源:薄荷全量万象词库(45MB base dict → 63.9MB 编译表),不是泄漏(两次部署后稳定)
    • 要省内存只能裁剪 dicts/rime_mint.base.dict.yaml 或换轻量方案
    • 候选:corrector_filter(错音错字提示,依赖 spelling_hints: 8 的每键全拼推导)与 super_preedit(全拼预编辑)
    • 改法:在 rime_mint.custom.yaml 里 patch engine/filters 列表,去掉这两个再重新部署
    • 代价:失去错音提示与全拼预编辑 —— 按证据主因(XIM)已解决,先别急着牺牲功能
    • 否则 Wayland 下不应设置 GTK/QT_IM_MODULE,会与 text-input 协议冲突
    • 改 ~/.config/fcitx5/conf/classicui.conf 里的字号,或主题里的 margin 数字;也可用 fcitx5-configtool 图形调