面向代理工作空间和Mac用户的必备工具
摘要
Clickit 是一款适用于 macOS 的开源剪贴板历史管理工具,驻留在菜单栏中,可记录文本、链接、图片和屏幕截图,并具备搜索、置顶和实时队列等功能。
查看缓存全文
缓存时间: 2026/07/24 17:05
rohankc69/clickit 源码:https://github.com/rohankc69/clickit
Clickit——macOS 菜单栏的剪贴板历史记录
保持你一贯的复制粘贴方式——Clickit 在后台记录你复制的内容,只需一次按键即可找回最近历史记录中的任何内容:文本、链接、图片、截图。所有数据不会离开你的 Mac。
当前状态
早期版本,尚未签名。核心流程已能正常运行——复制、搜索、恢复、粘贴——历史记录在退出后仍保留,全局快捷键和登录启动功能也已实现。尚未完成的部分:签名、公证、Homebrew 支持,因此首次启动需要额外操作(见安装)。请勿依赖 Clickit 作为任何内容的唯一备份。
| 已实现 | 尚未实现 |
|---|---|
| 菜单栏弹出窗口:搜索、固定、删除 | 签名及公证后的发布版本 |
| 文本、链接、图片和截图捕获 | Homebrew |
| Command-Shift-V 打开;Option-Shift-V 打开实时队列 | 可自定义快捷键 |
| 登录时启动 | 可靠的按应用排除 |
| 重复检测、保留、清理 | |
| 退出后保留历史记录,重启时清除 |
功能说明
- 常驻菜单栏——无 Dock 图标,无需管理窗口。
- Command-Shift-V 在当前活跃显示器上打开一个紧凑的选择器。功能单一,无长按行为。
- Option-Shift-S 启动原生区域选择工具,并将截图复制到剪贴板。监控开启时,Clickit 会记录该操作。
- 按 Option-Shift-V 启动实时队列,再次按下则停止并清空队列(不打开 Clickit)。
- 实时队列开启后,每次 Command-C 或 Option-Shift-S 捕获都会自动加入队列,包括重复复制。主显示器右上角会显示一个紧凑的 HUD,展示接下来五项,其余项目则堆叠显示。常规 Command-V 粘贴队列中的下一项;队列在最后一项使用后自动关闭。
- 通过队列按钮或 Option-Return 将历史项加入队列,会立即启动实时队列。Option-Shift-V 停止并丢弃所有剩余队列项。
- 记录文本、链接、图片和截图,并按类型自动分类。
- 输入即搜索。可固定想要保留的内容,删除其余内容。
- 复制相同内容两次,原有条目会移至顶部,而非创建重复项。
- 历史记录存储在本地 SQLite 数据库中,退出或崩溃后仍保留,重启时清除。固定项始终保留。
安装
从 Releases(https://github.com/rohankc69/clickit/releases/latest)下载最新的 .dmg 文件,打开后,将 Clickit 拖入“应用程序”文件夹。由于构建版本尚未签名或公证,macOS 在首次启动时会阻止运行——通常会提示“已损坏,无法打开”。实际上文件并未损坏,只是未签名。将应用复制到“应用程序”文件夹后,请清除隔离标志一次:
xattr -d com.apple.quarantine /Applications/Clickit.app
仅对你信任的构建版本执行此操作。移除隔离标志会禁用一项真实的安全检查,因此不应随意提供给用户——签名和公证(可省去此步骤)已在计划之中。更倾向于自行构建?请参阅下方的开发环境设置,或使用 ./scripts/build-dmg.sh(输出在 dist/ 目录)打包你自己的磁盘映像。
系统要求
- macOS 14.0 (Sonoma) 或更高版本
- Xcode 16 或更高版本(从源码构建时需要)
- 无第三方依赖
开发环境设置
git clone https://github.com/rohankc69/clickit.git
cd clickit
open Clickit.xcodeproj
按 Command-R,或从命令行:
# 构建
xcodebuild build -project Clickit.xcodeproj -scheme Clickit -destination 'platform=macOS'
# 测试
xcodebuild test -project Clickit.xcodeproj -scheme Clickit -destination 'platform=macOS'
应用启动后无 Dock 图标(LSUIElement)——请在菜单栏中查找剪贴板图标。Clickit 未沙盒化,因为它会写入 ~/Library/Application Support/Clickit/。日志仅包含元数据,从不包含剪贴板内容:
log stream --info --predicate 'subsystem == "com.clickit.Clickit"'
剪贴板监控原理
macOS 不会在粘贴板发生变化时发送通知,因此轮询是唯一的选择。ClipboardMonitor 每 0.5 秒采样一次 NSPasteboard.general.changeCount(一个整数),只有当该数值变化时才读取实际内容。轮询开销极小,在活动监视器中几乎不可见。
当检测到变化时,Clickit 会:
- 如果写入应用将其标记为隐藏、临时或自动生成,则跳过。
- 读取并分类为文本、URL 或图片。
- 如果内容为空、不受支持或来自排除的应用,则跳过。
- 如果变化是由 Clickit 自身写入引起的(恢复项目时不应被视为新复制),则跳过。
- 使用 SHA-256 计算哈希值以检测重复。
- 将已有重复项移至顶部,或记录新条目。
- 执行清理。
粘贴
在任何应用中按 Command-Shift-V,当前活跃显示器的右下角会打开一个紧凑的选择器。选择一项即可粘贴到当前位置。此快捷键不会切换实时队列。
对于重复输入,请按 Option-Shift-V 并正常复制,或通过队列按钮或 Option-Return 将现有历史行加入队列。将第一个历史项加入队列会启动实时队列,因此 Command-V 可以立即粘贴,无需额外启用步骤。
只读队列 HUD 显示在主显示器上,不占用焦点,最多显示五个带编号的条目并附图片预览,超出部分则堆叠显示。实时队列激活时,每次常规 Command-V 会准备好下一项,然后原封不动地传递你的原始粘贴按键。最后一项会自动关闭实时队列。实时队列激活时按 Option-Shift-V 会停止会话并丢弃所有剩余项;清除按钮功能相同。队列中的项目引用仅保存在内存中,Clickit 退出时清除。
选择器的定位和自动粘贴需要 macOS 辅助功能权限。实时队列使用该授权以及输入监控权限,因为它必须在你的物理 Command-V 到达当前应用之前准备好下一个队列负载。监控仅在实时队列激活期间存在,从未抑制或替换 Command-V。
光标定位依赖于应用是否报告光标位置。原生文本字段可以;某些 Web 视图和跨平台应用不行,此时 Clickit 会使用焦点控件或窗口。如果没有辅助功能访问权限,则在接收键盘输入的显示器上打开,仅当 macOS 无法识别该显示器时回退到指针位置。
本地存储
所有数据均存储在你的 Mac 上:
~/Library/Application Support/Clickit/
├── clickit.sqlite # 历史记录:文本、链接和元数据
└── Images/ # 复制图片和截图的 PNG 文件
文本和元数据存储在本地 SQLite 数据库中。图片字节作为单独文件保存,条目中仅保留文件名,列表渲染使用小的缓存缩略图——因此浏览历史记录时不会将全尺寸截图加载到内存中。
数据库在启动时一次性读取,并作为写透缓存保留:搜索保持即时,同时每次更改立即提交到磁盘。如果 Application Support 不可用,Clickit 会记录失败,将历史记录保留在内存中,并使用临时的本地目录存储图片,而不会拒绝启动。
历史记录保留时间
两种机制,按通常触发顺序排列。
重启 Mac 会清除未固定的历史记录。 这是主要的生命周期,默认开启。剪贴板历史记录是当前会话的工作集;保留数周的内容不仅很少有人重复使用,而且风险也大于收益。退出并重新启动 Clickit 不会清除任何内容——只有真正的重启(通过系统启动时间检测)才会清除。
保留限制是后备措施,适用于长时间不重启的机器:
| 设置项 | 默认值 |
|---|---|
| 最大条目数 | 1,000 |
| 最大存储空间 | 500 MB |
| 文本和链接保留时间 | 30 天 |
| 图片和截图保留时间 | 7 天 |
| 固定项 | 永不过期 |
所有设置均可在“设置”中配置,包括关闭重启行为。清理操作会在启动时、每次捕获后以及保留设置更改时运行:首先移除过期的未固定项,然后移除超出数量限制的最旧未固定项,最后移除超出大小限制的最旧未固定图片。移除图片记录时始终删除对应的文件。
隐私
剪贴板历史记录本质上很敏感——它会收集密码、令牌、私人消息和截图,而你无需刻意操作。Clickit 的立场是这些数据绝不会离开你的机器。
- 完全没有网络请求。
- 无账户、无云、无跨设备同步。
- 无遥测、分析或崩溃报告。
- 无 AI 或内容分析。Clickit 仅判断内容是文本、链接还是图片——不会读取、分类或 OCR。
- 日志仅包含元数据(类型和字节大小),绝不包含内容。
- “暂停监控”和“清除历史记录”始终一键可达。
- 密码管理器可以选择退出:Clickit 尊重 nspasteboard.org(http://nspasteboard.org)的约定,因此任何标记为隐藏、临时或自动生成的内容都不会被读取或记录。这依赖于源应用设置标记。
- 按应用排除仅部分实现。 你可以在“设置”中添加包标识符,来自这些应用的复制内容会被丢弃,但归属判断依据的是复制时刻的前台应用——这是一种尽力而为的猜测,并非证明哪个进程写入了粘贴板。暂时不要将其视为安全边界。完整声明见 PRIVACY.md。
将截图加入历史记录
在 Clickit 运行时,按 Option-Shift-S。原生 macOS 十字准线出现;拖拽选择一个区域,释放后将截图复制到剪贴板。监控开启时,Clickit 会像处理其他复制图片一样记录它。按 Escape 取消。
这是 Clickit 的全局快捷键。macOS 可能在首次使用时请求屏幕录制权限。系统自带的默认截图快捷键也有效:
| 默认快捷键 | 结果 |
|---|---|
Command-Shift-3 / Command-Shift-4 | 保存为文件。Clickit 不会捕获。 |
Command-Control-Shift-3 / Command-Control-Shift-4 | 复制到剪贴板。Clickit 会记录。 |
你的 macOS 快捷键如果在 系统设置 → 键盘 → 键盘快捷键 → 截屏 中被更改过,则可能不同。任何将图片复制而非保存的绑定都适用于 Clickit。如果上述默认快捷键无效,请检查系统设置中“将所选区域图片拷贝到剪贴板”的当前绑定。
键盘快捷键
以下快捷键在 Clickit 运行时全局生效:
| 按键 | 操作 |
|---|---|
| Option-Shift-S | 选择区域并将截图复制到剪贴板 |
| Option-Shift-V | 启动实时队列;若已激活则停止并清空 |
| Command-Shift-V | 在当前活跃显示器上打开剪贴板选择器 |
| Command-V | 实时队列激活时粘贴下一项;否则正常粘贴 |
在弹出窗口内:
| 按键 | 操作 |
|---|---|
| 上 / 下 | 浏览历史记录 |
| Return | 恢复选中项并关闭 |
| Option-Return | 添加或移除选中项;添加会启动实时队列 |
| Command-1 至 9 | 按位置恢复 |
| Escape | 清除搜索;若搜索为空则关闭 |
| Command-F | 聚焦搜索栏 |
| Command-P | 固定或取消固定选中项 |
| Delete | 删除选中项(搜索栏为空时) |
| Command-Delete | 始终删除选中项 |
| Command-K | 清除历史记录(保留固定项) |
| Command-M | 暂停或恢复监控 |
| Command-Comma | 打开设置 |
| Command-Q | 退出 Clickit |
选择器选中后,如果辅助功能权限可用,则自动粘贴;否则仅复制,由你自行按 Command-V 粘贴。全局快捷键目前不可重新分配;设置中以只读方式显示。
路线图
菜单栏应用、剪贴板监控、恢复功能、弹出窗口、本地持久化、全局快捷键和登录启动均已实现。尚待完成:更可靠的按应用排除、更丰富的图片处理,以及带有 Homebrew cask 的签名及公证发布版本。详情见 ROADMAP.md。
贡献
欢迎贡献。请在做出结构性更改前阅读 CONTRIBUTING.md 了解工作流程、编码标准和测试预期,以及 ARCHITECTURE.md 了解各部分如何组合。所有参与者均需遵守 行为准则。
安全
请不要针对安全问题公开提交 issue——详见 SECURITY.md 了解如何私下报告。
许可
相似文章
Cliptop
Cliptop 是一款 Mac 应用,可在刘海下方直接提供剪贴板历史访问。
OptionV
OptionV 是一款 macOS 菜单栏剪贴板管理工具,旨在帮助用户高效管理和访问剪贴板历史记录。
LocalClicky
LocalClicky 是一款让你用语音控制 Mac 的工具,所有处理都在本地设备上完成。
Supaste
Supaste 是一款 macOS 的剪贴板管理工具,允许用户管理和粘贴剪贴板历史记录。
Cubby Clipboard
Cubby Clipboard 是一款 Windows 剪贴板历史工具,支持通过 OCR 在截图中搜索文字。