Pretype — 你的 Mac 替你把话说完

pre·type /ˈpriː.taɪp/ · 名词
在你打出来之前就已存在的文字。
52 毫秒 · 本地
最好的界面是看不见的——它就在你的光标处。
Tab ⇧Tab整句 Esc关闭 已输入 0 字符 · 已上传 0 字节
这是什么

你的代码编辑器替你补全整行。Pretype 把这件事带到你在 Mac 上写的一切。

深色的一半你来打 — 灰色的一半由你芯片上的模型来打。

最好的界面是看不见的——它就在你的光标处。

墨色 = 你 蓝色 = 光标,两者相遇的地方 灰色 = 模型
以及其余的一切

灰色文字是完整的想法,却不是完整的应用。下面这些都是同一个本地模型、同一个光标——用你手指本就搭着的键。

  • Tab

    改掉拼写错误

    macOS 词典浮在那个词上方——用它在光标周围读到的语言。Esc 丢弃它,同一个词再也不会问第二次。

  • Tab

    把 emoji 拼出来

    macOS 本就认得每一个 Unicode 名称,所以成千上万的简码都出现在同一个小气泡里,不必随包附带任何表。

  • ⌥Tab

    重写别扭的句子

    语法和措辞就地修好,仍是你的语气——什么都没选时,修的是你刚敲下的那个词。永远先给你看,绝不背着你落笔。

  • ⌥⇧Tab

    写完整条回复

    面对空的聊天框,它读屏幕上的对话,把你的下一条消息作为一整段灰色文字草拟出来。需自行开启,OCR 全在本机,只在这个组合键下发生。

  • 自动

    记住你的用词

    你的名字、你的黑话、你一天敲十遍的那句话——来自一个由你自己的文字、在这台 Mac 上建起来的模型,比大模型开跑还早就答上来。可以清空,也可以关掉。

  • 自动

    知道什么时候闭嘴

    终端和密码管理器里从不出现,macOS 报告安全输入时也从不出现。在你总是忽略它的应用里,它会停止提示——并在菜单里说明,附上一键恢复。

无处不在

Tab 在这里有效。 在你 Mac 的每一个文本框里也一样 — 无需为每个应用装插件。

Mail
Messages
Slack
Notes
Safari
VS Code
Telegram
Obsidian
Claude
Xcode
Linear
每个输入框
它挂接的是文本框本身 — 原生应用、Electron、Web 视图。在终端、密码管理器和安全输入时刻意保持沉默。
工作原理

还是你的话。只是已经打好了。

1

安装

拖进「应用程序」。没有账号、没有向导 — 一个菜单栏图标、一次辅助功能授权、一次性下载的模型(约 2 GB)。

应用程序
2

输入

像平常一样写。幽灵文字出现在光标处,匹配输入框自己的字体。猜错了?继续打就行。

Mail
收件人:legal@ — 回复:Q3 数据
谢谢这么快回复 — 数据没问题,今天就发给法务。
3

Tab

Tab 接受一个词,⇧Tab 接受整句。下一次 Tab 将接受的部分颜色深一档。没有建议时,Tab 就只是 Tab。

Slack — #eng
发送到 #eng
有人能看下 #4821 吗?很小 — 两个文件,基本都是测试。
模型

补全、纠错与回复各有自己的评测 — 默认模型按你 Mac 的内存自动选择。你完全可以不用操心。

Tab 补完的那段灰色文字。十一个模型跑同一批留出句子,可按你真正在用的语言重新排名。

就地修好选中的文字。这个组合键跑的不是你选的模型,而是它的 instruct 同族模型——所以这里的六行都是同族模型,每一行都写明哪些选择会落到它身上。

根据屏幕上的对话起草整条消息。同样是纠错用的那六个同族模型——排名却几乎完全相反。

首词准确率,占全部案例 % 覆盖率 延迟,p50
1 Gemma 4 E4B 8-bit 8.6 GB 23% 82% 145 毫秒
2 Gemma 4 E2B 8-bit 5.7 GB 默认 · 24 GB 22% 82% 75 毫秒
3 Gemma 4 E4B 6-bit 6.8 GB 默认 · 32 GB + 22% 81% 129 毫秒
4 Gemma 4 E2B 4-bit 3.5 GB 默认 · 16–18 GB 20% 81% 127 毫秒
5 Qwen3.5 2B 1.6 GB 默认 · 8 GB 15% 74% 93 毫秒
6 MiniCPM5 1B 2.2 GB 13% 72% 49 毫秒
7 Qwen2.5 0.5B 1.0 GB 12% 74% 79 毫秒
8 Ternary Bonsai 4B 1.1 GB 12% 72% 102 毫秒
9 LFM2.5 1.2B 2.2 GB 11% 67% 59 毫秒
10 Gemma 4 E4B 4-bit 5.0 GB 10% 72% 151 毫秒
11 Apple Intelligence 0 GB 9% 75% 430 毫秒

圆点大小 = 常驻内存(空心 = macOS 内置)· 覆盖率 = 给出建议的案例占比 · ± = 该语言与模型 17 语言平均值之差

首词准确率,沉默计为未命中;配对样本(OpenSubtitles · Tatoeba · Leipzig)· 单语言样本较薄(±5–10 pp)——请在同一语言内比较模型,勿跨语言比较数值 · 2026-07

