Linnet(双韵)是一款为 macOS 打造的开源双语输入法。它把中文输入与 Smart English 放进同一个系统输入源:轻按 Shift 即可往返,Caps Lock 则随时进入不经过转换的原始 ASCII。
一个输入源,两种语言,一种连贯的输入体验。
Note
当前正式 Release 只提供一个完整安装包 Linnet.pkg。它没有使用 Apple Developer ID 签名,也未经过公证;macOS 会要求用户手动确认信任。SHA-256 直接写在同一 Release 的说明中,Core 与语言数据组件则位于同仓库、明确标注的更新频道,不再与普通用户下载混在一起。
产品体验 · 安装 · 使用指南 · 设置 · 隐私 · 参与贡献
- 中英自然切换:中文与 Smart English 共用一个 macOS 输入源,不用在系统输入法列表里来回寻找。
- 完整的中文体验:内置全拼与七种双拼方案,共用同一套中文候选、学习数据和本地语言模型。
- 真正面向英文输入:Smart English 提供补全、拼写建议、IPA、中文释义、上下文预测与连续输入处理,同时始终保留原始输入。
- 离线且可掌控:个人词、学习数据、Text Expander 和备份默认保存在本机;启用后,macOS 通过 Linnet 固定的
iCloud Drive/Linnet目录同步 Rime 学习词。 - 原生 macOS 产品:菜单栏状态、候选窗与 Settings 形成统一体验,并提供浅色、深色和多套候选主题。
Linnet 复用 Squirrel、librime、万象、RIME-LMDG、rime-ice 与 Hallelujah 的成熟能力,但不把上游直接拼装成产品。上游版本和输入摘要会被锁定;每次更新先在本地生成、比较并通过候选、数据和交互测试,再进入发布版本。Linnet 目前在这些基础上完成了:
- 中文精校:以万象词表和 LTS 语法模型为核心,保留八种全拼/双拼的一致词库与学习数据;通过可审计的审核表修正已确认的读音、错码与候选顺序,而不是运行时猜测或无差别合并其他中文词库。
- 英文数据整理:从 Hallelujah 与 rime-ice 的锁定输入中选择词频、发音、中文释义和补充词条,经过确定性归一化、去重、格式检查和人工质量审核后生成 Linnet 的英文数据。
- 双语排序与输入语义:在中文候选与明确英文单词发生碰撞时,结合当前拼音方案、完整编码、静态词频与学习结果决定顺序;补全、纠错、预测、大小写、Space/Return、数字键、方向键和原始输入都由 Linnet 的同一交互合同约束。
- macOS 产品增强:在 Squirrel/librime 运行时之上提供单输入源三状态、光标旁状态提示、候选详情、七套主题、原生 Settings、个人数据管理,以及首次注销后无需再次注销的 Core 更新路径。
具体上游版本、选取范围、修改方式和许可证见第三方来源说明与开发指南。
| 状态 | 菜单栏 | 适合场景 |
|---|---|---|
| 中文 | 中 或 双 |
全拼或当前双拼、中文候选、本地语法模型 |
| Smart English | En |
英文补全、纠错、释义、发音与上下文预测 |
| 原始 ASCII | A |
代码、密码、终端和任何不希望被转换的文本 |
独立轻按左 Shift 或右 Shift,在中文与 Smart English 之间切换;Caps Lock 进入或退出原始 ASCII。组合键、Shift 加字母以及长按 Shift 都不会误触发模式切换。 若切换前仍有未上位的拼音或英文,Linnet 会先原样提交这些字母,不会替用户选择中文候选或英文补全。
由当前 SquirrelPanel / SquirrelView 生成的真实光标旁状态提示;菜单栏同步显示 中/双、En 或 A。
Linnet 首次使用默认全拼,也可以在 Settings 中选择自然码、小鹤、微软、搜狗、智能 ABC、紫光或拼音加加。八种方案共享中文词库与学习数据,切换方案不需要重新建立个人词频。
中文候选支持横排或竖排、每页 3/5/7/9 项以及滚动或临时展开浏览。数字键可直接选择候选,鼠标、方向键、Page Up / Page Down 与候选窗按钮负责浏览;逗号、句号等遵循中英文标点状态,/、+、= 等普通运算符直接交给当前应用。
常用辅助入口包括:
Shift+V:符号命令;U+ 十六进制码点:Unicode 输入;cC+ 表达式:本地计算器;uU+ 全拼:部件拆字查询;;或|+ 当前拼音编码:在中文模式中反查英文。
Smart English 适合连续英文写作,也适合在中文工作流中临时输入术语:
- 前缀补全、拼写建议与下一词预测;
- 可选 IPA 和中文释义;
- 保留首字母大写或全大写;
- Space、Return、数字键和方向键均可按当前候选状态提交;Space 上屏时是否自动附加空格可在 Settings 中配置;
- URL、邮箱、路径、版本号和代码标识符尽可能保持原文;
- 原始输入始终作为安全候选,不会被建议静默替换。
Tab 可以设为智能接受、候选导航,或完全交给当前应用。按 Esc 可关闭本次预测并清除当前英文上下文。
由当前候选窗渲染链生成;输入串、候选、选中态和释义均使用真实产品布局。
候选窗口提供宣纸、月华、青岩、陶印、雾青、原生玻璃和墨朱七套主题,每套都包含浅色与深色版本。中文与英文可以分别选择横排或竖排;字体、字号、候选数量和展开方式也可以独立调整。
由当前 data/squirrel.yaml 通过 SquirrelView 生成的 20pt 实际渲染;透明度和系统材质会随 macOS 外观及当前应用背景变化。
除了输入外观,Linnet 还支持:
- 自定义词;
- 按完整单词禁用英文候选;
- 以
x;开头的 Text Expander,例如x;addr; - 中文、英文学习数据的独立开关与清理;
- 个人数据导入、导出、自动备份与恢复。
- 通过产品固定的
iCloud Drive/Linnet目录增量同步中英文学习词,无需选择文件夹;自动检查严格限制为每小时最多一次,完整个人数据另以手动恢复归档传输。
- Apple Silicon Mac(arm64);
- macOS 13 或更高版本;
- Settings 支持 English 与简体中文;
- 候选输出支持简体与繁体切换。
请从项目的 Latest Release 只下载一个文件:Linnet.pkg。进入下载目录后计算哈希:
shasum -a 256 Linnet.pkg输出必须与同一 Release 说明中列出的 64 位 SHA-256 完全一致。Linnet 安装到当前用户目录,不需要管理员权限,也不会安装守护进程、启动项或特权辅助程序。
- 在 Finder 中按住 Control 点击(或右键点击)已校验的
Linnet.pkg,选择 打开,再次确认 打开。若系统没有显示该选项,请打开 系统设置 → 隐私与安全性,在 Linnet 的拦截提示旁选择 仍要打开,然后返回安装器。 - 在 macOS 安装器中依次选择 继续 → 安装并等待“安装成功”。Linnet 只安装到当前用户的
~/Library/Input Methods/Linnet.app;不要把 App 手工拖动或复制到其他目录。 - 保存工作,注销当前 macOS 账户并重新登录。这一步只在第一次安装时执行,用于让 macOS 完成输入源登记;以后安装 Core 更新不需要再次注销。
- 重新登录后打开 系统设置 → 键盘 → 文本输入 → 编辑。如果列表中已有 Linnet,确认它已启用;如果没有,点击 +,搜索或找到 Linnet,选择后点击 添加,并按 macOS 提示允许该输入源。
- 点击菜单栏输入菜单或按系统的输入源切换快捷键,选择带小鸟图标的 Linnet。这一步只选择 Linnet 输入源,不是在系统列表中分别添加中文和英文。
- 确认菜单栏显示
中/双,输入拼音可以提交中文候选;独立轻按 Shift 应显示En并输入英文,Caps Lock 应显示A;输入菜单中的 Settings 应能打开设置窗口。
已经完成过上述首次安装的用户,后续只使用对应 core-v<version> 页面的 Core 安装包;更新不会删除或重新添加输入源,也不需要再次注销。安装程序只更新磁盘文件,不停止正在运行的 Host,因此不会断开 TextEdit、Teams、浏览器或其他应用的输入连接,也不要求退出这些应用。安装后打开 Settings → 数据 → 版本,可分别查看“已安装”和“正在运行”的版本与 revision。可以继续使用当前 Host;若页面提供“应用已安装的更新”,可按提示先从 macOS 菜单切换到其他输入法并关闭本次登录期间使用过 Linnet 的其他应用,再由用户主动应用。Linnet 不会替用户关闭应用或程序化切换输入源;无法证明安全时会保留当前 Host,新 Core 在下次登录或重启后生效。
Linnet 不会自动点击系统授权或替用户选择输入源。社区安装包没有 Apple Developer ID 签名或公证,因此“无法验证开发者”是预期提示;手动信任只应在文件名和同一 Release 说明中的 SHA-256 都校验成功后进行。不要关闭 Gatekeeper、不要清除隔离属性,也不要执行来源不明的安装命令。若系统报告校验和不一致、文件损坏或恶意软件,请停止安装。
- 中文 ↔ Smart English:独立轻按左 Shift 或右 Shift;
- 任意模式 ↔ 原始 ASCII:Caps Lock;
- 当前有组词时,Linnet 会按标准输入规则处理现有内容后再切换;
Shift+字母、带 Command/Option/Control 的 Shift 组合键与长按 Shift 不切换模式。
系统输入菜单中的小鸟代表唯一的 Linnet 输入源;中、双、En、A 才是当前输入状态。
在中文模式中,先输入 Settings 选择的触发键,再输入当前全拼或双拼编码。默认触发键是 ;,备用触发键是 |。
;suanfa → algorithm
选择自然码后,同一示例可以写成 ;srfa。Smart English 中也可直接输入纯字母拼音编码查看英文候选;普通英文候选仍排在前面,拼音结果不会取代原始输入。
- 自定义词由显示文本和小写 Rime code 组成,会进入正常候选和学习流程。
- 禁用英文词按大小写不敏感的完整词隐藏静态、学习、纠错、发音和预测候选。
- Text Expander触发器必须以
x;开头;未知触发器按原文保留,展开值不会再经过大小写、空格或释义处理。
从 macOS 输入菜单选择 Settings。设置窗口内嵌在 Linnet.app 中,不会作为独立应用安装,也不会常驻 Dock。
| 标签 | 可以管理的内容 |
|---|---|
| 外观 | 七套主题、浅色/深色、字体、字号、候选数量、横排/竖排与候选展开方式 |
| 输入 | 全拼/双拼、中文学习、简繁、Emoji、标点、辅助码和拼音反查触发键 |
| 词典 | 自定义词、禁用英文词、Text Expander,以及带自动备份的安全应用 |
| 英文 | 自动大写、IPA、中文释义、上下文预测、拼写建议、英文学习、Space 尾随空格和 Tab 行为 |
| 数据 | 组件版本、iCloud Drive 学习词同步、完整恢复归档、数据导入导出、学习数据清理、备份恢复与隐私处理后的诊断 |
外观预览会使用所选主题、字号与布局;需要改变输入行为的选项在点击 Apply Changes 后生效。请不要手工编辑 Linnet 生成的 linnet_user.custom.yaml、squirrel.custom.yaml、default.custom.yaml 或 schema custom 文件。
Settings 每次打开时会从同一 GitHub 仓库读取一个经过校验的小型 Catalog,并在“数据 → 版本”中安静显示“已是最新”、Core 更新或语言数据更新;同一区域还会比较磁盘上已安装的 Core 与当前 Host 的版本、build 和 revision,避免把“安装成功”误报成“新代码已经运行”。输入进程始终离线;检查不会下载大型词库,也不会弹出系统通知。只有用户明确点击语言数据更新后,Settings 才会下载并校验语言包,再通过现有事务原子激活。
Linnet 0.1 系列不在后台静默安装未经过 Apple Developer ID 签名和公证的
Core/App。Settings 会检查并提醒新版本;点击 View Core Update / 查看核心更新
会打开同仓库对应的 Core 页面,由用户核对 SHA-256 并按 macOS 提示确认安装。
App 内部使用长期固定的免费 CMS 身份;旧 ad-hoc 版完成一次迁移后,后续同一
身份的 Core 更新无需再次注销或重新添加输入法。安装与更新永远不会要求发布
Keychain 密码;若看到此类提示,应取消并向项目报告。正式
版本页只保留完整安装包;core-v<version> 预发布页服务已有用户免注销更新,
data-<sequence> 预发布页服务 Settings 的语言数据频道。两者都不会成为
Latest Release,也不会干扰首次安装下载。
已经完成首次安装和一次注销的用户,打开同版本 core-v<version> 页面,只下载:
Linnet-<version>-arm64-Core-community-beta.pkg。
LINNET_VERSION='X.Y.Z'
shasum -a 256 "Linnet-${LINNET_VERSION}-arm64-Core-community-beta.pkg"输出必须与 Core 更新页说明中的 SHA-256 完全一致。随后在 Finder 中按住 Control 点击 Core 安装包并选择 打开。Core 只更新 App,保持已安装语言包、个人数据、输入源状态和现有应用的输入连接,不重新注册输入源,也不要求再次注销或退出正在使用的应用。安装结束后在 Settings → 数据 → 版本 检查“已安装”和“正在运行”的身份;两者暂时不同是预期状态。可以继续使用当前 Host,也可以按页面提示主动应用;安全条件不满足时不会退出 Host,新 Core 在下次登录或重启后生效。已有安装不要使用 Linnet.pkg;Complete 会拒绝覆盖并提示改用 Core。若 Core 报告身份、版本或安装状态不一致,请停止,不要手工复制 App 或改用 Complete 绕过检查。
卸载工具也在对应的 core-v<version> 更新页。下载并核对页面中的 SHA-256 后,先查看计划:
LINNET_VERSION='X.Y.Z'
"./Linnet-${LINNET_VERSION}-Uninstall.command" --print-plan
"./Linnet-${LINNET_VERSION}-Uninstall.command"默认卸载会删除应用、语言包和生成数据,但保留个人词、学习数据、Text Expander、备份与偏好。完成后注销并重新登录。
只有确定不再需要任何 Linnet 用户数据时,才使用不可恢复的完整清理:
"./Linnet-${LINNET_VERSION}-Uninstall.command" --purge-user-data- 确认安装位置是
~/Library/Input Methods/Linnet.app; - 完成一次真正的注销并重新登录;
- 在 系统设置 → 键盘 → 文本输入 → 编辑 中手动添加并允许 Linnet;
- Control-Space 只会轮换 macOS 已启用的输入源,Linnet 不接管这个系统快捷键。
- 菜单栏为
A:关闭 Caps Lock; - 菜单栏为
En:轻按 Shift 返回中文; - 没有
中/双:在 Settings → 输入选择中文方案并应用,再重新选择 Linnet。
不要手工修改生成的 YAML。前往 数据 → Diagnostics 刷新并复制诊断;公开前仍需人工检查文本与截图,避免包含个人信息。
请提供 macOS 版本、Mac 芯片、Linnet 版本、下载文件 SHA-256、当前状态、Rime 方案、发生问题的应用和最小复现输入。不要提交个人词典、学习数据库、私钥、证书密码或完整用户目录。
Linnet 没有账户体系、遥测、广告或分析 SDK,也不调用在线翻译、在线拼写或生成式模型。键入内容与个人输入数据留在本机:
~/Library/Application Support/Linnet/
只有用户在 Settings 中明确选择导入时,Linnet 才会读取其他 Rime 或 Hallelujah 数据。导出文件可能包含用户主动选择的个人数据,需由用户自行妥善保存与删除。
iCloud Drive 学习词同步由用户显式启用,但目录固定为 iCloud Drive/Linnet,不提供目录选择器。Linnet 把其中的 Linnet-Rime-Sync 配置为 Rime 的标准 sync_dir,由 Rime 按设备导出并增量合并中英文学习词,同时明确关闭 Rime 的自动配置备份;自动周期最多每小时一次,输入框或数据事务忙时会延后,用户也可主动点按“立即同步”。Linnet 不实现第二套词频或冲突算法,也不直接访问 iCloud 账户;云端传输由 macOS 的 iCloud Drive 完成。
自定义词、停用词、Text Expander 和设置不属于 Rime 学习词同步。需要迁移这些数据时,可手动上传或审阅 Linnet-Full-Backup.linnet-data;导入仍需确认,并会先创建本地备份。
只有 Settings 会联网:打开设置时向 GitHub 请求固定 Catalog 以检查版本,用户明确点击数据更新后才下载语言包。第三方下载镜像可能看到 IP、请求时间与公开文件 URL,但 Linnet 不会向 GitHub 或镜像发送个人词典、学习数据、备份、诊断或凭据。
构建 Linnet 需要 Apple Silicon Mac、macOS 13+、完整 Xcode、Git 和 ripgrep。项目主要使用 Swift/SwiftUI、C++、Shell 与 Ruby,不携带 Python 运行时。
./action-build.sh release
tests/verify_development.sh已有完整依赖缓存时,可以离线构建:
no_download=1 ./action-build.sh release普通开发不需要签名证书,也不需要把本地构建注册为系统输入法。目录结构、数据生成、上游同步、测试层级与本机验收方法请阅读开发指南;打包、签名和公开发布流程请阅读发布指南。
当前版本是 0.1.9(2026-08-28)。完整的用户可见变化见版本记录。
Linnet 是从 Squirrel 修改而来的独立社区发行版,不代表任何上游项目的官方发行。本仓库已修改上游代码与数据;首个公开修改版日期为 2026-08-20。主要关系如下:
| 上游来源 | Linnet 的使用与修改 | 许可证摘要 |
|---|---|---|
| Squirrel / librime | macOS 输入法与 Rime 运行时基础;修改了产品身份、单输入源双语工作流、候选交互、原生 Settings 与发行打包 | GPL-3.0-only(Squirrel);BSD-3-Clause(librime) |
| Rime Wanxiang | 中文词典核心与八种全拼/双拼布局;锁定上游表,并应用经过审核的读音、错码与排序修正 | CC BY 4.0 |
| RIME-LMDG | 锁定并离线打包 Wanxiang LTS 语法模型 | CC BY 4.0 |
| rime-ice / HallelujahIM | 选取英文、部件、符号、Emoji/OpenCC、Lua、词频、发音与释义输入;经确定性归一化和人工审核生成 Linnet 数据 | GPL-3.0-only;精确适用范围见第三方声明 |
| librime-lua、librime-octagram、librime-predict 及其他运行时依赖 | 随 App 静态集成或嵌入,未作为第二套产品来源 | 以第三方声明、发行 NOTICE 与 SBOM 为准 |
完整的来源范围、修改说明和许可证关系见第三方来源、修改与许可证,许可证文本见 LICENSES/。正式发行包还会携带绑定到精确版本与提交的 NOTICE.md、SBOM.spdx.json、VERSION.json 和许可证文件,避免 README 摘要与实际交付内容漂移。
Linnet 自有源码采用 GPL-3.0-or-later 许可证。


