人脑不善于机械的对比,也只有在找茬游戏中,这种大量消耗脑力而仍然漏洞百出的工作才会有一点点的吸引力。
不少文档编辑器也意识到这一点,并提供了文档比较功能——著名的 Microsoft Word 当然不会落下。可不幸,或许是 Word 的产品经理日理万机,实在顾不着那么细碎的小功能,竟把它塞在菜单栏的冷宫深处,还调用了 macOS 恶名传千里的文件选择窗口,为了简单对比两份文件,恐怕找一台 27 寸外接显示器都塞不下一连串的窗口和弹窗。
![Alt text](https://cdn.utgd.net/assets/uploads/2022/00/minja-0508102947.png)
相比之下,BBEdit 等硬核的文本编辑器就往系统右键上下文菜单中塞了对比功能,选好文件后只需点一次,非常轻松。可惜我从事法律工作,常常需要对比新发布的法律规定或者修改前后的合同,而客户发来的几乎都是 Word 文档1,BBEdit 并不对口,遂苦对比功能久矣。
![Alt text](https://cdn.utgd.net/assets/uploads/2022/00/minja-0508102955.png)
所幸有过之前折腾段落样式和文字格式的经验,我再次挖掘了早期 Word 留下的 AppleScript 遗产,并制作了自动化动作,以在 Finder 中选定文件、一键对比,跳过上述所有恼人步骤。
![Alt text](https://cdn.utgd.net/assets/uploads/2022/00/minja-0508103001.gif)
动作使用
以 LaunchBar 版为例2。首先选中修改前的文档,再选中修改后的文档,接着运行动作“Microsoft Word Compare”,动作会调用 AppleScript、启动 Word,将先后选定的文件分别作为对比前后的样本,呈现一个修订记录对比版文档,同时关掉用于比对的原始文件,以免留下过多窗口。3Word 默认会沿用之前的窗口布局,我个人习惯宽度占据笔记本电脑屏幕 2/3 的尺寸,这样刚好可以容纳正文和右侧的修订记录,不需要再重新调整窗口。4
![Alt text](https://cdn.utgd.net/assets/uploads/2022/00/minja-0508103001.gif)
选中文件时的顺序就是对比顺序,因此前文会强调先选中修改前的文件。不过,实际操作时仍有种种意外,例如只选中了一个文件,或者选中的文件超过两个,这些情况都不满足两相比较的前提,因此我设计了一个简单的提示,同时中止运行动作。
![Alt text](https://cdn.utgd.net/assets/uploads/2022/00/minja-0508103013.png)
另需注意,除非你从一开始就允许 Microsoft Word 读取全盘数据,否则每次操作新文件时可能都要授权一次,盖自动化操作系敏感操作,无论使用何种自动化工具,macOS 均不会睁一只眼闭一只眼。
![Alt text](https://cdn.utgd.net/assets/uploads/2022/00/minja-0508103007.png)
原理简析
为追求通用,各版动作均用 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 开发者说声抱歉——的环境中培育出的植物,也更容易移植到较为舒适的环境,而反过来则不然。制作自动化工具,也常有这种近似培育植物的乐趣。