【141】24周 为文件设置多种快速打开方式 | 实用技巧

OscarGong
02月06日

为文件设置多种快速打开方式 | 实用技巧

| 本文为付费栏目文章,您已订阅,可阅读全文 |

背景

使用 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 独有的命令行工具,与其他命令行工具不同,他和图形界面结合很紧密:
shell
open 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."
    end try
end tell
运行结果为在新的 Finder 窗口中显示包内容。

指定其他语言打开文件

我的 macOS 系统语言为英文,但是有的软件,如 Word,还是更熟悉其中文属性,所以对于 .docx.doc 文件,我选择运行一段 Shell 脚本,结果为使用中文的 Word 打开:
"/Applications/Microsoft Word.app/Contents/MacOS/Microsoft Word" -AppleLanguages '("zh-CN")' "$KMVAR_OFAW_File"

随后还可以按照个人习惯,接调整窗口大小、调节缩放等操作:


上一期
第 24 周话题讨论:你会让自己的孩子上社交网络吗?
下一期
通吃常用格式,用 LaunchBar 快速无损压缩图片 | 工作日志
 
精选评论(1) 我的评论
  • zixr365
    请问一下Hyper键是如何定义的?你是用一个键来替代这串组合键还是每次真的按下这么多的键?
    02月08日
    • 少数派编辑部
      所谓 Hyper 键,就是用一颗键代替多颗按键。可以参考这两篇文章:

      https://sspai.com/post/42921
      https://sspai.com/post/39331
      02月08日