使用 Mac 不可避免的要与各种文件打交道,但即使对于同样的文件格式,我们有时也希望使用不同的 App 来打开,举个例子:日常我的主力编辑器是 Sublime,.md、.txt、.conf、.js等纯文本文件的默认打开方式都是 Sublime,但是有时我希望使用 Typora 编辑某个 Markdown 文件,使用 VSCode 编辑某个 JavaScript 文件;同样的,.png、.jpg等大部分图像文件都是默认使用 Preview 打开,但是有时我需要使用Pixelmator编辑、用Squash压缩。
在这种需求下,无论是「右键 → 打开方式 → 选择需要的 App」,亦或是使用 LaunchBar 的 Instant Send 功能,皆不胜其烦。
可以制作一个 Keyboard Maestro Macro 并指定快捷键(比如我用的是Hyper-O,即Control-Option-Shift-Command-O)来简化流程:选中.md文件,按下Command-O(默认打开方式)使用 Sublime 打开,按下Hyper-O使用 Typora 打开;选中.js文件,按下Command-O使用 Sublime 打开,按下Hyper-O使用 VSCode 打开。
你可以点击这里下载已经完成的 Macro。
Macro 制作 一些概念
这个 Macro 能够得以简单实现倚赖于 Keyboard Maestro 内建的Get File Attribute这个动作,通过这个动作可以很轻松的得到某个文件的大小、名字、修改日期和扩展名等属性,并存到变量中,减轻了我们的工作量。
Collection(集合)是 Keyboard Maestro 中的一个概念,用于For Each这个 Action,集合可以是剪贴板历史、Dictionaries字典、变量等,这里把 Finder 中的选择项(Finder Selection)作为集合。在 Macro 执行时,For Each 动作会循环遍历集合中的每个项目(这里是每个选中 Finder 文件),并执行 For Each 中包裹的动作。
流程
新建一个 Macro,命名为「Open File in Another Way」,指定快捷键,添加 For Each 动作:
For Each
每个 Finder Selection collections 中的文件会保存到OFAW_File这个临时变量中,随后 Get File Attribute 动作会获取当前OFAW_File的拓展名,保存到OFAW_Ext变量中。
接下来Switch动作会根据不同的 OFAW_Ext 值,即不同的文件类型,进行不同的操作。Switch 的判断条件使用的是 matches 类型,会进行正则表达式匹配。这里的(?!)为搜索修饰符(Search Modifiers),用于忽视大小写。
对于图中的动作,在 Finder 中选中图片文件,执行 Macro 后,会使用 Pixelmator 打开;选中 md 文件时,会使用 Typora 打开。因为 Swich 动作包含在 For Each 中,所以即使同时选择了多个文件也没问题。
最后添加 Otherwise,当未指定其他打开方式时,使用默认方法打开。
Otherwise
清理变量
为了避免以后可能遇到奇奇怪怪的问题,流程结束后记得清理变量,即将变量值设为%delete%。
Bonus
现在这个 Macro 已经能跑起来了,但是没完,可以做的还有很多。
为一种文件制定多种打开方式:
我们使用图像处理应用有很多,一个 Pixelmator 怎么够?
添加一个Prompt With List动作(需要版本 8 及以上),将用的到的图像处理 app 的绝对路径分行填入,保存到OFAW_HandleMethod变量中,随后执行 Shell 脚本open -a "$KMVAR_OFAW_HandleMethod" "$KMVAR_OFAW_File",如图:
open 命令是一个 NeXTSTEP 时期出现的命令行工具,也是现在 Mac 独有的命令行工具,与其他命令行工具不同,他和图形界面结合很紧密:
shellopen https://sspai.com/# 使用默认浏览器打开少数派open somearticle.md# 默认编辑器打开 markdown 文件open .# 在 Finder 中打开当前工作目录open dash://man:open# Dash 的 URL Scheme,在 Dash 中查看 open 的 manual
如果添加-a旗帜,可以为文件指定打开的 App:
open -a /Applications/TextEdit.app ~/demo.txt# 使用 TextEdit 打开 demo.txt
因为 Keyboard Maestro 的运行 Shell 脚本动作中对字符串的处理方式原因,有空格时,不是直接传入一行字符串,而是一个字符串数组,所以一定要将变量用双引号括起来。如一个 Shell 脚本:open -a "$KMVAR_OFAW_HandleMethod" "$KMVAR_OFAW_File"会分为:
open-a$KMVAR_OFAW_HandleMethod 的变量值$KMVAR_OFAW_File 的变量值
分别传入,应用路径和文件路径中经常会有空格,所以要用双引号括起来。这里解释的很详细。
完成后对于图片文件,按下快捷键后就有了多个选择。
打开包文件
同样的思路,.app、.lbaction等 bundle 文件(既右键中有「显示包内容」选项的文件),我对他们的处理方式为运行一段 Apple Script:
tell application "Finder" try set selectedItems to selection set selectedItem to item 1 of selectedItems as alias open folder ((selectedItem as string) & "Contents:") on error display dialog "You must select a package before running this script."
领取专属 10元无门槛券
私享最新 技术干货