Skip to content

Latest commit

 

History

74 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Linnet

Linnet — Chinese and English, in one flow

Linnet(双韵)是一款为 macOS 打造的开源双语输入法。它把中文输入与 Smart English 放进同一个系统输入源:轻按 Shift 即可往返,Caps Lock 则随时进入不经过转换的原始 ASCII。

一个输入源,两种语言,一种连贯的输入体验。

Note

当前正式 Release 只提供一个完整安装包 Linnet.pkg。它没有使用 Apple Developer ID 签名,也未经过公证;macOS 会要求用户手动确认信任。SHA-256 直接写在同一 Release 的说明中,Core 与语言数据组件则位于同仓库、明确标注的更新频道,不再与普通用户下载混在一起。

下载最新版 Linnet.pkg

本文对应 0.1.10;正式可下载版本以 Latest Release 为准。 本次重点改进候选文字与释义布局、主题预览、候选翻页及预测编号,并修正语言数据更新误报。 完整内容见0.1.10 变更记录

产品体验 · 安装 · 使用指南 · 设置 · 隐私 · 参与贡献

为什么选择 Linnet

  • 中英自然切换:中文与 Smart English 共用一个 macOS 输入源,不用在系统输入法列表里来回寻找。
  • 完整的中文体验:内置全拼与七种双拼方案,共用同一套中文候选、学习数据和本地语言模型。
  • 真正面向英文输入:Smart English 提供补全、拼写建议、IPA、中文释义、上下文预测与连续输入处理,同时始终保留原始输入。
  • 离线且可掌控:个人词、学习数据、Text Expander 和备份默认保存在本机;启用后,macOS 通过 Linnet 固定的 iCloud Drive/Linnet 目录同步 Rime 学习词。
  • 原生 macOS 产品:菜单栏状态、候选窗与 Settings 形成统一体验,并提供浅色、深色和多套候选主题。

基于成熟上游,由 Linnet 精校与增强

Linnet 复用 Squirrel、librime、万象、RIME-LMDG、rime-ice 与 Hallelujah 的成熟能力,但不把上游直接拼装成产品。上游版本和输入摘要会被锁定;每次更新先在本地生成、比较并通过候选、数据和交互测试,再进入发布版本。Linnet 目前在这些基础上完成了:

  • 中文精校与补充:以万象词表和 LTS 语法模型为核心,保留八种全拼/双拼的一致词库与学习数据;通过可审计的审核表修正已确认的读音、错码与候选顺序,并从锁定的 rime-ice 扩展表中补充万象尚未覆盖的三字及以上词条。补充词会先转换到万象的声调编码与权重空间,重复、歧义或无法验证读音的行不会进入产品。
  • 英文数据整理:从 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 会先原样提交这些字母,不会替用户选择中文候选或英文补全。

Linnet 中文、Smart English 与原始 ASCII 三种输入状态的真实光标提示

由当前 SquirrelPanel / SquirrelView 生成的真实光标旁状态提示;菜单栏同步显示 /EnA

中文输入

Linnet 首次使用默认全拼,也可以在 Settings 中选择自然码、小鹤、微软、搜狗、智能 ABC、紫光或拼音加加。八种方案共享中文词库与学习数据,切换方案不需要重新建立个人词频。

中文候选支持横排或竖排、每页 3/5/7/9 项以及滚动或临时展开浏览。数字键可直接选择候选,鼠标、方向键、Page Up / Page Down、[ / ]- / = 与候选窗按钮负责翻页。没有组合或候选菜单时,/ , . ; ' [ ] - = 都直接交给当前应用;有候选时 [ / ]- / = 才作为翻页键,拼音方案自身的音节分隔键仍按该方案工作。

常用辅助入口包括:

  • Shift+V:符号命令;
  • U + 十六进制码点:Unicode 输入;
  • cC + 表达式:本地计算器;
  • uU + 全拼:部件拆字查询;
  • | + 当前拼音编码:在中文模式中反查英文;也可在 Settings 中显式改用 ;

Smart English

