给常用应用设置快捷键可以极大提升效率,不仅节省时间,更主要的是减少思路的中断次数。

尤其在使用原生的 ⌘Command + Tab 或者 Mission Control 切换应用时,需要从正在思考的问题中跳出来,用眼睛去识别和定位要打开或者要切换的应用。

SpaceLauncher 是 Mac 下的一个快捷键工具,通过按住空格键并按下另一个按键,它可以执行相应的动作。这里的动作可以是打开一个 URL(包括应用、网页等),模拟按键或者嵌套更多按键。

如视频不能正常显示,请访问 官网 观看。

如果你了解 Brett 的 「Hyper key」,SpaceLauncher 实际上就是把空格键作为了一个更大的 「Hyper key」。1 

为什么要开发 SpaceLauncher

Alfred 的时候,看到了 Tim Stringer 的 Alfred 2 Hotkeys Screencast,对常用的应用和文件夹设置了快捷键,后来转 LaunchBar,没有这个功能,于是就想找个替代方法。

我记不清当时知不知道 「Hyper key」。现在看来,Caps Lock 的键位对我来说还是不太舒服,主要是纠结于原来用小指按的「1」、「Q」、「A」、「Z」得用无名指按。

既然 LaunchBar 没有设置全局快捷键的功能,我就只能找别的工具来实现。既然要自己配置,那就尽可能配置一个最顺手的快捷键。看着键盘,最大的那个按键就是空格了,用来按空格键的拇指的事情也相对较少,可以好好利用下。当时也没想太多,考虑先试试看。

为了测试一下这个「空格快捷键」的概念,我先用 Karabiner2 实现了一个简单的版本,当时的感觉是,「我这个想法太好了」,然后发到了 微博 上,好像也没啥反应。后来又根据自己的习惯做了一些调整,那种指哪打哪的感觉让我持续夸了自己一个星期。逐渐习惯之后,也就意识不到它的存在了。直到 macOS 出了新版本 10.12,Karabiner 失效。

当时的微博

我先后两次在升级到 macOS 10.12 之后降级了系统,主要原因是 Karabiner 失效。最后一次不得不升级是因为最新版的 Xcode 只支持 10.12。

升级到 10.12 之后过了一段时间,我就在想,为什么没有「空格快捷键」我会觉得这么别扭。因为切换应用是个很频繁的操作,如果每次切换都要去识别一下应用的名字或者图标,都会分散注意力,而且是会频繁地分散注意力。当然,也怪我懒,没去做其它类似 「Hyper key」 的设置、一直在用 ⌘Command + Tab 切换应用。

初次接触这种方法可能会觉得通过快捷键切换应用也会分散注意力,但实际操作中会发现,经过短时间的适应,切换应用时并不需要去想,手指会习惯性地去按相应的键,好像形成了肌肉记忆,就像打游戏一样。

用空格做快捷键的一个好处就是双手不需要任何程度的扭曲,让切换应用的整个过程更加顺畅。

这么好用的功能不能用了,于是决定自己来实现。现在看来,当时严重低估了工作量。

SpaceLauncher 「正确」的使用方法

(注意:SpaceLauncher 当前版本 1.3.7,之后版本功能可能会有变动。)

SpaceLauncher 的功能本身已经非常简单,默认设置可以满足一般需求,初始动作列出了一些例子,并不需要额外的操作说明。

个人建议,先添加一些最常用的应用,需要时再添加新的,不然会很快忘掉,而且忘掉的不只是某个应用的快捷键是什么,而是是否给某个应用设置过快捷键。

就我而言,我最常用的几个应用,Safari(S)、Xcode(X)、Terminal(T)、Tower(G)、Dash(W)、nvALT(A),我大部分时间都是在这几个应用之间切换。当频繁地感觉到切换某个应用很麻烦,才会考虑给它设置快捷键。

这样做能够尽快地通过最少的配置有效提高效率,按照 80/20 法则,可能对于大部分人来说,80% 的应用切换操作集中在 20% 的应用当中。

并不是每个人都需要 SpaceLauncher 的每一个功能,时间精力允许的话可以多了解一些,有需求当然没问题,但千万不要为了用某个功能强行制造需求。

