前言
Alfred 是一款 MacOS 上用户基数较大的软件, 笔者主要是用它来取代原生的 聚焦搜索, 除此之外, 最近开始研究它的 工作流(workflow) 相关的功能.
本篇就是实际展示一下如何开发一个 workflow. 使用的脚本语言是 Python , 不过实际上任何脚本语言都可以完成开发工作.
需求
计划是开发两个搜索用的 workflow, 一个是 confluence 的, 一个是 notion 的. 这两者的搜索都是比较麻烦的, confluence 在页面上默认是内容搜索, 会比较慢, 而且它提供的查询语言实际上能够做到更多形式的搜索. notion 的搜索放在页面的左上角, 每次使用都需要大幅度地移动鼠标, 并且没有纯键盘的操作方案.
开发
需求并不复杂, 所以也就没有什么设计阶段了, 直接开干.
notion search
开发主要是三步.
- notion 接口
- alfred 接口
- 接口对接
notion 的搜索主要是通过开发文档提供的 search 接口来实现. 实际上这个接口是 标题搜索 而非 内容搜索, 不过如果笔记的接口比较科学的话, 大多数情况下标题搜索也是足够使用的.
alfred 提供了很多的 workflow 范例 (workflow -> 右侧边栏). 这里选择的是 Script Filter 这个模板. 点开配置模块, Script 一栏中的内容就是平时在使用的脚本命令, 形如 /Users/.pyenv/shims/python notion.py {query}
, 其中的 query
将会作为参数项传递给脚本程序.
在对接的时候需要注意的就是输入内容和输出内容, workflow 脚本的输入内容就是上一段提到的 query
, 对应的就是 cmd+space
之后, 在输入框中输入的内容 (不包含 Keyword
). 输出内容则是有固定的格式, 这里使用 dataclass
来进行锚定.
@dataclass
class AlfredItem:
title: str = "" # 标题, 即主要展示的内容
subtitle: str = "" # 副标题, 即 title 下方的补充内容
arg: str = "" # 传递给后续 work 的内容, 对于搜索结果而言, 就是需要浏览器打开的 url.
icon: dict = field(default_factory=dict) # 搜索结果的图标
mods: dict = field(default_factory=dict) # 搜索结果的补充修改. 使用方式可以参见 https://www.alfredforum.com/topic/9037-junction-with-modifiers/
text: dict = field(default_factory=dict)
接下来就是脚本的代码, 有了输入输出, 实际上脚本并没有什么技术难度或者亮点了, 有需要的可以阅读 notion search. 可以注意一下, notion 是支持唤醒 notion app 的, 将 link
中的 https
替换为 notion
即可.
confluence search
confluence 的编写过程与 notion search 相类似, 区别在于 confluence 支持更加多样化的搜索, 也就是 CQL, 对此笔者采用的方案是使用同族的多个 keyword 来触发不同的脚本逻辑.