【195】33周 macOS 上的剪贴板「污染」及其对策

Minja
04月16日

macOS 上的剪贴板「污染」及其对策

| 本文为付费栏目文章,您已订阅,可阅读全文 |
在 Mac 上用效率工具时间久了,我们会遇到一些莫名其妙的情况,剪贴板污染——剪贴板内容莫名其妙丢失、被改动——这是一个很多人都遇到过、但是很难找出原因的问题。
举个例子:
不少用户同时在使用 TextExpander 和 1Password,一般我们输入密码的过程是这样的:
  1. 在 1Password 里复制密码;
  2. 用 TextExpander 输入用户名;
  3. 换行,⌘Command - V 粘贴密码。
此时你可能发现,刚刚复制的密码「不见了」,粘贴上的是邮箱地址,就像下面视频所演示的一样:
这就是一个典型的「剪贴板污染」。
如果你遇到了这种情况,可以尝试在 TextExpander 的「Preference - Expansion」里勾选「Restore clipboard」, 一般就能解决这个问题。但使用其他工具时,类似的问题可能又会出现。
这篇文章里,我将列出一些常见的会带来「污染」的效率工具,并提出一些应对的方法。

「污染」的原因

Mac 上有不少的效率工具——TextExpander、PopClip、Keyboard Maestro、Automator 等等——它们都会和文字打交道,但是 macOS 没有向第三方应用提供「Selected Text(选中的文本)」这个变量,导致这些应用想要获取选中文本时,实质上是把它们复制到了剪贴板
此外,虽然正常使用中剪贴板内容的来源主要是用户自己的「复制」动作,但是 macOS 都向所有应用开放了剪贴板,一句不需要任何权限的 pbcopy 命令就能往剪贴板写入内容:

不用权限就能写入内容
由此可见,一方面许多工具亟需使用文本来实现其正常功能,另一方面我们的剪贴板又处于「裸奔」的状况,最后这些工具往往选择了借用剪贴板,从而造成了剪贴板的「污染」。

解决方案

有的效率工具自带了相关设置,配置一下就能避免占用剪贴板;有的则不提供相关选项,要是这类工具带来的麻烦让你无法忍受,也可以根据下文的思路寻找一些替代品。

文本格式转换:TextExpander 的 Snippet

我在排版文章时常常需要转换文本格式。
TextExpander 本是做这件事的好手,但早期出于对其订阅制的疑虑,我参考 Dr.Drang 的 文章 在 Keyboard Maestro 里的「复刻」了一批文本替换的动作,不料很快遇到了问题:

Keyboard Maestro 会动用剪贴板
Keyboard Maestro 需要先把文本放进剪贴板,才能粘到输入框中,于是剪贴板里的内容就被它覆盖掉了。有几次我对于文本转换的结果不满,想找回原始的文本,却发现剪贴板里只剩刚刚转换好的文字。
TextExpander 的格式转换就比较聪明,虽说事实上它并没有摆脱对剪贴板的依赖,但是勾选「Restore clipboard」之后,TextExpander 就可以在用完剪贴板后「恢复」后者原有的数据,看起来就像没有动过剪贴板一样(但是这个选项并不是永远起作用,比如在文章开头提及的情况下仍然可能失效)。
下面是一个 TextExpander 的 Snippet 例子,能够为剪贴板中的中英文之间插入空格,令文章的排版更清晰好看——重要的是,它没有覆盖掉剪贴板里原有的内容。

TextExpander 的效果
这里多说一句,其实在 Keyboard Maestro 中你也能「用完再恢复剪贴板」,但是远不如 TextExpander 自带的选项方便。也正是因为意识到了 Keyboard Maestro 做文本格式转换时的问题太多,我最终选择了 TextExpander 来做相关工作。

获取特殊文本:利用 AppleScript 脚本

特殊的情形下,我们还可以通过 AppleScript 来获取文本,而不使用剪贴板。如:
  • 获取网页标题
  • 获取网页链接
  • 获取 Markdown 格式的网页链接
我在写这篇文章时,需要插入大量的链接,于是通过一段封装进 Keyboard Maestro 的 AppleScript 脚本和 Safari 浏览器交互,把链接摘取到文稿中:
由于 AppleScript 提供了网页的链接和标题的变量,我可以直接取用它们,而不一定要走剪贴板。另外,如果你没有一块允许自己分屏工作的超大屏幕,这种取用方式还可以免去来回切换应用的麻烦。这个技巧我们写在了Power+ 的另一篇文章《如何快速复制粘贴浏览器标签页的链接 | 实用技巧》之中。
动作下载:

用 LaunchBar 代替 Automator 来处理文件

不仅处理文本,处理文件时也会面临剪贴板的「污染」问题。暂不提第三方应用还得想方设法曲线救国,就能原生的 Automator 也没能避免「污染」问题。
去年我曾做过一个颇为得意的 Automator 动作,用以 双击解压 macOS 系统不支持的压缩文件。但在实际使用中,遇到带有密码的压缩包就会出现解压失败的情况。这是因为是 Automator 把压缩包路径写入了剪贴板、覆盖掉真正的密码,致使解压出错。

解压出错
闹出这个问题的步骤是「拷贝到剪贴板」,它常常出现在文件处理相关的 Automator 动作中,用于拷贝文件路径,许多 Power User 可能也没有意识到它对剪贴板的影响。其实,处理文件也可以使用 LaunchBar 的 Instant Send,把文件「发送」给 LaunchBar 的自动化动作去处理。
例如我想压缩一大批图片,就能批量选中它们,召唤出 LaunchBar ,输入 co 选中动作 compress,回车,实现压缩。

LaunchBar 处理文件
回头看看剪贴板,里面还是干干净净。
这个技巧我写在了《通吃常用格式,用 LaunchBar 快速无损压缩格式》这篇文章中。

小结

因为剪贴板过于方便、开放,许多依靠其他途径不能轻松实现的功能也常常求助于它,造成了一些不必要的「污染」。
了解了这些「污染」的原因——系统限制——后,我们就可以寻找一些对策:一方面,我们可以检查一下正在使用的效率工具,有的可能自带了减轻「污染」的设置(比如 TextExpander),有的没有提供好的解决方案,我们也可以考虑替代品(比如用 LaunchBar 替代 Automator);另一方面,我们在日常操作中就可以留意剪贴板的状况,用不着把什么内容都往里面塞,自制自动化动作时也想想是不是一定要动用剪贴板。
最后,由于 macOS 上用到剪贴板的工具非常多,可能我们把本文中提到的工具都检查一遍后,仍然遇到剪贴板内容丢失的情况,此时可以想想哪些应用和文字处理相关,然后对它进行排查,如果你发现了其他的「污染源」,也欢迎在评论中指出。

上一期
Power+ 重要通知
下一期
Best Of:iPad 上的手写笔记工具
 
精选评论(1) 我的评论
  • OscarGong
    用 Keyboard Maestro 代替 TextExpander 的话,最后加一个 Action 就行:

    [Restore Clipboard] to [System Clipboard] set to Past Clipboard [2]
    04月17日 2