Smart English 适合连续英文写作,也适合在中文工作流中临时输入术语:

  • 前缀补全、拼写建议与下一词预测;预测候选同样显示 1–9 序号,可直接用数字键选择;
  • 可选 IPA 和中文释义;
  • 保留首字母大写或全大写;
  • Space、Return、数字键和方向键均可按当前候选状态提交;Space 上屏时是否自动附加空格可在 Settings 中配置;
  • URL、邮箱、路径、版本号和代码标识符尽可能保持原文;
  • 原始输入始终作为安全候选,不会被建议静默替换。

Tab 可以设为智能接受、候选导航,或完全交给当前应用。按 Esc 可关闭本次预测并清除当前英文上下文。

Linnet 拼音反查英文与 Smart English 的真实候选窗

由当前候选窗渲染链生成;输入串、候选、选中态和释义均使用真实产品布局。

外观与个性化

候选窗口提供宣纸、月华、青岩、陶印、雾青、原生玻璃和墨朱七套主题,每套都包含浅色与深色版本。中文与英文可以分别选择横排或竖排;字体、字号、候选数量和展开方式也可以独立调整。

Linnet 七套候选窗主题的 Light 与 Dark 实际渲染

由当前 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 安装到当前用户目录,不需要管理员权限,也不会安装守护进程、启动项或特权辅助程序。

首次启用

  1. 在 Finder 中按住 Control 点击(或右键点击)已校验的 Linnet.pkg,选择 打开,再次确认 打开。若系统没有显示该选项,请打开 系统设置 → 隐私与安全性,在 Linnet 的拦截提示旁选择 仍要打开,然后返回安装器。
  2. 在 macOS 安装器中依次选择 继续 → 安装并等待“安装成功”。Linnet 只安装到当前用户的 ~/Library/Input Methods/Linnet.app;不要把 App 手工拖动或复制到其他目录。
  3. 保存工作,注销当前 macOS 账户并重新登录。这一步只在第一次安装时执行,用于让 macOS 完成输入源登记;以后安装 Core 更新不需要再次注销。
  4. 重新登录后打开 系统设置 → 键盘 → 文本输入 → 编辑。如果列表中已有 Linnet,确认它已启用;如果没有,点击 +,搜索或找到 Linnet,选择后点击 添加,并按 macOS 提示允许该输入源。
  5. 点击菜单栏输入菜单或按系统的输入源切换快捷键,选择带小鸟图标的 Linnet。这一步只选择 Linnet 输入源,不是在系统列表中分别添加中文和英文。
  6. 确认菜单栏显示 /,输入拼音可以提交中文候选;独立轻按 Shift 应显示 En 并输入英文,Caps Lock 应显示 A;输入菜单中的 Settings 应能打开设置窗口。

已完成首次安装的用户,后续使用 Core 安装包,不必重新添加输入源。安装成功不等于新代码已经运行:安装器只替换磁盘文件,不停止当前输入法进程,以保持现有应用的输入连接。具体操作见安装后应用更新

Linnet 不会自动点击系统授权或替用户选择输入源。社区安装包没有 Apple Developer ID 签名或公证,因此“无法验证开发者”是预期提示;手动信任只应在文件名和同一 Release 说明中的 SHA-256 都校验成功后进行。不要关闭 Gatekeeper、不要清除隔离属性,也不要执行来源不明的安装命令。若系统报告校验和不一致、文件损坏或恶意软件,请停止安装。

使用指南

切换输入状态

  • 中文 ↔ Smart English:独立轻按左 Shift 或右 Shift;
  • 任意模式 ↔ 原始 ASCII:Caps Lock;
  • 当前有组词时,Linnet 会按标准输入规则处理现有内容后再切换;
  • Shift+字母、带 Command/Option/Control 的 Shift 组合键与长按 Shift 不切换模式。

系统输入菜单中的小鸟代表唯一的 Linnet 输入源;EnA 才是当前输入状态。

拼音反查英文

在中文模式中,先输入 Settings 选择的触发键,再输入当前全拼或双拼编码。默认触发键是 |;如果用户明确选择 ;,分号才会成为反查触发键。

|suanfa  → algorithm

选择自然码后,同一示例可以写成 |srfa。Smart English 中也可直接输入纯字母拼音编码查看英文候选;普通英文候选仍排在前面,拼音结果不会取代原始输入。

