开发环境

获取源码

玉兔毫使用 Git 子模块提供 Rime 绑定、方案下载器和东风破资源。克隆仓库后初始化全部子模块:

git submodule update --init --recursive

开发和 CI 以 AutoHotkey v2.0.19 为基线。源码运行还需要匹配当前 AutoHotkey 位数的 rime.dll、Rime 共享数据和用户数据;如果需要准备 Rime 数据或运行东风破脚本,还需要 Git for Windows 提供的 Bash 或可用的 WSL 环境。

三个子模块的职责不同:

路径 作用 修改原则
Lib/librime-ahk librime 的 AutoHotkey 绑定及测试 绑定层改动应在子模块中独立提交,并更新子模块指针
Lib/RimeDepot 方案目录下载和安装服务 应用层适配放在 Rabbit 仓库;不要把应用逻辑写入子模块
plum 东风破安装脚本和资源 只有确实需要更新上游脚本时才修改

查看状态时同时检查主仓库和子模块:

git status --short --branch
git submodule status --recursive

运行源码

在仓库根目录执行:

AutoHotkey.exe Rabbit.ahk
AutoHotkey.exe Rabbit.ahk --deployer deploy
AutoHotkey.exe Rabbit.ahk --deployer sync

Rabbit.ahk 是唯一的顶层入口。不带参数时启动常驻前端,现代设置窗口也由这个进程持有;从托盘菜单打开设置。 第一个参数是 --deployer 时进入兼容部署器或独立维护入口。--deployer-worker 是常驻前端启动的内部维护协议, 不作为人工运行入口。常用形式如下:

命令 作用
Rabbit.ahk 启动普通前端;默认执行部分维护
Rabbit.ahk --maintenance none 启动普通前端,但跳过启动维护
Rabbit.ahk --maintenance full 启动普通前端并执行完整维护
Rabbit.ahk --deployer deploy 请求完整 Rime 部署;优先交给常驻前端,无常驻端点时独立执行
Rabbit.ahk --deployer sync 请求同步 Rime 用户数据;优先交给常驻前端,无常驻端点时独立执行
Rabbit.ahk --deployer legacy-settings 显式使用兼容设置流程
Rabbit.ahk --deployer legacy-settings dictionary 打开旧版用户词典管理

现代页面标识 appearanceinput-schemesbehaviorapplicationsdictionarymaintenanceaboutRabbitSettingsController 在常驻前端内部使用,不再是 --deployer settings [page] 命令行参数。 --keyboard-layout <数字> 用于显式传入键盘布局标识;--install--return-to-rabbit 只用于旧版 Windows 首次安装和兼容设置的内部进程交接。

命令行解析集中在 Lib/RabbitCommandLine.ahk。新增参数时要同步更新普通前端、兼容部署器和 worker 的测试, 并明确参数属于哪一种模式;deploysync 不能附加页面标识。worker 当前只接受 deploysyncdictionary,由 RabbitDeploymentCoordinator 生成带部署计划或词典操作参数的命令行。

运行时目录与依赖

普通源码运行使用 Lib/librime-ahk/rime.dllRabbitRimeBootstrap 在编译版中才会按版本、位数和 API 兼容性选择程序目录、LIBRIME_LIB_DIR、小狼毫安装目录或内嵌 DLL;不要用不匹配位数的 DLL 代替测试依赖。

Rabbit 将 Rime 数据分为共享数据和用户数据:

路径或设置 作用
程序目录 Data/ 共享数据、内置方案和预设配置,由构建流程准备
用户数据目录 保存 rabbit.custom.yamldefault.custom.yaml、用户词典、部署结果和学习数据
%TEMP%\rime.rabbit\ Rime 日志目录

用户数据目录按以下顺序确定:程序目录存在 .portable 时使用程序目录下的 Rime/;否则读取 HKCU\Software\Rime\RabbitRimeUserDir;注册表设置无效时回退到程序目录下的 Rime/。运行测试或手动调试前,先确认当前用户目录没有被其他正在运行的 Rabbit 实例占用。

Data/Rime/、DLL、图标和编译资源是生成或运行时文件,均不应提交。需要准备一套可运行环境时,可以使用发行包中的 Data/,并在隔离的用户目录中初始化 Rime;不要把个人用户数据复制回仓库。

编译辅助文件

源码运行不需要生成编译资源。编译单文件版本时,按照根目录 README 和 CI 脚本准备 Data/、图标、对应位宽的 Rime DLL,然后使用 scripts/compiled-resource-manifest.json 生成 Lib/RabbitCompiledResources.ahk

pwsh -File .github/scripts/generate-compiled-resources.ps1 `
    -ManifestPath scripts/compiled-resource-manifest.json `
    -OutputPath Lib/RabbitCompiledResources.ahk `
    -RimeDllPath path/to/rime.dll -Architecture x64

生成文件和测试产生的临时目录受 .gitignore 排除。修改资源清单时,同时检查源文件、编译版释放路径和 RabbitCompiledResourcePolicy 的提取行为;不要直接编辑生成的 RabbitCompiledResources.ahk

代码边界

  • Rabbit.ahk 只负责启动和模式分流;普通模式与 --deployer 模式分别进入对应应用类;
  • 运行时状态、输入、候选窗、设置和部署逻辑放在 Lib/ 的专门模块中;
  • 新候选窗功能只面向现代候选窗;旧版候选窗需要回归保护;
  • 不要把应用改动混入 Lib/librime-ahkLib/RimeDepotplum 子模块;
  • 每个模块声明自己的直接 #Include 依赖,不依赖入口脚本碰巧提供的包含顺序;
  • 修改 UI、候选窗、托盘或部署行为时,同时更新对应测试和文档;
  • 涉及配置字段时,同时检查 schemas/rabbit.yaml、配置快照、设置界面、默认值和用户文档;
  • 涉及资源路径时,同时检查 scripts/compiled-resource-manifest.json、工作流路径过滤和编译版释放后的路径。