关于程序启动器

当在 Mac 上想要运行一个 App 时候,你会怎么做?当你想打开一个文件或文件夹的时候,你又会怎么做?有一类 App 是专门做这个的。对于我来说,离开了这类 App 使用电脑,就像去朋友家做客时,夜里起床想穿过客厅去厕所,找不到灯的开关,磕磕绊绊中踢到了家具最后抱着脚流眼泪。

平均每天我会唤起 LaunchBar 使用它的各种功能 30 多次,在密集使用 Mac 进行生产力活动时,更是几乎每 10 分钟就有一次。从我使用 Mac 开始,最早使用的启动器是 Alfred,但是当我接触到并使用了一段时间 LaunchBar 后,就毫不犹豫的转换了过来,不仅是因为 LaunchBar 颜值更高,更是因为 LaunchBar 的设计思路更 macOS,能做到的事情也比 Alfred 更多。

虽然小标题为「程序启动器」但是启动器类 App 的用处不止于此:运行 AppleScript,执行一段临时起意的 Shell Script,直接在某个网站内搜索,打开一个浏览器书签,把一定金额的美元换算成人民币,获取剪贴板历史……这些功能还不是全部,无论 Alfred 还是 LaunchBar 都会随着你的使用变得越来越熟悉你,会学习你的使用习惯:提高你最经常使用的动作的优先度,会越用越顺手。

在 OS X 10.10 Yosemite 中,苹果把 Spotlight 的位置从屏幕右上角移动到了屏幕中间,些许地提升了一些 Spotlight 的「力量」。那么,这种「程序启动器」的应用点子是从哪里来的呢?

⌘ Space 的历史

LaunchBar 始于 1995 年,运行在 OS X 的前身 NeXTSTEP 上。Norbert Heger,LaunchBar 的开发者,与 Derrick 讲述了 这个软件的历史。在访谈中 Norbert 谈到:当你的文件系统是按照层级 (hierarchical) 来组织的时候,就很难快速定位到很深层目录下的某个文件;并且你把你的文件管理的越好、越井井有条,你找东西时候花费的时间就越多,为了解决这个问题,Norbert 开发了一个软件,只要把你想要的文件大概描述一下,剩下的寻找工作交给电脑来做,于是 LaunchBar 就诞生了。

最开始时 LaunchBar 只是一些 Shell 脚本的集合,但是随着 Norbert 和 Objective Development(LaunchBar 的开发商,同时还开发了 Little Snitch)团队使用 LaunchBar 使用的越来越多,他们意识到,这个软件有着非常广的用例,发布出来的话许多人都可以从中获益。于是,在 1996 年的时候 Objective Development 释出了 LaunchBar 公共测试版。

Norbert Heger:

The very first “prototype” was not even an application. It all began with dozens of little shell scripts and a tiny Terminal window. … The Terminal window was placed in one of the screen corners, allowing us to bring it to the front quickly using the mouse. When we wanted to launch Interface Builder, for instance, we just had to click that screen corner, enter “IB” …

As you can imagine, this approach was not really practical. We had to create a new shell script for each and every item that we wanted to access, so we thought, hey, there must be a simpler way to accomplish this.

So we started developing a rating algorithm to determine the best matching item for a given abbreviation automatically.…. Even today, we're still trying to improve and optimize that technology in order to achieve even better search results.


在最早的原型阶段,LaunchBar 甚至不是一个完整的 App,只是一个保持在屏幕角落运行的 Terminal 窗口,当我想运行 Interface Builder 这个 App 时,我就点击屏幕角落,输入 "IB" 这个提前确定好的字符串。正如你猜到的,这么做很累人,需要给想访问的每个项目写一个新的脚本。于是我们花了两个月时间开发了一套算法,可以自动归纳项目的缩写。

然后我们熟悉的「Command 空格」也来了:

Johannes “invented” the Command-Space hotkey back in 1995. In NEXTSTEP it was nearly impossible to implement a system wide hotkey, but Johannes found a way to patch the Display Postscript Server (also responsible for dispatching keyboard and mouse events), allowing us to activate LaunchBar with a single keystroke. Fortunately, these things became much easier to accomplish in Mac OS X.

对于今天的 Mac 来说,LaunchBar 并不是唯一的「程序启动器」,一个 App 只要能够快速打开其它程序或文件、快速触发一个流程,都可以称为「程序启动器」,Spotlight 是,Launchpad 是,调教过的 Keyboard Maestro 也是。