自定义词与 Text Expander

  • 自定义词由显示文本和小写 Rime code 组成,会进入正常候选和学习流程。
  • 禁用英文词按大小写不敏感的完整词隐藏静态、学习、纠错、发音和预测候选。
  • Text Expander触发器必须以 x; 开头;未知触发器按原文保留,展开值不会再经过大小写、空格或释义处理。

设置

从 macOS 输入菜单选择 Settings。设置窗口内嵌在 Linnet.app 中,不会作为独立应用安装,也不会常驻 Dock。

标签 可以管理的内容
外观 七套主题、浅色/深色、字体、字号、候选数量、横排/竖排与候选展开方式
输入 中文区管理全拼/双拼、学习、简繁、Emoji、标点、辅助码和反查;Smart English 区管理自动大写、IPA、释义、预测、纠错、学习、Space 尾随空格和 Tab
词典 自定义词、禁用英文词与 Text Expander
数据与更新 Core 与词包版本、iCloud Drive 增量学习同步、手动完整备份/恢复、事务恢复记录、导入导出、学习数据清理与隐私处理后的诊断

主题卡片上下展示同一套主题的浅色、深色候选小样,包含真实编号、文字和选中样式。宣纸是暖纸色与琥珀下划线,月华是玉绿竖线,青岩是冷蓝方角高亮,陶印是陶土色圆角块,雾青是半透明青绿,原生玻璃是系统材质与蓝色高亮,墨朱是黑白底与朱红下划线。界面主题随 Core 更新,设置预览与实际候选窗使用同一套主题资源;无需更新词包,也不会重置已选主题、字体和字号。

外观预览会使用所选主题、字号与布局;需要改变输入行为的选项在点击 Apply Changes 后生效。请不要手工编辑 Linnet 生成的 linnet_user.custom.yamlsquirrel.custom.yamldefault.custom.yaml 或 schema custom 文件。

Settings 每次打开时会从同一 GitHub 仓库读取一个经过校验的小型 Catalog,并在“Data & Updates / 数据与更新”中安静显示“已是最新”、Core 更新或具体语言数据更新;同一区域还会比较磁盘上已安装的 Core 与当前 Host 的版本和 build,避免把“安装成功”误报成“新代码已经运行”。源码 revision 仅在高级详情中显示。输入进程始终离线;检查不会下载大型词库,也不会弹出系统通知。只有用户明确点击语言数据更新后,Settings 才会下载并校验语言包,再通过现有事务原子激活。

本地语言数据比频道版本更新时,会明确显示“已安装的语言数据领先于此更新频道”,不会提示降级或下载旧包。语言包以各自的 Data release 序号比较新旧;整组更新必须兼容且不让任何已有包倒退,同一序号对应不同内容会报告校验失败。

升级与卸载

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,保持已安装语言包、个人数据和输入源状态,不重新注册输入源。如果 Linnet Settings 正打开,安装器会先关闭这个 Linnet 自身窗口;不需要退出 TextEdit、Teams、浏览器等正在使用的应用。

安装后应用更新

  1. 安装器显示“安装成功”后,从 Linnet 输入菜单打开 Settings
  2. 进入 数据与更新 → 核心更新Data & Updates → Core update)。查看“已安装”和“正在运行”:前者是磁盘上的版本,后者是当前输入法进程实际加载的版本。
  3. 完成或取消当前组词,再从 macOS 输入菜单切换到其他输入法,保留正在使用的应用窗口。
  4. 点击 应用已安装的更新…Apply Installed Update…),按对话框提示确认。不要把它与用于修改设置的 Apply Changes 混淆。
  5. 操作完成后切回 Linnet,输入几个字确认候选窗正常;回到核心更新卡片,确认“正在运行”与“已安装”一致。

两行版本号相同,为什么仍提示有更新? 展开 高级版本详情Advanced version details),比较两行“源码修订”。本地验收修复可能沿用同一产品版本和 build,但源码修订不同;这时旧代码仍在运行,需要按上述步骤应用更新。

