article_image

人脑不善于机械的对比,也只有在找茬游戏中,这种大量消耗脑力而仍然漏洞百出的工作才会有一点点的吸引力。

不少文档编辑器也意识到这一点,并提供了文档比较功能——著名的 Microsoft Word 当然不会落下。可不幸,或许是 Word 的产品经理日理万机,实在顾不着那么细碎的小功能,竟把它塞在菜单栏的冷宫深处,还调用了 macOS 恶名传千里的文件选择窗口,为了简单对比两份文件,恐怕找一台 27 寸外接显示器都塞不下一连串的窗口和弹窗。

Alt text
比对两个文件,需要打开那么多窗口

相比之下,BBEdit 等硬核的文本编辑器就往系统右键上下文菜单中塞了对比功能,选好文件后只需点一次,非常轻松。可惜我从事法律工作,常常需要对比新发布的法律规定或者修改前后的合同,而客户发来的几乎都是 Word 文档1,BBEdit 并不对口,遂苦对比功能久矣。

Alt text
BBEdit 可以直接对比两个文件,没有冗长步骤

所幸有过之前折腾段落样式文字格式的经验,我再次挖掘了早期 Word 留下的 AppleScript 遗产,并制作了自动化动作,以在 Finder 中选定文件、一键对比,跳过上述所有恼人步骤。

Alt text
一键对比两个 Word 文档
注意:由于你永远不可能知道别人给你发来有什么奇怪数据的文件,因此难免有一些文件无法直接对比,将导致“active document doesn’t understand”错误。此系 macOS 长久以来存在的问题,唯一的建议是尝试另存为新文件或导出文本并创建新文档后重新尝试。

动作使用

以 LaunchBar 版为例2。首先选中修改前的文档,再选中修改后的文档,接着运行动作“Microsoft Word Compare”,动作会调用 AppleScript、启动 Word,将先后选定的文件分别作为对比前后的样本,呈现一个修订记录对比版文档,同时关掉用于比对的原始文件,以免留下过多窗口。3Word 默认会沿用之前的窗口布局,我个人习惯宽度占据笔记本电脑屏幕 2/3 的尺寸,这样刚好可以容纳正文和右侧的修订记录,不需要再重新调整窗口。4

Alt text
一键对比两个 Word 文档

选中文件时的顺序就是对比顺序,因此前文会强调先选中修改前的文件。不过,实际操作时仍有种种意外,例如只选中了一个文件,或者选中的文件超过两个,这些情况都不满足两相比较的前提,因此我设计了一个简单的提示,同时中止运行动作。

Alt text
文件数量错误时,会有相应提示

另需注意,除非你从一开始就允许 Microsoft Word 读取全盘数据,否则每次操作新文件时可能都要授权一次,盖自动化操作系敏感操作,无论使用何种自动化工具,macOS 均不会睁一只眼闭一只眼。

Alt text
运行中可能需要授予访问权限

原理简析

为追求通用,各版动作均用 AppleScript 写成,尽管使用各款自动化工具专用模块的话,完全可以减少很多代码编写量。好在完整代码也不多,列入下:

on open (thePaths)
    if (count of thePaths) = 2 then
        tell application "Microsoft Word"
            activate
            open first item of thePaths
            set identifierPath to posix full name of active document
            compare active document path (second item of thePaths as text) author name "M"
            close document identifierPath
        end tell
    else
        display notification "请选择两个文件以供比较" with title "Microsoft Word Compare" sound name "Frog"
    end if
end open

介绍 AppleScript 代码有天然优势,即 AppleScript 与英文相仿,基本能够读懂英文,就能读懂 AppleScript——虽然读懂不意味着可以随意书写,毕竟语法还是比较严苛的。以上代码,可以不改变结构而直接译成中文,其功能也一目了然。当然,以下是意译:

对选中的文件执行以下操作
    如果刚好选中了2个文件
        召唤 Microsoft Word
            快点冒出来
            打开第一个文件
            瞄准刚刚打开的文件
            比对刚刚打开的文件和另一个文件
            关掉刚刚瞄准的文件
        Microsoft Word 辛苦了,请退下
    如果选中的文件不止2个
        发出错误提示“请选择两个文件以供比较”
    结束 if 判断
结束所有操作

除去和 Microsoft Word 交互的部分,其余代码主要用于判断究竟选中了几个文件,以免 Microsoft Word 扑空或目标过多、不知如何下手。这些判断工作也可以转移到 Shortcuts 或 Keyboard Maestro 中,用现成图形化模块判断文件数量——就前述两款工具而言,我当然推荐避免自己造轮子,不过站在工具移植的角度,还是尽可能使用通用元素为好。

说到底,我最常用的 LaunchBar 就全靠代码,这好比在最恶劣——这里要对 LaunchBar 开发者说声抱歉——的环境中培育出的植物,也更容易移植到较为舒适的环境,而反过来则不然。制作自动化工具,也常有这种近似培育植物的乐趣。


  1. 这已经谢天谢地,起码不是 PDF,更不是一张没对准焦的照片。
  2. 我最常用的自动化工具之一是 LaunchBar,其与另一款自动化工具 Keyboard Maestro 的分工大概是:使用频率最高、值得绑定快捷键的,用 Keyboard Maestro; 次之,则归入 LaunchBar。
  3. 除了占据空间,原始文件的窗口如果忘记关闭,很可能会出现“对象错误”,不小心就把原始文件修改了。
  4. 你也可以每次强制调整窗口布局,这方面的讨论,拙作《Keyboard Maestro 进阶指引》有深入讨论

author_avatar

Lawyer, macOS/iOS Automation Amateur