article_image

“打开方式不对”,已经从一句系统提示语升级为网络meme(迷因),用于调侃各种不恰当的处理方式。

而“打开方式不对”这个问题本身,其实还未被解决:同一种格式(拓展名)的文件在不同情景下可能需要更换打开方式,例如,同样是 Markdown 文件,一般用编辑器开启,但部分 Markdown 文件系参考文档,则更适合用 Marked 2 等预览工具开启——可惜,macOS 仅提供单个文件和所有文件两种选择范围,忽视了情景之切换。

Alt text
同样是 Markdown 文件,视场景不同,也需要对应的打开方式

虽说即便打开方式错了,也不过是关掉软件、重新开一次的功夫,但这种摩擦日积月累,在潜移默化中仍然会干扰工作。对于喜用纯文本的我而言,任务管理、笔记、文稿、参考文档咸用 Markdown 格式存储,每次都要手动选择打开方式,不满就在这个萨拉热窝爆发了。

如果你乐意,当然也可以逐个打开目标文件,在其属性窗口中修改打开方式,但此方法显然太繁琐。调整文件打开方式,料想应有几个自动化层级,而本系列文章,也循此线路:

  1. 脚本化阶段:通过脚本修改文件的默认打开方式,绕开限制过多的图形界面;
  2. 批量化理阶段:批量调整文件打开方式,同时不对其他文件产生任何影响;
  3. 文件自动化阶段:自动为目标文件夹内的文件设置打开方式,以求工作流程较为稳定后,可以免去部分人工操作。

以上三个阶段,恰好对对应了常见操作自动化的生命周期,也涉及到 AppleScript、Shortcuts、Automator、LaunchBar 和 Keyboard Maestro 等常见自动化工具,遂以掌控 macOS 文件默认打开方式为线,引出相关自动化探索的整套故事。

找到调整 macOS 文件打开方式的脚本

我在 UNTAG 的会员栏目中曾短暂提及,自动化主要有两个方向,要么依托真正的脚本(Script)、直接下命令,要么假借 GUI Scripting 模拟键鼠操作。之所以难以绕开脚本,盖多数自动化工具都支持运行脚本,且各个品种的脚本之间往往可以相互调用,打通一个,就总有办法移植到自己惯用的工具中。

而谈及修改文件默认打开方式时,各路玩家几乎穷尽了各种方法,有人模拟点击画面,有人取道系统配置文件,甚至有人挖出文件背后那长长的一串 Hash 值1……只可惜,恐怕放出前述任何一个方案的代码(比如下图那样的),大概都会吓跑绝大多数读者,让人叹息:我还是乖乖手动点击吧!

Alt text
通过挖掘和修改 Hash 值来控制打开方式,非常复杂

我并未涉入上述方案过多,但已感到阻力重重。万幸,有过两本文件管理(信息管理)杂文集子的写作经验,我已经养成了凡事求诸元数据的习惯,我基本确定,打开方式是文件的元数据(属性)之一,既然如此,则应当可以从相对简明的 AppleScript 入手,而无需过问晦涩的数据或语法。

Alt text
修改前后的默认打开方式

读懂 AppleScript 词典

开始前,需注意,最近几代的 macOS 权限控制严格,即便您使用系统自带的自动化工具,凡举涉及控制其他软件,基本都要先在系统隐私设置的“App Management”栏中为其开启自动化权限。

Alt text
为 System Events 开启权限

设置妥当后,可转入传统的自动化讨论。思考方式在于,文件本身有些抽象,但如果考虑日常处理文件的环境——Finder 或 System Events(系统事件),则有迹可循。相对于折腾配置文件或直捣 Hash 值,AppleScript 更贴近人类的思维方式,其语法也近乎于英语,基本上就是告诉某个软件或其他进程你想做什么——只要这些命令存在于它们的 AppleScript 词典中。实际尝试后,我发现 System Events 的词典条目下包含了文件2的“default application”这一属性,从词典释义上看,这应当就是许多玩家遍寻不得的打开方式

Alt text
词典中有关于打开方式的词条

不妨验证一下。任意取一个文件,效仿上述词条的语法写一段获取文件 default application 属性的 AppleScript 代码,我发现内容与 Finder 文件信息中所显示的一致。这是一个好兆头。

tell application "System Events" to get default application of alias "目标文件的路径"
Alt text
用 AppleScript 查看文件的打开方式

随后,我尝试在图形界面下修改了测试文件的打开方式,前述代码返回的属性值也随之改变;反过来,当我用 AppleScript 设置文件的 default application 属性时,Finder 图形界面中所示的内容也萧规曹随。

tell application "System Events" to set default application of alias "目标文件的路径" to alias "用以打开文件的软件的路径"

这些经验已经足够让我相信,AppleScript 足以修改任意文件的打开方式。

小结

本文从 AppleScript 入手,介绍如何调用 AppleScript 脚本修改文件的默认打开方式,从而避开低效的图形界面。这一小步可能效果不明显,但接下来关于批量修改和全自动操作的文章,将推倒文件操作中诸多藩篱,让人闭着眼睛或双击或回车打开文件,总能跳到合适的软件,仿佛和电脑心意相通。

诚然,要想到 AppleScript,得先意识到最终要修改的是文件元数据(属性);而要修改文件属性,则要先想到 AppleScript 是最合适——有时是唯一——的方法。在思绪尚处混沌状态时,想到 AppleScript 和想到修改文件属性,简直就是先有鸡还是先有蛋的问题。自动化玩家总是处于这种尴尬的境地中,但真正的乐趣,也恰恰来自解决这些“知道就是知道,不知道想破脑袋也不知道”的问题。


  1. 这种做法最大的问题还不是复杂,而在于如果你事先没有给某个文件设置过相应的 Hash 值,那么就挖掘不出任何数据。
  2. 严格来说是 Alias,但此处不深究,就像在日常生活中,你不必纠结你的名字和你的本体之间的哲学关系。

author_avatar

Lawyer, macOS/iOS Automation Amateur