雾凇拼音(小狼毫)安装与配置记录#
日期:2026-09-22
机器:TLL-FUWENYUE / Administrator
小狼毫(Weasel):0.17.0.0,内置 librime 1.13.1
Rime 用户目录:C:\Users\Administrator\AppData\Roaming\Rime
一、需求#
- 安装 / 升级「雾凇拼音」方案
左 Ctrl + 左 Shift切换输入法左 Shift切换中英文
二、开工前的环境现状(结论:小狼毫早就装好了)#
| 项目 | 状态 |
|---|---|
| 小狼毫 0.17.0.0 | 已安装,已注册为 TSF 输入法,WeaselServer.exe 正在运行 |
%APPDATA%\Rime |
已存在雾凇拼音,2026-05-26 部署过 |
build\ 编译产物 |
停留在 5-26,当天未重新部署 |
HKCU\Keyboard Layout\Toggle |
不存在(输入法切换热键未显式设置) |
| 压缩包内的方案 | 比本地新(如 rime_ice.schema.yaml 19310 → 19484 字节) |
所以本次实际做的是方案升级 + 配置 + 重新部署,而不是从零安装。
三、最终做法#
1. 备份#
把整个 %APPDATA%\Rime 复制到:
%APPDATA%\Rime\backup_preinstall_20260922_110510\2. 覆盖升级方案文件#
解压 雾凇拼音full.zip 后覆盖到 %APPDATA%\Rime,但排除 rime_ice.dict.yaml:
该文件在本地被改过(tencent 大词库已注释掉)。zip 里是启用状态,覆盖会导致一次超长的词库编译。保留本地版本 = 保留用户已有选择。
3. 左 Shift 切换中英文#
写 %APPDATA%\Rime\default.custom.yaml(这是 Rime 标准的「打补丁」写法,不动原始 default.yaml):
# 雾凇拼音自定义配置 default.custom.yaml
patch:
# 方案列表:只启用雾凇拼音(全拼)
schema_list:
- { schema: rime_ice }
ascii_composer/switch_key:
Caps_Lock: clear # 大写锁定:清空编码
Shift_L: commit_code # 左 Shift:切换中英文
Shift_R: noop # 右 Shift:不切换
Control_L: noop # 左 Ctrl:不切换(留给 Ctrl+Shift 切输入法)
Control_R: noop # 右 Ctrl:不切换switch_key 取值说明:
| 值 | 行为 |
|---|---|
commit_code |
有编码时上屏原始编码,无编码时切换中英文 |
set_ascii_mode / unset_ascii_mode |
单向切换 |
clear |
清空已输入编码 |
noop |
不响应 |
4. 切换输入法热键(系统层)#
「切换输入法」是 Windows 的输入语言切换,不属于 Rime 配置,改注册表:
HKCU\Keyboard Layout\Toggle
Language Hotkey = "2"
Hotkey = "2"
Layout Hotkey = "2"对应「控制面板 → 区域和语言 → 高级键设置」里的 Ctrl + Shift。
常用取值:1 = 左 Alt+Shift,2 = Ctrl+Shift,3 = 未分配。
5. 重新部署#
重点:不能用命令行直接调 WeaselDeployer.exe /deploy(见坑 5)。最终有效的方式是用资源管理器打开开始菜单快捷方式:
Start-Process explorer.exe -ArgumentList `
'C:\ProgramData\Microsoft\Windows\Start Menu\Programs\小狼毫输入法\【小狼毫】重新部署.lnk'再同样方式启动「小狼毫算法服务」快捷方式,让服务端重新加载:
Start-Process explorer.exe -ArgumentList `
'C:\ProgramData\Microsoft\Windows\Start Menu\Programs\小狼毫输入法\小狼毫算法服务.lnk'6. 验证#
build\ 生成 14 个产物(default.yaml / weasel.yaml / rime_ice.* / melt_eng.* / radical_pinyin.*)build\default.yaml 中确认生效:
ascii_composer:
good_old_caps_lock: true
switch_key:
Caps_Lock: clear
Control_L: noop
Control_R: noop
Shift_L: commit_code
Shift_R: noop
...
schema_list:
- schema: rime_ice部署成功日志的标志(%TEMP%\rime.weasel\*.log):
deployment_tasks.cc:83] updating rime installation info.
deployment_tasks.cc:186] updating schemas.
deployment_tasks.cc:358] preparing dictionary 'rime_ice'.
deployment_tasks.cc:243] finished updating schemas: 3 success, 0 failure.
deployment_tasks.cc:581] clean up trash.四、踩过的坑#
坑 1:powershell -Command "..." 里 $ 会被吞掉#
内联命令中的 $env:APPDATA、$_.Name 会被外层处理吃掉,导致命令静默失败或结果为空。
解法:把脚本写到 .ps1 文件里再用 powershell -File 执行。
坑 2:PowerShell 5.1 按 GBK 读取 .ps1#
powershell -File 走的是 Windows PowerShell 5.1(不是 Core),默认按 ANSI(GBK) 解码脚本文件。脚本里写中文注释或中文字符串会变成乱码(本次 installation.yaml 里的 小狼毫 被写成 灏忕嫾姣?)。
解法二选一:
- 脚本保持纯 ASCII
- 用码点构造中文再按 UTF-8 写文件:
$name = [string][char]0x5c0f + [string][char]0x72fc + [string][char]0x6beb # 小狼毫
$enc = New-Object System.Text.UTF8Encoding($false) # 无 BOM
[System.IO.File]::WriteAllText($path, $txt, $enc)坑 3:把「切换输入法」当成 Rime 的配置去找#
一开始在 weasel.yaml / weasel.custom.yaml / default.yaml 里搜 hotkey、switch_key,方向错了。
- 切换中英文(ascii_mode)→ Rime 层,
ascii_composer.switch_key - 切换输入法(换 IME)→ Windows 层,
HKCU\Keyboard Layout\Toggle
坑 4:Windows 无法区分左右 Ctrl#
「高级键设置」只提供 Ctrl+Shift / 左 Alt+Shift,不区分左右。所以设成 Ctrl+Shift 后,右 Ctrl+Shift 同样会切换输入法。要做到严格只认左侧,只能靠 AutoHotkey 之类的外部钩子拦截。
同理系统层的 Toggle 也没有「只响应左边」的开关。
坑 5:WeaselDeployer.exe /deploy 静默空转(最大的坑)#
表现:进程退出码 0,无输出,build\ 一个文件都不生成。日志显示它只加载了配置,然后就结束了。
对比日志发现关键差异:
| 成功的部署 | 空转的部署 | |
|---|---|---|
| 组件注册 | levers_module.cc:16 注册 installation_update / workspace_update / schema_update / prebuild_all_schemas / cleanup_trash … |
只注册了 prebuild_all_schemas |
| 关键日志 | 有 deployment_tasks.cc |
完全没有 |
即维护流程压根没启动。尝试过的无效手段:
WeaselDeployer.exe /deploy(多次,含-Wait)- 先停掉
WeaselServer再部署 - 启动
WeaselServer.exe /deploy - 改
installation.yaml版本号 + 刷新源文件时间戳强制重建
根因判断:从受限/沙箱化的进程启动的子进程,无法与 WeaselServer 完成 IPC(UIPI 完整性级别隔离)。辅助证据——尝试 Stop-Process 干掉由安装程序启动的那个 WeaselServer(PID 27820)时返回 Access denied(它是高完整性级别进程),说明确实存在完整性级别差异。
解法:让 explorer.exe 去 ShellExecute 快捷方式,子进程由 explorer 派生、不继承沙箱限制:
Start-Process explorer.exe -ArgumentList '<开始菜单 .lnk 的完整路径>'开始菜单里可用的快捷方式(C:\ProgramData\Microsoft\Windows\Start Menu\Programs\小狼毫输入法\):
| 快捷方式 | 目标 |
|---|---|
| 【小狼毫】重新部署 | WeaselDeployer.exe /deploy |
| 【小狼毫】输入法设定 | WeaselDeployer.exe |
| 【小狼毫】用户词典管理 | WeaselDeployer.exe /dict |
| 【小狼毫】用户资料同步 | WeaselDeployer.exe /sync |
| 小狼毫算法服务 | WeaselServer.exe |
| 【小狼毫】检查新版本 | WeaselServer.exe /update |
| 【小狼毫】安装选项 | WeaselSetup.exe |
经验:排查这类问题时,先确认「目标程序在用户自己双击时能不能正常工作」。如果用户手动点「重新部署」能成、而脚本调用不成,那就是执行环境问题,不要再在参数上折腾。
坑 6:误删 build\ 导致输入法当场不可用#
为了"强制全量重建",把 build\ 整个删了,结果重建没跑起来(坑 5),于是:
- 引擎回退到共享目录的
default.yaml,加载的是luna_pinyin - 而
build\luna_pinyin.table.bin已被删掉 → 报错Error loading table for dictionary 'luna_pinyin' - 中间还把
WeaselServer杀掉过一次,输入法彻底没服务
教训:build\ 是运行期必需的编译产物,不是可以随便清的缓存。要强制重建,正确顺序是先确认部署命令真的能跑通,再删;更稳妥的做法是只删除单个方案的产物,或者根本别删、直接调部署(部署自己会检测源文件变化)。
坑 7:WeaselServer 是单实例,从沙箱启动它会顶掉正常实例#
新起一个 WeaselServer.exe,旧实例会自己退出(日志里表现为 engine disposed → closed db)。
所以:
- 「重启服务」不需要 kill,直接再启动一次就行
- 但从沙箱里启动,会把原来那个正常的、带托盘图标的实例挤掉,让后续的部署更难恢复 —— 这次就是这么把环境搞乱的
坑 8:手工改 installation.yaml 写坏了中文#
试图靠改 installation.yaml 里的 distribution_version 来触发全量重建,结果把 distribution_name 写成乱码 灏忕嫾姣?(坑 2 的编码问题)。
修正见坑 2 的 [char]0x... + UTF8Encoding($false) 写法。最终内容:
distribution_code_name: Weasel
distribution_name: "小狼毫"
distribution_version: 0.17.0
install_time: "Tue May 26 17:01:22 2026"
installation_id: "3ae8d4e8-577a-47d8-a22b-74428a3db1fc"
rime_version: 1.13.1
update_time: "Tue Sep 22 11:46:44 2026"坑 9:长时间脚本会被切到后台#
execute_command 跑超过一定时长会被自动切到后台执行,返回结果变成 skipped。长时间等待(比如等部署)要拆成「触发」+「轮询」两步,别写成一个长脚本。
坑 10:PowerShell 参数名笔误#
-ErrorActionSilentlyContinue 少了空格,报 NamedParameterNotFound。正确是 -ErrorAction SilentlyContinue。
五、日志位置速查#
%TEMP%\rime.weasel\
rime.weasel.<机器名>.<用户名>.log.INFO.<时间>.<PID>.log
rime.weasel.<机器名>.<用户名>.log.WARNING.<时间>.<PID>.log
rime.weasel.<机器名>.<用户名>.log.ERROR.<时间>.<PID>.log按 PID 区分是 WeaselDeployer 还是 WeaselServer 产生的日志。
六、回滚#
完整备份在:
%APPDATA%\Rime\backup_preinstall_20260922_110510\需要回滚就把该目录下的文件复制回 %APPDATA%\Rime\(保留 build\ 现状或一并替换),然后重新部署。