缘起
LaunchBar 和 Keyboard Maestro 是两个我日常使用最多的效率工具。据 Keyboard Maestro(简称 KM) 在 About 界面显示,两台 Mac 上的 KM分别为我节省了 5 个月和 3 个月时间。

我个人应该是自 2016 年起开始使用 KM,感觉这个数字可能只是略有夸张,可以想见本人日常使用的频繁程度。对我个人而言,KM 实如其名,确实是“键盘大师”,其是“大师”,但是有点过于依赖键盘,优缺点都很明显。优点在 KM 有丰富的功能模块,而且可以通过积木式的可视化排列实现几乎无穷的可能,限制你的只是自己的想象力。具体可以看少数派已有的教程,如:
这些文章入门很好,但是涉及到的 KM 功能可能不到全部的 1/3。个人觉得 KM 最为有用的是可以感知系统环境,如剪切板是否改变及其内容,当前软件名称、窗口位置和大小、用户的输入等等。KM 的缺点在其唤起较为困难,虽然 KM 的 Macro 启动方式(trigger)已经很丰富,如可以通过热键、剪切板改变、Status_Menu 等,此外还有在 Macro Group 介面可以设置 Palette(一个根据当前软件判断是否弹出的列出了所有 Macro 的界面)。

以上提到的启动方式在 Macro 比较少时还算方便,当 Macro 较多时想找到想要的就会力不从心,如果设置的热键过多,难免记忆混淆;如果依赖 Palette ,每个软件弹出的 Palette 信置不同,需要视觉辅助去寻找,找到后仍需要通过点击或者所提示的热键进行启动。
LaunchBar 作为启动器软件,其在感知系统环境方面没有 KM 的优势,但在启动方面有先天优势:LaunchBar 系统自带了丰富的 Action、可以对检索到的条目进行二次筛选、其独特的 Retype 机制可以不用删除错误字符即可重新筛选等。因此如果可以通过 LaunchBar 来筛选 KM 的 Macro,将会达到事半功倍的效果。之前已经有部分用户考虑到这个需要,如以上提到的文章“ Keyboard Maestro 入门指南”中就列出了一个 LaunchBar 的 Action,通过这个名为Keyboard Maestro Macros (以下称 KMM)的 Action,可以检索 KM 中所有可用的 Macro,然后再通过输入字母将需要的 Macro 筛选出,回车以执行。
KMM 运行流畅,很有实用价值,但其缺点是将所有 KM 的 Macro 都列出来了,这样丧失了 KM 感知系统环境的灵魂。因为多数情况下,我最需要的是只能运行在当前软件下的 Macro,而不是针对其它软件制作的 Macro。此外则是每次需要检索 KM 的 Macro 时,需要通过⌘+Space唤起 LaunchBar,然后输入 “keyboard maestro macros” 或 “kmm”回车进行二次筛选,虽然费时不多,但是打断了思路,影响了流程。受到KMM 启发,想到可以通过制作 LaunchBar 的 Action 和 KM 的 Macro 相配合,实现单击⌘+Space 时唤起 LaunchBar 以供日常启动使用,双击⌘+Space 时就唤起当前软件的 Macro,因考虑到日常工作习惯,有时也需要检索 KM 中其它可用于全局的 Macro(如处理剪切板的 Macro),因此最好是当前软件对应 Macro 在前,全局 Macro 在后,如此岂不美哉。
具体实现
Keyboard Maestro 部分
KM 部分需要制作三个 Macro。第一个是用于生成所有全局可用的 Macro 属性 JSON 文件的 Macro。

第二个用于生成当前软件可用的 Macro 属性并拼接前面 JSON 文件的 Macro:

第三个是用于启动 LaunchBar 的 Macro(命名为 KM to Active LaunchBar),并将 KM 中的变量“LB”传递到 LaunchBar 用于显示和筛选。

LaunchBar 部分
LaunchBar 需要制一个 Action 用于接收 KM 生成的 JSON 文件并展示出来。

请以你的名字呼唤我
到了这里,只需要最后一步:如何设置总击⌘+Space 为打开 LaunchBar,而双击⌘+Space 为激活KM to Active LaunchBar,这时需要另一个软件:Karabiner-Elements。
Karabiner-Elements 是一个改键软件,但是除了改键之外,还有其他功能,如可以运行 shell 语句。因此可以通过在 Karabiner-Elements 上设置双击时激活KM to Active LaunchBar(KM 上也有双击击活的 trigger,但是如果在KM to Active LaunchBar 的 trigger 中设置为双击 ⌘+Space,无法激活)。
在 Karabiner-Elements 的 Complex modifications 中增加一条设置:
{
"description": "Double Command Spacebar to run shell",
"manipulators": [
{
"conditions": [
{
"name": "count",
"type": "variable_if",
"value": 1
}
],
"from": {
"key_code": "spacebar",
"modifiers": {
"mandatory": [
"left_gui"
]
}
},
"to": [
{
"shell_command": "osascript -e 'tell application \"Keyboard Maestro Engine\" to do script \"KM to Active LaunchBar 的UUID\" with parameter \"Whatever\" ' "
}
],
"type": "basic"
},
{
"from": {
"key_code": "spacebar",
"modifiers": {
"mandatory": [
"left_gui"
]
}
},
"to": [
{
"set_variable": {
"name": "count",
"value": 1
}
},
{
"key_code": "spacebar",
"modifiers": [
"left_gui"
]
}
],
"to_delayed_action": {
"to_if_canceled": [
{
"set_variable": {
"name": "count",
"value": 0
}
}
],
"to_if_invoked": [
{
"set_variable": {
"name": "count",
"value": 0
}
}
]
},
"type": "basic"
}
]
}
将第 22 行的 UUID 更改为之前标出的 UUID,即可实现双击激活对应 Macro。
至此大功基本告成。
尾声
因为 LaunchBar是通过英文字符、数字等对内容进行筛选,因此需要在 KM中制作 Macro 时标题加上英文,或者拼音缩写等字符。KM 中可以通过名称对 Macro进行排序,具体可见Palette Organizer v1.3 (updated Dec 3, 2021)的说明。
说明 1:本文基于 macOS Catalina(10.15.7)、Keyboard Maestro(10.0.2)、LaunchBar(6.15)。因为感觉高版本 macOS 没有重要的值得更新的内容,所以没有升级,高版本是否可用,还请自行测试。
说明 2:以上提到的 Macro 和 LaunchBar Action 可在此处下载。
