Rime 中英切换阶段性舒适版

Rime

之前有过多次针对中英文切换的改进

这次来个阶段性舒适版,提出几个要求:

  1. 使用键盘上的固定按键设置中英状态,并非切换。养成想要输入先选择模式的习惯
    • 按下 Shift_R 设置为英文状态
    • 按下 CapsLock 设置为中文状态,且键盘灯不点亮
  2. 一定程度地容错。有时候就是忘了
    • 特定应用(如 IM)切换过去就默认中文模式
    • 特定词组(如 git)输入即切换到英文模式
    • 在发现输入状态为中文后按 Esc 键切换到英文状态
  3. 最好改改配置就能实现,而不是魔改编译

要实现这些,需要两个软件配合工作,一个是 Weasel v0.17.4.19.d13f74e,它是 Nightly Build 版本,为的是它的 librime v1.14.0 依赖。另一个是 PowerToys v0.96.1,需要启用键盘管理器。

首先是配置小狼毫 Weasel

default.custom.yaml
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

  1. 重新映射键 CapsLockCtrl + F22
  2. 重新映射快捷键 Ctrl + Apps/MenuCapsLock,在必要时能找回这个键

想要 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,重启输入法算法服务即可生效。