Pretype — 你的 Mac 替你把话说完
在你打出来之前就已存在的文字。
你的代码编辑器替你补全整行。Pretype 把这件事带到你在 Mac 上写的一切。
深色的一半你来打 — 灰色的一半由你芯片上的模型来打。
最好的界面是看不见的——它就在你的光标处。
灰色文字是完整的想法,却不是完整的应用。下面这些都是同一个本地模型、同一个光标——用你手指本就搭着的键。
- Tab
改掉拼写错误
macOS 词典浮在那个词上方——用它在光标周围读到的语言。Esc 丢弃它,同一个词再也不会问第二次。
- Tab
把 emoji 拼出来
macOS 本就认得每一个 Unicode 名称,所以成千上万的简码都出现在同一个小气泡里,不必随包附带任何表。
- ⌥Tab
重写别扭的句子
语法和措辞就地修好,仍是你的语气——什么都没选时,修的是你刚敲下的那个词。永远先给你看,绝不背着你落笔。
- ⌥⇧Tab
写完整条回复
面对空的聊天框,它读屏幕上的对话,把你的下一条消息作为一整段灰色文字草拟出来。需自行开启,OCR 全在本机,只在这个组合键下发生。
- 自动
记住你的用词
你的名字、你的黑话、你一天敲十遍的那句话——来自一个由你自己的文字、在这台 Mac 上建起来的模型,比大模型开跑还早就答上来。可以清空,也可以关掉。
- 自动
知道什么时候闭嘴
终端和密码管理器里从不出现,macOS 报告安全输入时也从不出现。在你总是忽略它的应用里,它会停止提示——并在菜单里说明,附上一键恢复。
Tab 在这里有效。 在你 Mac 的每一个文本框里也一样 — 无需为每个应用装插件。
还是你的话。只是已经打好了。
安装
拖进「应用程序」。没有账号、没有向导 — 一个菜单栏图标、一次辅助功能授权、一次性下载的模型(约 2 GB)。
输入
像平常一样写。幽灵文字出现在光标处,匹配输入框自己的字体。猜错了?继续打就行。
Tab
Tab 接受一个词,⇧Tab 接受整句。下一次 Tab 将接受的部分颜色深一档。没有建议时,Tab 就只是 Tab。
补全、纠错与回复各有自己的评测 — 默认模型按你 Mac 的内存自动选择。你完全可以不用操心。
Tab 补完的那段灰色文字。十一个模型跑同一批留出句子,可按你真正在用的语言重新排名。
就地修好选中的文字。这个组合键跑的不是你选的模型,而是它的 instruct 同族模型——所以这里的六行都是同族模型,每一行都写明哪些选择会落到它身上。
根据屏幕上的对话起草整条消息。同样是纠错用的那六个同族模型——排名却几乎完全相反。
圆点大小 = 常驻内存(空心 = macOS 内置)· 覆盖率 = 给出建议的案例占比 · ± = 该语言与模型 17 语言平均值之差
首词准确率,沉默计为未命中;配对样本(OpenSubtitles · Tatoeba · Leipzig)· 单语言样本较薄(±5–10 pp)——请在同一语言内比较模型,勿跨语言比较数值 · 2026-07
须线 = 95% 置信区间 · 红色刻线 = 本来就正确的行被改写的频率(170 行干净对照)· 给出建议 = 提出了任何修改的行占比 · 圆点大小 = 常驻内存
每行一个真实错字,17 种语言,走的是实际发布的流程——最小改动闸门已计入这些数字。改对了但换了说法算作未命中,所以真实可用度高于这条线。单语言样本只有 30 行——请看须线,别看数字。E4B 8-bit 与 6-bit 档跑的是 6-bit 同族模型,本次未覆盖;4-bit 那一行是它的实测下限。Apple Intelligence 不在本次测量中 · 2026-07
须线 = 95% 置信区间 · 作答 = 起草了任何内容的比例 · 圆点大小 = 常驻内存 · ± = 该语言与模型 19 语言总体之差
草稿只要用对话的语言写成且没有复读屏幕内容即算可用——这是可用性的下限,不是质量评分;与参考答案的相似度噪声太大,未予采用。19 种语言、每种 30 段对话,单语言样本很宽——请看须线。Apple Intelligence 不在本次测量中 · 2026-07
每个设置都标注实测代价。
三个面板——展示、模型、个性化。悬停在任意控件上,Pretype 都会基于真实测量告诉你它改善什么、代价是什么。
行内幽灵文本或浮动面板、接受快捷键、可见度实时预览——还可按应用停用。
整个目录的实测地图:越上越准,越右越快,气泡大小代表内存。一键切换模型。
人设加上按应用的风格提示词决定语气与措辞。一切都留在你的 Mac 上。
你的文字属于你。
隐私不该靠信任 — 整条输入链路只有三个文件。信任之前,先读一读。
/// 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
} /// 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,
...)
}
} /// 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)
}
}
}