完全还原,占 510 行含错字文本 % 给出建议 延迟,p50
1 Gemma E4B-it 4-bit 5.0 GB · 服务于 Gemma E4B tiers · E2B 8-bit 65% 89% 1523 毫秒
2 Gemma E2B-it 4-bit 3.5 GB · 服务于 Gemma E2B 4-bit 50% 90% 378 毫秒
3 Qwen3.5 2B 1.6 GB · 用自己纠错 32% 74% 255 毫秒
4 Ternary Bonsai 4B 1.1 GB · 用自己纠错 21% 43% 324 毫秒
5 Qwen2.5 0.5B-it 0.4 GB · 服务于 Qwen2.5 0.5B 11% 41% 185 毫秒
6 MiniCPM5 1B-it 2.2 GB · 服务于 MiniCPM5 1B 4% 28% 668 毫秒

须线 = 95% 置信区间 · 红色刻线 = 本来就正确的行被改写的频率(170 行干净对照)· 给出建议 = 提出了任何修改的行占比 · 圆点大小 = 常驻内存

每行一个真实错字,17 种语言,走的是实际发布的流程——最小改动闸门已计入这些数字。改对了但换了说法算作未命中,所以真实可用度高于这条线。单语言样本只有 30 行——请看须线,别看数字。E4B 8-bit 与 6-bit 档跑的是 6-bit 同族模型,本次未覆盖;4-bit 那一行是它的实测下限。Apple Intelligence 不在本次测量中 · 2026-07

可用草稿,占 570 段对话 % 作答 延迟,p50
1 MiniCPM5 1B-it 2.2 GB · 服务于 MiniCPM5 1B 56% 94% 1801 毫秒
2 Qwen3.5 2B 1.6 GB · 用自己纠错 46% 100% 448 毫秒
3 Qwen2.5 0.5B-it 0.4 GB · 服务于 Qwen2.5 0.5B 38% 94% 345 毫秒
4 Gemma E4B-it 4-bit 5.0 GB · 服务于 Gemma E4B tiers · E2B 8-bit 33% 100% 532 毫秒
5 Gemma E2B-it 4-bit 3.5 GB · 服务于 Gemma E2B 4-bit 32% 100% 356 毫秒
6 Ternary Bonsai 4B 1.1 GB · 用自己纠错 21% 91% 324 毫秒

须线 = 95% 置信区间 · 作答 = 起草了任何内容的比例 · 圆点大小 = 常驻内存 · ± = 该语言与模型 19 语言总体之差

草稿只要用对话的语言写成且没有复读屏幕内容即算可用——这是可用性的下限,不是质量评分;与参考答案的相似度噪声太大,未予采用。19 种语言、每种 30 段对话,单语言样本很宽——请看须线。Apple Intelligence 不在本次测量中 · 2026-07

应用本身

每个设置都标注实测代价。

三个面板——展示、模型、个性化。悬停在任意控件上,Pretype 都会基于真实测量告诉你它改善什么、代价是什么。

行内幽灵文本或浮动面板、接受快捷键、可见度实时预览——还可按应用停用。

Pretype 设置「通用」面板:展示模式、接受快捷键、幽灵文本可见度滑块与按应用排除。
理念

你的文字属于你。

云端的方式
你输入 » 他们的服务器 » 他们的模型 » 他们的日志
订阅、账号、API 密钥
一份你草草扫过、只能祈祷的隐私政策
一上飞机就失灵的自动补全
pretype 的方式
你输入 » 你的芯片 » 幽灵文字
0 元 — 免费、MIT 许可、无需账号
一份你可以亲自编译的隐私政策
飞行模式下照常工作,永远如此
pretype 会经过网络的全部内容
你的文字、你的按键
» 无处可去
永远 0 字节 — 由架构保证
模型权重约 1.6–2.2 GB
« Hugging Face
仅首次启动时一次
版本检查,不带任何数据
» GitHub Releases
每天一次 · 可在设置中关闭
默认坦诚 — 它需要「辅助功能」权限,和键盘记录器要的是同一个授权。正因如此,整条输入链路是开源的 — 短到一杯咖啡的工夫就能读完:
代码

隐私不该靠信任 — 整条输入链路只有三个文件。信任之前,先读一读。

AXText.swift 570 行 · 读取文本框
/// Fallback for apps whose focus
/// notifications never fire (some
/// Electron builds): ask the system-
/// wide element who has focus now.
static func
systemFocusedTextElement()
    -> AXUIElement? {
  let sys =
    AXUIElementCreateSystemWide()
  guard CopyAttributeValue(sys,
    kAXFocusedUIElementAttribute,
    &ref) == .success
  else { return nil }
  return isEditableTextElement(el)
    ? el : nil
}
KeyTap.swift 83 行 · 捕获 Tab
/// CGEvent tap on key-down events.
/// The handler returns `true` to
/// swallow the event — used to eat
/// Tab while a suggestion is shown.
final class KeyTap {
  func start() {
    let mask = CGEventMask(
      1 << CGEventType
        .keyDown.rawValue)
    tapPort = CGEvent.tapCreate(
      tap: .cgSessionEventTap,
      place: .headInsertEventTap,
      options: .defaultTap,
      eventsOfInterest: mask,
      ...)
  }
}
TextInjector.swift 63 行 · 把文字打回去
/// Inserts text by posting synthetic
/// keyboard events — the most app-
/// agnostic path (AppKit, Electron,
/// web views, terminals alike).
enum TextInjector {
  /// Tags our synthetic events so
  /// the key tap ignores them.
  static let magicTag: Int64 =
    0x5052_5459 // "PRTY"

  static func insert(_ t: String) {
    for c in utf16Chunks(t.utf16) {
      post(chunk: c, keyDown: true)
      post(chunk: c, keyDown: false)
    }
  }
}
图 1 — 与仓库逐字一致。你的按键和幽灵文字之间只有 716 行代码。 免费 · MIT · 无需账号 github.com/nikiomori/Pretype

你和句子的结尾之间只隔一个键。

macOS · Apple Silicon约 1.6–2.2 GB 模型,仅下载一次免费 · MIT · 无需账号