个人认为上面提到的方法同样适用于大部分通用软件:优先满足主要需求;让软件服务自己,而不是为了让软件物尽其用而「折磨」自己。

提示窗口

当长按空格超过一定时间之后,SpaceLauncher 会弹出一个提示窗口,列出当前可用的快捷键。如果按照上面的方法,只设置常用的快捷键,这个提示窗口很少会用得着。

提示窗口中对很少使用的快捷键会加粗显示,经常使用的快捷键会通过调整灰度使其看起来淡一些,虽然看起来有点乱,实用更重要。

SpaceLauncher 的提示窗口

三个时间设置项

  • Disable SpaceLauncher for 0.2 seconds after your last typing. (正常打字时,在最后一次按键之后的 0.2 秒内禁用 SpaceLauncher。)

正常打字时,是不希望激活 SpaceLauncher 的,只有在停止打字 0.2 秒之后按下的空格才会被 SpaceLauncher 识别。

  • After space key down, ignore pre-defined keys within 0.2 seconds. (按下空格后 0.2 秒内的按键不被视为 SpaceLauncher 的快捷键。)

打字比较快的时候,会出现这样的情况,前一个按键还没有松开,后一个按键已经按下。如果前一个按键是空格,那么,在按下空格之后 0.2 秒内如果按下了下一个按键,那么这个按键将不会被识别为 SpaceLauncher 的快捷键。

  • After space key down, show hint window after 1 seconds. (长按空格超过 1 秒,显示提示窗口。)

这三个时间设置项的默认值基本可以满足大部分用户的需求,包括打字速度较快的用户。如果需要调整,但并不完全理解某个设置项的具体含义,请 在此 提交用户支持。

其他

(以下假设左手常放在键盘上,右手会在键盘和鼠标 / 触摸板间切换)

  • 如果某个应用通常只用于浏览或者使用时需要右手操作鼠标/触摸板(如浏览器),那这个应用的快捷键设置在左手的键盘区域就会方便很多。
  • 如果某个应用通常是需要双手打字的(如写作工具),那这个应用的快捷键建议设置在右手区域,这样的话用右手按快捷键之后正好接着打字。
  • 启动费时的应用的快捷键建议设置在左手区域。
  • 设置 Tab 模拟 ⌘Command + Tab 方便切换回之前的应用,或者设置 「H」 模拟 ⌘Command + H 隐藏当前应用。
  • 有些应用按住空格键有特殊用途,可以禁止 SpaceLauncher 在这些应用中生效,或者按一次空格之后快速再按下空格,这时该应用会接受到一个完整的空格和一个按住的空格,而不是让空格被 SpaceLauncher 截获。这个方法也可用于连打空格。
  • 菜单栏里的图标会根据当前的输入状态改变,我已经尽量让这个变化不明显了,如果不喜欢,可以在设置里隐藏状态栏图标。

一些比较特别的 URL

  • Launchpad:file:///Applications/Launchpad.app
  • Mission Control:file:///Applications/Mission%20Control.app
  • Siri:file:///System/Library/CoreServices/Siri.app
  • Finder:file:///System/Library/CoreServices/Finder.app
  • Storage Management (储存空间管理):file:///System/Library/CoreServices/Applications/Storage%20Management.app
  • iCloud:file://{HomeDirectory}/Library/Mobile%20Documents
  • 系统偏好设置:见 OS X System Preference Link
  • SpaceLauncher 内置 URL
    • 显示设置:spacelauncher://show-preferences-window
    • 显示/隐藏设置:spacelauncher://toggle-preferences-window
    • 切换输入法:spacelauncher://switch-input-method/input-method-id

开发中遇到的「坑」

一个难题:用户的按键习惯稳定且不同

不同的用户可能有着完全不同的按键习惯,但就一个用户来说,其按键习惯是相对固定的。导致的结果就是,在我使用过程中从来都没有出现过的问题,可能会频繁地出现在另一个人的使用过程中。

简单说一个具体细节:

正常按键是在按下按键的时刻生效(这里的生效是指打出相应的字符),而不是松开按键的时刻,如果打得比较快,很容易出现前一个按键还没有松开、后一个按键已经按下的情况。对于 SpaceLauncher,只能让空格键在松开时生效(打出空格),因为只有在松开时才能确定用户是要输入空格,而不是准备调用 SpaceLauncher 中的某个动作。

如果用户在按下空格之后立刻按下某个按键(比如 「V」),这个时候可能空格还没有松开,在正常情况下,用户期待的是先空格再 「V」,而因为 SpaceLauncher 只能让空格键在松开时生效,如果不做特殊处理,输出会是先 「V」 再空格。

如果用户打字非常快或者有这样的习惯,可能后续的按键也是混在一起的(前一个键没松开后一个键就按下了),比如,输入 「空格vic」,「V」、「I」、「C」 几个键也都是「粘」在一起打出来的,如果不做特殊处理,空格可能出现在「vic」的后面或者中间的任一位置。

上面的问题,在我的使用过程中就很难出现,即使在连续打字过程中,我仍然会在打出空格之后有一个不太明显的停顿(0.2 到 0.5 秒)。但对于其它用户,尤其是经常输入英文的用户,他们在打出空格之后可能会紧接着按下下一个按键,于是就可能出现上面所说的字符错位的问题。

好在这些问题都已经解决了。

其他的「坑」

因为使用了非沙盒接口,所以不能上架 Mac App Store。很多事情都得自己来做。这个时候才意识到 Apple 那三成的提成其实包含了很多。

我个人对应用在未告知用户的情况下联网非常反感,所以排除掉了像 DevMate 这样的一站式解决方案。

于是,应用更新、购买、注册验证、崩溃报告收集都得自己来,好在这些都有成熟的工具,不需要完全从零开始。

关于注册验证,我认为不需要非常严格,但也不能没有(如 soma-zone )。太复杂的验证浪费开发精力,没有验证对正版用户不公平,需要权衡。SpaceLauncher 使用了 CocoaFob 验证注册码。

用户反馈方面我采用了最原始的方法——邮件,而且留下了我的私人邮箱。之前在做 SPi 双拼输入法 的时候使用了 UserVoice 的服务,邮箱也用了相应的自定义域名,确实显得专业一些,但在和用户交流的过程中总有种奇怪的说不出的感觉,倒不如现在这样感觉亲切一些。

关于产品页面,因为对某些细节比较挑剔,所以产品页面没有用模板,而自己又不擅长界面设计,所以做这个看起来很简单的页面花费了不少时间。其中的视频做了浏览器兼容,图片支持 Retina 显示屏,页面做了移动设备适配,PageSpeed Insights 评分 98/100。

推广方面,SpaceLauncher 在 Product Hunt 发布之后获得了不错的评价。这次推广,我并没有遵照网上的一些经验,只是把想说的重点用自以为最高效的方式表达出来。因为无法对照比较,我也不知道自己的一些做法是否对增加票数有帮助。

SpaceLauncher 在 Product Hunt 上的页面

另外,如果需要录制演示视频的话,下面是一些可能有帮助的录屏建议:

  • 光标别乱动,会分散观众注意力。
  • 不加背景音乐,除非有很好的理由。版权、观众品味和心情都需要考虑。
  • 考虑观众的感受,尽量让观众容易理解发生了什么。比如,先介绍简单的功能,留短暂的思考间隙。
  • 录之前把要进行的操作详细记录下来,按照稿子操作。
  • 多录几遍,找一个节奏感最好的。
  • 如需放在产品页面,注意视频格式和尺寸,测试在移动设备上的显示。

以上便是我开发 SpaceLauncher 过程中值得分享的一些个人经验。如果你对 SpaceLauncher 感兴趣,欢迎前往 官方网站 进行下载。

在使用的过程中,如果有任何建议或者遇到任何问题,欢迎提交 用户支持

同时也欢迎加入 Telegram 上的 SpaceLauncher 用户群

在此感谢 @郝海龙 对在 SpaceLauncher 使用过程中出现的问题的耐心的反馈,使我出于愧疚不得不想出对应于时间设置项「Disable SpaceLauncher for 0.2 seconds after your last typing」的解决办法。

感谢 @JailbreakHum 和 @孙小年 对文章的修改建议。