Rime 中英切换阶段性舒适版
之前有过多次针对中英文切换的改进
- Rime 小狼毫切换模式
- 希望 Rime 小狼毫输入法切换窗口要还原设置的默认中英状态
- 禁用 Rime 小狼毫输入法 Ctrl+Space 切换中英状态
- Rime 小狼毫切换窗口重置默认中英状态
- [[2025-11-24#rime-在连续输入-jj-后自动切换到英语|Rime 在连续输入
jj后自动切换到英语]]
这次来个阶段性舒适版,提出几个要求:
- 使用键盘上的固定按键设置中英状态,并非切换。养成想要输入先选择模式的习惯
- 按下 Shift_R 设置为英文状态
- 按下 CapsLock 设置为中文状态,且键盘灯不点亮
- 一定程度地容错。有时候就是忘了
- 特定应用(如 IM)切换过去就默认中文模式
- 特定词组(如 git)输入即切换到英文模式
- 在发现输入状态为中文后按 Esc 键切换到英文状态
- 最好改改配置就能实现,而不是魔改编译
要实现这些,需要两个软件配合工作,一个是 Weasel v0.17.4.19.d13f74e,它是 Nightly Build 版本,为的是它的 librime v1.14.0 依赖。另一个是 PowerToys v0.96.1,需要启用键盘管理器。
首先是配置小狼毫 Weasel
patch:
ascii_composer:
switch_key:
Shift_R: set_ascii_mode
Eisu_toggle: clear
key_binder:
bindings:
- { when: always, accept: Control+F22, unset_option: ascii_mode }
- { when: composing, accept: "Escape", send: "Eisu_toggle" }Shift_R: set_ascii_mode,在按下右侧 Shift 清空并切换到英文状态,是 librime 1.14.0 新增功能Eisu_toggle当在中文输入状态按下 Esc 键,清空并切换到英文状态。这是段 隐藏的逻辑,相比 ascii_composer 的好处是单独使用键盘也不会亮灯。小狼毫目前未实现XK_Eisu_toggle按键转换,这个按键在 Windows 也无法输入,但是能够通过 key_binder 绑定在Escape键上来模拟按下这个按键。Control+F22配合由 PowerToys 重映射后的 CapsLock 键,设置回中文状态
然后是配置 PowerToys
- 重新映射键
CapsLock到Ctrl + F22 - 重新映射快捷键
Ctrl + Apps/Menu到CapsLock,在必要时能找回这个键
想要 CapsLock 不亮灯,在 IME 层面拦截不到,所以这里用 PowerToys 的 WH_KEYBOARD_LL 系统级钩子,把 CapsLock 变成别的按键
特定词组,特定应用切换,看前面的改进文章
如果只使用 Release 版的 Weasel 0.17.4,有个办法 可以让 key_binder 替代 ascii_composer 的作用。虽然但是,它在 composing 时按 Shift 会在保持输入框的前提下切换中英状态,可能是具有中英混输习惯的人所需要的特性?
patch:
key_binder:
bindings:
- { when: always, accept: Shift+Shift_R, set_option: ascii_mode }
- { when: always, accept: Control+Control_R, unset_option: ascii_mode }之前用过一段时间按下 Ctrl_R 设置为中文状态,但它会在常用的注释快捷键 Ctrl_R + / 按下后切换到中文,打乱编程心流,最后抛弃了。另外实测不支持绑定到 Alt 键上
Weasel v0.16.2 添加的新特性 ” 支持 Caps_Lock 按鍵 binding(如選重)“,没找到实际用处
也就是每个人使用习惯不同,关于大小写设置,都要网上查一遍问一遍,给使用 Rime 形成门槛。
这时反而一套不可变的家长式默认逻辑,更容易让群体(先入为主地、被迫地)接受并养成地肌肉记忆,这套记忆一般来自各大输入法。
进而让新接触 Rime 的用户想要在保护隐私和极高自定义程度的基础上,模仿自己的肌肉记忆,把新东西造成旧东西的模样,维护原有习惯,产生五花八门的配置文件。我也难免
在 Windows 上使用 MSVC 构建 Weasel
在得到上面的结论之前,是想魔改代码来实现的,那就需要编译。可过程也不是一帆风顺
当前是 0.17.4,参考 weasel/INSTALL.md · rime/weasel 构建
- 需要在 VS2022 中添加 ATL 组件,否则会遇到
error C1083: 无法打开包括文件: “atlbase.h” - 需要在 VS2022 中添加 MFC 组件,否则会遇到
error C1083: 无法打开包括文件: “afxres.h” - 需要在 VS2022 中添加对 XP 的支持,否则会遇到
don't know how to make <p - 需要先安装 rime,否则会报错
error C1083: 无法打开包括文件: “rime_api.h” - 直接使用预编译版的 boost,而没有从源码开始编译,如果遇到
LINK : fatal error LNK1104: 无法打开文件“libboost_wserialization-vc143-mt-s-x32-1_84.lib”,说明只下载了 x64 版本,要再安装个 x86 的。但我安装后还是提示找不到,最后复制文件到项目的 lib 目录才能识别到…其实是需要再build.bat boost
在 Windows 上使用 MSVC 构建 librime
构建成功 weasel 后才意识到,测试起来不太容易,似乎得重启才能生效,搞个虚拟机吧又担心按键无法透传进去。既然我想要的功能已经需要改代码了,为何不写在更通用的地方,那就是 librime。
当前是 librime 1.16.1,参照 librime/README-windows.md · rime/librime 构建
- 要想给 weasel 使用,需要
set ARCH=x64 - 在 zh-CN 下编译,需要在
cmake\cxx_flag_overrides.cmake添加个set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /utf-8")指令。
否则会提示奇奇怪怪的行号对不上的错误librime\src\rime\algo\calculus.cc(203,3): error C2059: 语法错误:“if”。
其实之前已经有提示了,librime\src\rime\algo\calculus.cc(1,1): warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失。
构建完成后,替换 weasel 目录的 rime.dll,重启输入法算法服务即可生效。