当前来说,毫无疑问 Alfred 占据了 绝大多数 这类软件使用者的桌面,向新手推荐 Alfred 是不会犯错的选择,功能强大的同时基础功能是免费使用的,当熟悉了基础功能以后还可以按需购买 Powerpack 增强包。但是对我个人来说我更喜欢 LaunchBar。

我青睐 Launchbar 的原因有几点:

    LaunchBar 的 Instant Send、查看 App 最近打开的文件历史、剪贴板历史 等等特点,利用尽了 macOS 的优势; LaunchBar 有着 20 多年 的开发历史,而我又是特别喜欢这种端庄、正派物件的人。(这里有一篇文章,整理了一些有着悠久开发历史的 macOS 软件)

介绍 ⌘ Space 的历史或者说介绍 LaunchBar 的历史,是为了帮助理解: LaunchBar 与 Alfred 和 Spotlight 虽功能相似,但是在最初之时的设计理念就有所不同,Alfred 是一个站在系统旁边的「助手」,自己就能完成各种事;LaunchBar 本质上是一扎脚本的集合,对各种「变量」传入传出处理很好。

由于 Objective Development 是一家德国公司,LaunchBar 本身也只提供英文和德文的语言界面,中文下会有很多不便,建议在英文系统下使用,我也会在下文着重涉及一些母语为中文的人在 LaunchBar 中可能遇到的问题和一些应变方法。1

LaunchBar

组成

⌥ ⌘ I⌥ ⌘ E

上手

对于之前的 Alfred 或者 Spotlight 用户来说,一开始使用 LaunchBar 最不适应的地方恐怕就是「Retype Delay」机制了。在 Alfred 和 Spotlight 中,按下回车之前,输入框中的内容是可以随便修改的;但是在 LaunchBar 中,只有在 retype delay 期间,输入的内容才可以修改(可以通过观察右边字符下面的下划线来得知,有下划线时可以修改),过了这段时间只能重新输入。

看起来不够友好?但是当你习惯了这个系统以后,效率是会提高的:因为在 LaunchBar 的自适应系统下,你不会经常需要微改输入了一半的指令,即使输入有小的错误也是可以到达预期的内容的;经常的情况是,输入途中突然变了主意,需要输入一条全新的,这个时候 LaunchBar 的设计就比按 n 次退格键方便很多。

这里是 Objective Development 在 Vimeo 的频道,有着几个非常棒的 LaunchBar 功能介绍视频,一定要看一下。

Preferences 首选项

⌘ ,Fn⌘ Space⇧ ⌘ V⌘ C

Adaptive Abbreviation Search 自适应简称搜索

LaunchBar 有着自己的一套自适应的缩写机制,自适应体现在:

SPSYSSYSSYSSYS⌥ ⌘ ATOYOUKU

基本上各个项目排列顺序可以归纳为:应用程序的权重最高、其次为文件夹、最后为动作,内建动作又高于自定义动作。

⌘ Space2⌘ Space2⌘ SpaceSP

Sub-search 次层级搜索

LaunchBar 中有一个搜索状态的区别,可以通过下方候选项光标背景颜色来区分:蓝色为搜索大类(母类);黄色为 Sub Search,搜索子类。当一个集合的内容较少时候,可以按空格键跳过集合下的小集合,直接浏览或「次层级搜索」这个集合的全部项目。

EMJSpaceEnter

无论是直接查看所有项目,还是查看细分类,光标背景都变成了黄色,指示着此时处于 Sub Search 状态,这时再输入就是你选择的这个小范围中搜索,而不是整个 LaunchBar。

再举个例子,LaunchBar 可以直接进入 Chrome 内部搜索 Chrome 中的历史记录、书签、当前打开的网页,大概整理如下,其中 Application 和 Indexing Rule 都可以直接在主层级搜索访问到。

通过在 Index 中控制部分集合在 Sub Search 下显示,有助于保持搜索结果的精简。

Action 动作

「动作」是 LaunchBar 和核心,通过 Adaptive Abbreviation Search 只搜索到了内容但是无后续动作,那搜索就毫无意义。轻点回车或 Instant Open 打开是最简单的动作。

动作是贯穿整个 LaunchBar 的,大概可以分为:

⌘ Y⌘ ↵TabUNNW~/Applications/VLC.appopen -a CleanMyMac\ 3.app {query}⌘ ⇧ I⌘ I⌘ T

Browse 浏览

文件夹、书签的文件夹、联系人、联系人的分组、iTunes 库、应用程序的最近文件,都是集合,所有的集合都可以通过方向键左右箭头来导航浏览集合下的子项目。

⇧⌘R⇧⌘N

浏览功能是我非常喜欢的几个 LaunchBar 特点之一:

DWN~/Users/Downloads⌘ →TYP⌘Y

Instant Send

Instant Send 是极其快速的把选中的文件或文字输入到 LaunchBar 的方法。可以通过快捷键(上文有提到)或把内容拖拽到 Dock 上的 LaunchBar 图标使用 Instant Send。

Instant Send 是我最喜欢的 LaunchBar 功能,用法非常多,几个我的用法:

⌘Yhttp://s.taobao.com/search?oe=utf-8&f=8&q=*
    处理文件时候 Shift 和 Command 齐用选中了几个文件,Instant Send 使用 Keka 剔除掉类似 .DS_Store 这种 Windows 用户看了一头雾水的文件后直接压缩;压缩后再次使用 Instant Send 传到到 Mail 直接发给接收文件的人。流程不要更舒爽……
2

本质上来说,Instant Send 只是一种把(输入的)文本、(Finder 中找到的)文件或文件夹,快捷的传入到 LaunchBar 中的方法,传入后的内容与手动在 LaunchBar 中一步步找到的内容在后续的处理方法(Action)上并没有什么区别,Instant Send 是最能体现我前文说到的「LaunchBar 设计思路更 macOS」的地方。

与其它程序的互动

像 Alfred 需用 Workflow 来提高与 Fantastical、Evernote 的互动能力不同,LaunchBar 本身就内置了与各种 App 联动的能力,加上更好的利用了 macOS 的「服务」这一特点,无需做多余工作就能融入现有的工作流。

Tags:

日历:Calendar 下找到想添加的日历(账号)后,空格,可以使用(算是)自然语言(吧)直接添加日历项目,像这样:

Tab 可以快速输入 @ ,具体语法可以看这里。 LaunchBar 自己设计的语法并不好用,所幸 LaunchBar 有 Fantastical、QuickCal 这种大家常用的日历软件的支持,调用他们使用真正的自然语言建日历项吧。

⌘↵

Dash: 程序员朋友会经常用 Dash 来查看文档,与 Evernote 类似但又有所不同,LaunchBar 的 Dash 搜索有动态反馈。

其它的还有搜索 Mac App Store,Todoist、OmniFocus、2Do 添加任务,Twitter 发推,Tower 进行 Git 操作……都有很好的支持。

LaunchBar 自己的动作

程序切换

⌘ R⌘ Space⌘ Tab⌘ Tab⌘Q⌘H⌘⌥F

打开 URL

⌘ L

Alfred 有一点我诟病了很久,它的剪贴板历史功能与其它部分是隔开的,在 Alfred 中输入命令输入了一半时,查看剪贴板历史,会中断当前输入,即,无法把剪贴板历史插入到当前输入中。高兴的是 LaunchBar 在这个地方处理的很好。

杂项

正如 LaunchBar 的 Solgan,「1000+ Features, 1 Interface」,关机、休眠、重启;开启屏幕保护程序;清空废纸篓;弹出挂载中的驱动器;Base64 转码,LaunchBar 自己就能做到的小动作太多了,列举不完,翻一翻 Index 中 Actions 下的 Build-in Action 都是,熟悉熟悉在以后有需求了能想起来用就好。

LaunchBar Index 索引编辑器

LaunchBar Index 里包含了所有会出现在 LaunchBar 中的搜索结果,基本上对 LaunchBar 的调教就是对 Index 的调教,Index 内的每项都值得研究。

像 Network Locations、User Accounts、Themes 等一些不会经常用到的集合,我都在 [Option] 中选择了 「Access items via sub-search only」,以保持 LaunchBar 候选项的简介、不混乱。

~/Applicationshttps://savedeo.com/download?url=**http://tinyurl.com/create.php?url=* *https://pinboard.in/search/?query=*+&mine=Search+Minehttps://www.zhihu.com/search?type=content&q=*~/Documents~/Downloads~/Pictures

问题和杂项

上文用了几千字讲了 LaunchBar 的优点,但是 LaunchBar 的问题也有不少。

第三方 App 兼容

关于 Shell 脚本,LaunchBar 有「在 LaunchBar 中执行」、「在 Terminal 中执行」、「在 iTerm 中执行」共三种方法,前两种方法不受其它因素影响,但是第三种,在 iTerm 中执行,LaunchBar 的内置动作会寻找 iTerm 1,然而事实是 iTerm 已经升级到了版本 2,与版本 1 的 AppleScript 不再兼容,所以 LaunchBar 内置的在 iTerm 中打开 Shell 脚本的动作就失效了。这里有一个自定义动作,可以在 iTerm 2 中运行 Shell 脚本,安装后在 Index 中把内置动作禁用掉吧。

类似的问题还发生在 Evernote 和 Airmail 中:Evernote 目前是版本 6,LaunchBar 的内置动作还会寻找 Evernote 5;Airmail 现在的版本是 3,LaunchBar 还在坚持寻找 2。

虽然有解决办法,但是根本办法还是希望 Objective Development 的开发能更积极一些。

滚动方向

Mac 的触摸板很好用,和 Windows 上大多数触摸板的滚动方向不一样,叫做「自然滚动」,是把当前屏幕上的内容想象成一个画布,而滚动是模拟手指在拖拉这个画布。在 LaunchBar 中使用触摸板滚动时,因为 LaunchBar 中没有「画布」,只有「光标」,所以「自然滚动」在 LaunchBar 是对光标而言的,如果你不习惯这种设计,可以在 Terminal 执行:

defaults write at.obdev.LaunchBar NaturalScrolling YES

更改成和其它软件中类似的逻辑。

开发者在这里一篇博文解释了这个问题。

剪贴板管理

Tab

当然可以理解的是 LaunchBar 这么设计是有着一致性的考虑,为了解决这部分需求,我使用 Keyboard Maestro 来实现直接对剪贴板内容处理。

动作的获取和制作

足够丰富的动作是一个启动器的立足之本,LaunchBar 有着丰富的资源。

    首先是这个 LaunchBar 官方动作示例库,其中的 Convert Currency 汇率转换和 Spotify 动作都非常值得一用。
    这是官方论坛,里面内容也不少,但是呈现做的不够好。我把他当成一个字典来用,做动作找不太到思路的时候会来这搜一下关键词,找找思路。 这里是一个又爱好者搭起来的网站,前文提到的 Run iTerm2 Command 就是来自这里,同时这还有一个不错的主题。 这个 Github 页面列举了非常多的动作,值得一看。最下面提到的其它网站也值得留意一下。

编写自己的 Action

「自己动手,丰衣足食」,我曾在刚刚使用 Alfred 时,沉迷往返于各个论坛下载别人制作好的 Workflows 来用,其中有一些很是疯狂,像在 Alfred 中使用 Workflows 制作了一个 aria2 管理器,但过了一阵后发现我下载下来的这些我用的其实并不多,真正多的是我自己亲手做的那部分。LaunchBar 的社区虽没有 Alfred 活跃(市场份额差距在这里摆着),但是因为我会自己做动作,我之前的工作流可以完整的迁移过来。

⌥ ⌘ E

LaunchBar 支持任何能在 Mac 上运行起来的语言,从简单的一小段 Shell Script,到 Python、Ruby 或 PHP 脚本语言,到 Objective-C 这种需要编译的语言。用哪种不重要,顺手就好。

    Default Script:通常情况下被执行的脚本。当动作被选择,用户按下回车时,或者按下右箭头时(适用于脚本有返回值,而且不需要有输入值就有返回值的情况)脚本被执行。每一个动作都要有一个 Default Script。 Suggestions Script:只在输入过程中被执行。就像名字所预示的那样,这段脚本用于给用户建议可能想输入的内容。当用户完成输入,在建议的结果中选择了一个并按下回车后,把被选择的内容会传递到 Default Script 中。
JavaScriptCore Framework

在编写这部分我写的很粗糙,因为官方文档十分详尽,我完全翻译一遍也没什么意义,按需自行查阅就好。

尾巴

因为我之前是 Alfred 用户,后来转来使用的 LaunchBar,文中处处充满了 Alfred 和 LaunchBar 的比较,但是我并没有贬低一者抬高另一者的意思,我还为 Alfred 保留了快捷键,以便使用一些用我不懂的语言编写、未能移植到 LaunchBar 的 Alfred Workflows。

Alfred 的开发和社区很活跃,容易上手,基础功能免费,毋庸置疑的是一个了不起的软件。但是如果你不尝试一下 LaunchBar 的话,You missed a lot!