ClipboardOnly

把 macOS 截图直接送进剪贴板的菜单栏小工具
macOS · Swift / AppKit 8 源文件 com.akb4q.clipboard-only v1.2.8

项目简介

ClipboardOnly 是一个常驻菜单栏的 macOS 应用。它通过把系统的截图保存目录 重定向到一个私有拦截目录(~/.clipboard_only/intercept),监听该目录的文件事件, 在截图落盘的瞬间把图片读入内存并写进剪贴板——从而让 ⌘⇧4 / ⌘⇧3 截图后无需打开任何文件即可直接 ⌘V 粘贴。

在此基础上叠加了三层增值能力:OCR 文字识别(Vision 框架)、 隐私脱敏(识别并遮挡 API Key / 邮箱 / 手机号 / 身份证 / 信用卡 / IP / 密码)、 以及面向多模态大模型的 图片瘦身(长边压到 1568px,经济模式压到 512px)。

核心功能

截图直入剪贴板

拦截 screencapture 输出,截图完成即可直接粘贴,不留桌面文件。

自动 / 手动 OCR

基于 Vision 的中英文识别,识别结果可一键复制;浮动面板提供手动触发。

隐私脱敏

七类敏感信息检测,可逐项开关,对 OCR 文本和图片像素双重遮挡。

LLM 经济模式

把图片长边压到模型实际使用的尺寸,最高省约 89% 视觉 token。

粘贴为路径

可选把剪贴板图片落到磁盘缓存,终端里 ⌘V 得到绝对路径。

Obsidian 集成

一键把当前剪贴板内容发送到指定的 Obsidian vault。

源码结构

文件符号数职责
ClipboardOnlyApp.swift9应用入口,NSApplicationDelegate 生命周期
MenuBarController.swift111核心控制器:菜单栏、拦截、剪贴板、OCR、流程编排
ScreenshotWatcher.swift7FSEvents 监听拦截目录,文件稳定后回调
PrivacyFilter.swift14PrivacyFilterType 枚举 + 文本敏感信息脱敏
ImagePrivacyMasker.swift15在图片像素层面遮挡敏感区域
ClipboardImageCache.swift5「粘贴为路径」模式的磁盘缓存读写/清理
AppMenuView.swift4SwiftUI 菜单视图组件
L10n.swift21本地化字符串(含 21 个键,简中 / 英)

关键流程:一次截图的生命周期

  1. 初始化MenuBarController 读取并备份 com.apple.screencapture 的原始 location/target,把保存目录改写到拦截目录。
  2. 监听ScreenshotWatcher 通过 FSEvents 监听拦截目录,文件写入稳定后调用 handleNewFile
  3. 读图loadedScreenshotImage 把 PNG 解码为 CGImage;图片解码完成即调用 showManualOCRPanel 弹出浮动缩略图(早于完整管线,降低感知延迟)。
  4. 脱敏 — 若开启隐私过滤,ImagePrivacyMasker 在全分辨率图上遮挡敏感区域,保证 OCR 精度不受压缩影响。
  5. 瘦身 + 写入writeImageToClipboardllmMaxLongEdge(1568 / 经济模式 512)缩放,编码 PNG 写入剪贴板,并提交真实 changeCount
  6. OCRperformOCR 用 Vision 异步识别中英文;自动模式直接出结果,手动模式由浮动面板按钮触发。
  7. 清理 — screencapture 在 macOS 26.4+ 会延迟约 55 秒把点前缀临时文件 rename 成正式名;pendingDotfileBaseNames FIFO 识别该 rename 事件并静默删除,避免重复跑管线。

隐私过滤类型

PrivacyFilterType 枚举(PrivacyFilter.swift:32)支持逐项开关:

技术要点

@MainActor 隔离

MenuBarController 全程主线程隔离,OCR / 图片编码下放到后台队列。

状态持久化

各开关写入 UserDefaults;启动时智能恢复被改写的 screencapture 偏好。

崩溃自愈

若检测到 location 仍指向拦截目录,说明上次未正常退出,回退到自存副本。

感知延迟优化

浮动面板与完整管线解耦,缩略图在解码后约 0.8s 即出现。