没有待应用更新时,按钮置灰是正常的。有未保存的设置或正在进行的数据操作时,请先完成页面提示的操作。应用被阻止时,根据卡片说明处理后重试;Linnet 不会替你切换输入源或强制关闭用户应用。若旧版 Host 不支持当前会话内应用更新,会明确提示等下次正常登录或重启后生效,不应反复重装或删除输入源。支持会话内更新的 Host 无需注销。

健康安装不要用 Linnet.pkg 覆盖 Core。只有 Core 明确报告 Linnet App 身份受支持但 TIS 注册缺失时,Complete 才负责修复注册;重复、冲突或无法验证的系统残留必须先使用官方卸载工具,再重新安装 Complete。不要手工复制 App 或绕过检查。

卸载

卸载工具也在对应的 core-v<version> 更新页。下载并核对页面中的 SHA-256 后,先查看计划:

运行卸载器前,必须先从 macOS 输入菜单切换到其他输入法。卸载器不会执行安装目录内的 Host,也不会替用户终止 Host 或 Settings;如果检测到其精确进程仍在运行,会停止且不删除任何内容,请注销并重新登录后再运行卸载器。

LINNET_VERSION='X.Y.Z'
"./Linnet-${LINNET_VERSION}-Uninstall.command" --print-plan
"./Linnet-${LINNET_VERSION}-Uninstall.command"

默认卸载会删除 App、语言包和生成数据,但保留个人词、学习数据、Text Expander、备份、事务记录与偏好。完成后注销并重新登录,以刷新 macOS 输入源列表。

只有确定不再需要任何 Linnet 用户数据时,才使用不可恢复的完整清理:

"./Linnet-${LINNET_VERSION}-Uninstall.command" --purge-user-data

运行日志位于产品固定目录 Application Support/Linnet/Runtime/Logs,会随默认卸载的 Runtime 一起删除。--purge-user-data 还会删除偏好和剩余个人数据;卸载器不会猜测或遍历系统临时目录。

故障排查

系统找不到 Linnet

  • 确认安装位置是 ~/Library/Input Methods/Linnet.app
  • 完成一次真正的注销并重新登录;
  • 系统设置 → 键盘 → 文本输入 → 编辑 中手动添加并允许 Linnet;
  • Control-Space 只会轮换 macOS 已启用的输入源,Linnet 不接管这个系统快捷键。

只能输入字母

  • 菜单栏为 A:关闭 Caps Lock;
  • 菜单栏为 En:轻按 Shift 返回中文;
  • 没有 /:在 Settings → 输入选择中文方案并应用,再重新选择 Linnet。

Settings 无法应用

不要手工修改生成的 YAML。前往 数据与更新 → 诊断Data & Updates → 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

普通开发不需要签名证书,也不需要把本地构建注册为系统输入法。目录结构、数据生成、上游同步、测试层级与本机验收方法请阅读开发指南;打包、签名和公开发布流程请阅读发布指南

版本、来源与许可证

当前公开版本见 Latest Release;本分支版本为 0.1.10(2026-08-30)。完整的用户可见变化见版本记录

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 选取 rime-ice 三字及以上中文扩展词及英文、部件、符号、Emoji/OpenCC、Lua 输入,并选取 Hallelujah 词频、发音与释义输入;经确定性投影、归一化和人工审核生成 Linnet 数据 GPL-3.0-only;精确适用范围见第三方声明
librime-lua、librime-octagram、librime-predict 及其他运行时依赖 随 App 静态集成或嵌入,未作为第二套产品来源 以第三方声明、发行 NOTICE 与 SBOM 为准

完整的来源范围、修改说明和许可证关系见第三方来源、修改与许可证,许可证文本见 LICENSES/。正式发行包还会携带绑定到精确版本与提交的 NOTICE.mdSBOM.spdx.jsonVERSION.json 和许可证文件,避免 README 摘要与实际交付内容漂移。

Linnet 自有源码采用 GPL-3.0-or-later 许可证。

About

Linnet (双韵) — native offline Chinese & Smart English input method for macOS, powered by Rime/Squirrel, with pinyin, shuangpin and Shift switching. 原生离线中英双语输入法。

Topics

Resources

Stars

5 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages