自从 3.0 大版本发布之后,Things 凭借简洁美观的设计以及对 GTD 独到的见解,迅速俘获了一大批新老用户的心。

但是,仍有很多重度依赖过滤、协作、URL Scheme 等进阶功能的效率爱好者在习惯了 Todoist 和 OmniFocus 等其他 GTD 应用的高度定制化体验后,纷纷表示 Things 3 在自动化方面还有些差强人意。

在最近的 3.4 版本更新中,Things 为我们带来了一个重磅炸弹:全面的 URL Scheme 支持。熟悉 iOS 效率操作的玩家应该都知道 URL Scheme 对于自动化的重要性,而 Things 的本次更新让用户能够通过 URL Scheme 完成链接到 Things、支持强大的快捷方式以及从其他应用程序切换,也正式宣告了其在自动化领域对于 Todoist 和 OmniFocus 等软件的追赶步伐越来越快。


基础部分

启用 URL Schemes

在使用 Things 的 URL Schemes 功能之前,我们需要在 App 中先启用这项功能。在 iOS 平台上打开 Things 后把界面拉到最下方,点击设置,然后在设置界面中点击常规,然后点击高级,你就能看到 Things URL Scheme 的启用按钮了。

而在 macOS 平台上的 Things 中启用这项功能会更简单一些,只需打开偏好设置..界面后(可直接使用键盘快捷键 ⌘Command, 打开),在启用 Things URL Scheme 前勾选上即可。

获取专有链接

在成功启用 Things URL Schemes 功能后,我们还需要了解如何获得 Things 中各列表(包括项目和区域)以及特定待办事项的专有链接。

在 iOS 上,进入 Things 中你想要获取链接的列表中(包括区域和项目),下图以今天为例,然后依次点击右上角的倒三角按钮和共享,在弹出的分享菜单中找到拷贝链接,点击即可获取该列表的专有链接。

如果你想要在 iOS 客户端上获取某个特定待办事项的专有链接,那么你需要先点击并展开该待办事项,然后在底部的工具栏上点击 ••• 按钮,再点击共享,然后就可以在分享菜单中找到拷贝链接了。

在 macOS 平台上获取链接的操作会简单很多,不管你是想要获取列表的专有链接还是特定待办事项的专有链接,你都只需要鼠标右键点击某待办事项或者侧边栏上的列表,然后在右键菜单中依次点选共享拷贝链接即可。

如果你仔细观察你获取的专有链接,你可以发现它们类似于这样的格式:

things:///show?id=A59C5BFA-362B-4397-94ED-B371C1BE9204

你可以通过这个链接直接打开对应的列表或者待办事项,也可以从中提取 id= 后面的代码作为 list-id,在我之后介绍的指令中将会用到。

Link Builder

虽然 Things 不是第一个支持 URL Scheme 的 GTD 应用,但是开发商 culturedcode 的诚意却是最足的。除了发布了官方文稿来专门解释本次更新带来的 URL Scheme 功能中各个指令和参数的用法,culturedcode 还提供了一个链接模拟器,帮助对于 URL Scheme 还不太了解的用户方便快捷地生成相应的链接。通过这个 Link Builder,你只需要在下方各个参数对应的空白处填入你想要的内容,它就会自动生成相对应的链接,无需你再去手动编码了。

链接到 Things

指令与参数解析

在 Things 的更新日志中,这个功能被称为「Link to Things」,但是我更愿意将其理解为对 Things 中各个视图的快速导航,即通过一个链接便可直接跳转到某个特定视图,包括列表(包括项目和区域)、待办事项和标签筛选,免除了重复寻找和点击的麻烦。

链接到 Things 功能可以通过两个指令来完成,分别为 search 和 show,其中 show 在上文获取专有链接的部分中已经出现。例如以下这些链接,我们就可以通过它们完成对特定视图的导航:

  • 链接到今天列表:things:///show?id=today
  • 链接到 Reading List 列表:things:///show?query=Reading%20List
  • 链接到 Blog 列表中重要的待办事项:things:///show?id=DBBD9A5D-40A7-4850-99B8-50F36D33A753&filter=important

这里需要注意 4 点:

  1. 收件箱、今天、计划、随时、某天 、日志簿和废纸篓这几个 Things 自带的列表不需要通过上文的方法获取 list-id,它们的 id 分别为 inbox、today、upcoming、anytime、someday 、logbook 和 trash。而其它自建的区域、项目和待办事项都需要通过上文中提到的方法来获取 id;
  2. query 这个参数后面只能填入列表(包括项目和区域)或标签的名称,而不能填入待办事项的名称;
  3. 在使用 show 这个指令时必须要填入 id 和 query 两个参数中的一个,id 的优先级高于 query,两者同时存在时 query 会被忽略;
  4. 通过逗号分隔,可以在 filter 中输入多个标签。

而 search 这个指令就简单了很多,你可以使用 things:///search 直接打开 Things 的搜索界面,也可以通过 query 参数来搜索特定的待办事项、列表(包括项目和区域)和标签,而对待办事项的链接支持是 search 指令下的 query 参数与 show 指令下的 query 参数最大的不同。例如:

跳转到搜索 Things 字符的界面:things:///search?query=Things

书签

在 Things URL Scheme 出现之前,我们也可以直接在 Things 应用中手动进入某个界面或查看某个待办事项,也可以通过应用内的搜索引擎查找某个关键字。但是当我们需要不断地重复这些动作时,手动操作就会无可避免地带来效率低下的问题。而 search 和 show 这两个指令可以帮助我们在预先设定好参数后,一劳永逸地解决查看特定内容的需求。因为这两个指令最高效的用法就在于显示预先设定好的内容,无需重复输入,所以指令和参数内容都是固定不变的,也可以说链接是固定不变的,这就像浏览器书签一样,链接也是固定不变的,但是打开后显示的内容却可以保持更新。

那么我们不妨也将包含有 search 和 show 这两个指令的链接看作是 Things 的书签,我们通过点击固定的书签即可查看 Things 中对应的内容,而 Launcher 这个应用就非常适合用来保存 Things 的书签,因为与 Launch Center Pro 等应用相比,我们打开 Launcher 中的启动器时是不需要输入内容的,也就是说启动器是固定的,这就与书签的性质不谋而合了。

我在 Things 中分别创建了 Important、Unimportant、High Priority 和 Low Priority 四个标签,通过四象限法则来给我的待办事项分门别类。但是直接在 Things 应用内通过标签筛选功能来过滤出我想要的待办事项无疑是太低效了,每天都需要重复操作好几次。但是通过 Launcher 创建的启动器作为 Things 的书签,我只需要分别点击最左边的四个启动器就可以方便地对我当天的待办事项做一个优先级和重要性的分类。这四个启动器使用的是 show 指令,以其中一个为例:things:///show?id=today&filter=Important%2C!!!!,你可以自由地选择不同的列表和不同的标签组合。

「Reading List」 这个启动器也使用了 show 指令,通过这个启动器我可以方便地查看我需要阅读的文章列表。而「少数派」这个启动器则是使用了 search 指令,我可以通过它搜索 Things 中有关少数派的所有内容,查看有没有和少数派有关的落下的任务或者未完成的任务。

当然除了 Launcher,你也可以使用 Launcher Center Pro 或者 Workflow 来添加 Things 书签,只不过杀鸡焉用牛刀,如果你只是想快速便捷地跳转到 Things 中的某一特定界面或待办事项,那么 Launcher 的功能就恰到好处。

强大的快捷方式

指令与参数解析

与静态的 「Things 书签」不同的是,我们可以通过 add 和 add-project 这两个指令来完成动态的自动化操作。当然这两个指令下的参数并不是完全动态的,有一些参数我们也可以设置为固定的内容,这样就可以避免重复输入,而动态的参数内容可以保证定制性,这样动静结合才能体现 Things URL Scheme 的高效之处。

相比 search 和 show 这两个指令而言, add 和 add-project 这两个指令下的参数更加复杂和多样,接下来我们一个一个来看。先来看 add 指令下的参数:

  • 新建(多个)待办事项并添加名称:如果你想添加单个待办事项,那么你需要填充 title 这个参数,例如创建名为「Call Mom」的待办事项,链接为 things:///add?title=Call%20Mom;如果你想添加多个待办事项,那么你需要填充 titles 这个参数,例如创建名为「Buy Milk」、「Buy Apples」和「Buy Rice」这三个待办事项,链接为 things:///add?titles=Buy%20Milk%0ABuy%20Apples%0ABuy%20Rice。链接中的 %20 和 %0A 是经过编码后的效果,分别对应「空格」和「换行」,你如果在 Link Builder 或者 Workflow 中输入参数内容则会自动编码,无需你手动操作。另外需要注意的两点,其一 titles 这个参数的优先级是高于 title 的,当链接中同时存在两个参数内容时,title 将会被忽略,其二 titles 这个参数创建的所有待办事项都会继承链接中其它参数的效果。
  • 新建待办事项并添加备注:如果你想为你创建的待办事项同时附上备注,那么你只需要在链接中加上 notes 这个参数的内容。例如,创建一条名为「参加会议」的待办事项并在备注中附上会议地址「环球金融中心」:

    things:///add?title=%E5%8F%82%E5%8A%A0%E4%BC%9A%E8%AE%AE¬es=%E7%8E%AF%E7%90%83%E9%87%91%E8%9E%8D%E4%B8%AD%E5%BF%83

    看不懂?不要担心,因为这是中文经过编码后的效果,通过使用 Link Builder 或者 Workflow 就能完成。如果在链接中未使用 title 参数,待办事项同样可以创建,但只会保留备注中的内容。接下来的所有参数同理,即使没有 title 参数 也不会影响创建待办事项并会保留这些参数的效果。
  • 新建待办事项并添加核对清单:添加核对清单非常接近于添加多个待办事项,只是参数不一样而已,例如创建「Go Shopping」这个待办事项并在核对清单上列出「Egg, Milk, Beef」:things:///add?title=Go%20shopping&checklist-items=Egg%0AMilk%0ABeef
  • 新建待办事项并添加起始时间:只要你在链接中使用 when 这个参数并填入日期,就可以为你创建的待办事项添加起始时间,如果你还填入了时刻,那么还可以添加提醒。例如我要创建一个名为「拿快递」并在明天晚上 7 点提醒我的待办事项:things:///add?title=%E6%8B%BF%E5%BF%AB%E9%80%92&when=tomorrow%208pm。如果你在 when 参数后只填了时刻没有填日期,那么默认会将提醒设置为当天该时刻,另外如果你在 when 参数后填了 anytime 或者 someday,那么即使你填了时刻也会被忽略,不会创建提醒。
  • 新建待办事项并添加截止时间: 添加截止时间非常类似于添加起始时间,不同的是截止时间只能是日期,添加时刻是无效的。例如创建一个三天后到期名为「Upload Papers」的待办事项:things:///add?title=Upload%20Papers&deadline=in%203%20days
  • 新建待办事项并添加标签: 你只需要在链接中使用 tags 参数即可为你创建的待办事项附上标签,如果你想要同时附上多个标签,那么只需在填入参数内容时用「逗号」隔开标签,在编码后「逗号」就变成了 %2C。例如创建一个带有 Home 和 NBCB 两个标签的名为「Read Articles」的待办事项:things:///add?title=Read%20Articles&tags=Home%2CNBCB。需要注意的是,如果你输入的标签不是在你的 Things 中已经创建好的,那么你新建的待办事项不会被附上这个标签。
  • 在指定列表中创建待办事项:虽然我之前说的列表都是包含今天、计划、随时和某天这些 Things 自带列表的,但是在 list 和 list-id 这两个参数下这些自带列表都是被排除在外的,即使你填入了这些列表的名称或是 id,创建的待办事项也会被添加到收件箱中。这么设计的原因,我想可能是因为这些自带列表都具有时间属性,所以都可以通过 when 这个参数来归类。那么,我们还是可以用 list 和 list-id 这两个参数在区域和项目中创建待办事项,例如在我的「Miscellaneous」项目中创建一个名为「Go for Coldplay's concert」的待办事项:things:///add?title=Go%20for%20Coldplay's%20concert&list=Miscellaneous。你可以选择在链接中使用 list 或者 list-id 参数,可以达到同样的效果,但是如果你同时使用两个参数的话,list 参数将会被忽略。
  • 在指定标题下创建待办事项:heading 这个参数的使用是有条件的,即你必须在链接中使用 list 或 list-id 参数来标明项目后才能指定标题。例如,我在「Writing」这个项目下的「Articles」标题下创建一个名为「Timelogger」的待办事项:things:///add?title=Timelogger&list=Writing&heading=Articles
  • 新建待办事项并伴随其它状态:与之前的参数不同的是,completedcanceledshow-quick-entry 和 reveal 这四个参数的类型是布尔值,而不是字符串。这就意味着在链接中,这四个参数后面跟着的只能是 true 和 false 中的一个。completed 参数对应的是待办事项的完成状态,默认是 false,如果你设置为 completed=true,创建的待办事项将会被标记为已完成状态,如下图中第一张截图所示;canceled 参数对应的是待办事项是否被取消,默认是 false,如果你设置为 canceled=true,创建的待办事项将会被标记为已取消状态,如下图中第二张截图所示。需要注意的是,如果你已经设置了 canceled=true,那么 completed=true 将被忽略;show-quick-entry 参数对应的是在创建待办事项时是否显示快捷入口,默认是 false,如果你设置为 show-quick-entry=true,在创建的待办事项之前将会弹出快捷入口,如下图中第三张截图所示;而 reveal 参数对应的是在创建待办事项完成后是否展示该待办事项,默认是 false,如果你设置为 reveal=true 待办事项在创建成功后会高亮黄色,并且在 iPhone 上会有 Taptic Engine 的反馈,如如下图中第四张截图所示。

说完了 add 指令,再来看 add-project 就简单了很多,因为两者非常类似,最大的区别就是你可以通过 add 指令同时创建多个待办事项,但是不能通过 add-project 指令同时创建多个项目。不过,你可以在创建项目的同时创建多个待办事项,这与使用 add 指令在创建待办事项的同时附上多个核对清单的条目是一样的机制。例如,我要在 Personal 区域下创建一个名为 Shopping List 的项目,然后在其中添加「Walmart」、「Whole Foods」和「Best Buy」这三个待办事项,可以用下面的代码:

things:///add-project?title=Shopping%20List&to-dos=Walmart%0AWhole%20Foods%0ABest%20Buy%0A

对于效率爱好者来说,add  和  add-project  这两个指令还有一个讨人喜欢的共同点,即它们都支持通过 x-callback-url 来返回创建的待办事项或项目的专有 id,只需在链接中加入 &x-success=x-things-id  就可以达成。

动态添加

Launch Center Pro 和 Drafts 在利用 Things 这一新特性上有很大的优势。

在 Launcher Center Pro 中,我们可以通过  [prompt]  来传递不同的内容到链接中,在 Drafts 中可以通过  [[draft]]  将草稿中内的内容作为目标发送到不同的目的地。所以,用 Launch Center Pro 和 Drafts 来作为 Things 的动态添加启动器再合适不过了。

例如,我想在 Launch Center Pro 中创建一个添加待办事项到我的阅读清单并附上标签的启动器,那么我可以通过这个链接实现:

things:///add?title=[prompt]&tags=[list:Tags|Important=Important|Unimportant=Unimportant|High Priority=High%20Priority|Low Priority=Low%20Priority]&list=Reading%20List&reveal=true

除了利用 [prompt]  和  list  实现动态输入之外,Launch Center Pro 还可以通过时间和地理位置提醒你打开启动器。比如,你可以为你的某个启动器设置一个每天早上 7 点的提醒,该启动器可以帮助你添加上班出门前要带上的重要物品到 Things 中并附上一个 30 分钟后的提醒:things:///add?title=[prompt]&when=in%2030%20minutes&reveal=true

因制图时间有出入,截图时间差未能对应,实际没有问题。

而在文字输入体验更加的 Drafts 中,我们也可以完成对 Things 中待办事项或者项目的动态添加。例如通过这个链接:things:///add-project?title=[[title]]&to-dos=[[body]]&reveal=true,我们可以将草稿中的第一行文字设为项目的名称,将第二行开始的文字设为该项目下的待办事项。如果你需要添加多个待办事项,只需在草稿第二行开始依次换行输入,Drafts 会自动完成编码工作。

除了 Launch Center Pro 和 Drafts,还有很多支持 URL Scheme 的应用都可以完成对 Things 的动态添加,比如 Fiery Feeds,Airmail 和 Workflow。

Fiery Feeds 在解锁高级版后可以添加自定义的 URL,通过 Things URL Scheme 可以将 RSS 中的任意一篇需要稍后处理的文章添加到 Things 中的指定位置。

Airmail 比较特别,它本身并不支持通过 URL Scheme 将邮件导出,但是它可以通过 Workflow 来曲线救国。因为 Airmail 在 Custom Actions 整合了 Workflow,所以我们可以直接将邮件导入到 Workflow 中运行,然后添加到 Things 中。你可以从 此处 获取这个 Workflow,并调整为适合你的模版。

从其他应用程序切换

本次更新的第三个方向在于通过 add-json 这个指令与第三方应用实现联动,下属只有 data 和 reveal 两个参数,并且也可以通过 x-success 来返回相应的 id。待办事项、项目、核对清单和标题在 JSON 中有不同的描述方式,通过 Things 官方公布的方式写好代码,编码后去掉代码块中的空格,就是 add-json 这个指令下的链接了,通过这类链接可以实现比 add 和 add-project 更强大的功能。有兴趣的玩家或者开发者可以前往 culturedcode 的 官方博文 和 官方 GitHub 代码库 来获取更多的相关信息。

MindNode 是第三方应用中第一个吃螃蟹的。在 5.0.6 版本更新后,我们在 MinNode 中画好的脑图,点击「Export to Things 3」就可以通过 add-json 指令传递到 Things 中创建为一个以 MindNode 文档名命名的项目。

导出完成后,Things 在该项目的备注中自动添加了一个链接,点击可以直接跳转回 MindNode 的脑图中。不过需要的注意的是,如果你需要将 MindNode 中的脑图转化为 Things 中的项目,你必须得保证脑图中最外层的节点是以「任务」的形式出现的,这些节点将会转化为 Things 项目下的待办事项,而前面层级的节点会作为状态指示出现在项目中的标题上。除此之外,你在 MindNode 中为最外层节点添加的备注也会传递到 Things 中待办事项的备注中。

图片来自 MinNode 官方网站

除了 MindNode 以外,Things 的开发商 Cultured Code 透露新版本的 Drafts 也将在应用中支持通过 add-json 指令与 Things 的联动。

虽然 Drafts 5 还未公开发行,但是已经有不少 iOS Power User 已经将 add-json 指令利用了起来。在 Macstories 最近的 一篇文章 中,Federico 利用了 Workflow 对于日期时间的自然语义识别,间接地实现了通过自然语义处理来添加待办事项到 Things 中,而这个 workflow 中最后一步就是用到了 add-json 指令。你可以从 此处 下载这个 workflow。

值得一提的是,你还可以将这个 workflow 添加到 Drafts 中,这样以来你就可以拥有更好的输入体验,还能获得相同的效果。

不过 Federico 在文中也提到,这个 Workflow 实现的自然语义识别并不是真正意义上的「自然语义识别」,只是通过输入特定格式的自然语义来让 Workflow 识别日期与时间。如果你想实现更加智能的自然语义识别,那么你不妨试一试 这段代码,它使用了广受好评的 chrono 来支持自然语义识别时间并在 Things 中创建相应的待办事项。你可以在 Drafts 中创建一个 Action,并在其中加入这段代码,这样就可以将它作为一个 Things 的动态添加启动器了,弥补了 Things 自身对自然语义识别的不足。

Workflow

虽然在之前的解析中我已经展示了如何通过 Launcher、Launcher Center Pro 和 Drafts 等应用来实现对 Things 的自动化操作,但是作为 iOS 平台上最典型的自动化工具,Workflow 可以利用 Things URL Scheme 实现更多的可能。

  • Things UPCOMING 实现简单的链接功能,直接跳转至计划列表并使用 Important 标签筛选。
  • Add to Reading List 通过分享按钮运行,将网页名称作为待办事项的名称,将网页链接作为待办事项的备注,添加到 Things 的 Reading List 项目中。
  • Convert Project Back to Checklist 这是一个来自 Matthew Cassinelli 的 Workflow,通过它可以将 Things 中的一个项目以及它下面的待办事项转换成一个带有核对清单的待办事项。
  • Things > Bear > Things 来自于 Josh Ginter,通过这个 workflow 可以在 Bear 中创建一条带有 Things 待办事项链接的笔记,然后获取该条笔记的链接粘贴到待办事项的备注中。
  • Attach DEVONthink File To Things 既然我们无法在 Things 中直接为待办事项添加附件,那么我们可以通过 DEVONthink 来实现。在 DEVONthink for Mac 上我们可以直接使用 Things 的 Quick Entry with Autofill 来将 DEVONthink 中的文件添加到 Things 中,文件名自动填充为待办事项的名称,文件链接自动填充为待办事项的备注;如果在 iOS 上的 DEVONthink To Go 中想要实现同样的效果,只需在 DTTG 中打开文件然后运行该 workflow,就可以创建一个备注为 DEVONthink 专有链接的待办事项。

  • Create Text In DEVONthink And Attach To New Todo In Things 如果你不想使用 DEVONthink 中已经存在的文件作为待办事项的附件,而是想在创建待办事项的同时在 DEVONthink To Go 创建一个新的文件,那么你可以试试这个 workflow。(感谢 Hum 对两个 DEVONthink 有关的 workflow 的意见与改进)

  • Ulysses & Bear 我一般会选择在 Ulysses 上写我的稿子,所以通过这个 Workflow 我可以先在我的 Writing 项目中创建一个待办事项,然后在 Ulysses 中创建一个带有 Things 中待办事项链接的文稿,最后将新建的 Ulysses 文稿的链接粘贴到待办事项的备注中,就可以实现在 Things 和 Ulysses 之间的无缝跳转了。

后记

除了前文提到的内容,Things 3.4 更新中其实还包括了 version  指令以及新增的音调不敏感搜索,此处不再详细展开。虽然我不敢保证我解释的内容涵盖了此次更新所有的细节,但是从已展示的内容来看,Things URL Scheme 所带来的效率上的提升是显而易见的。一步一个步伐,Things 3 的更新之路走得异常稳健,我相信在不久的未来,Things 3 的自动化将不会再饱受诟病,兼具简洁美观设计和强大自动化支持将使它成为更多效率人士的任务管理工具首选。

进一步了解 Things,欢迎继续阅读以下文章:

更多关于 Things 的文章,尽在专题 👉 任务管理,从 Things 开始

下载 少数派、关注 少数派公众号,让智能设备 Power Up。