1. Alfred
和 Workflows
介绍
Alfred
号称是 Mac
上最强大的效率工具,一直在 Mac
平台的工具类中排名榜首。它在Spotlight
( Mac
自带的搜索和快速启动引擎)基础上优化了快速启动与搜索的功能,还引入了 Workflows
等强大的扩展功能,使之成为了一个拥有无限自动化潜力的「工具平台」软件,可以用它来实现近乎一切有关自动化的想法。
Worflows
是 Alfred
的高端应用方式,它以流的方式来进行工作,从输入 -> 动作 -> 输出,将各种工具串联在一起进行工作,非常开放,用来将各种功能串联起来执行,可以定制完成各种想要实现的功能,潜力无限。
虽然网上已经有很多别人写好的 Workflow
,但总是不够用,毕竟各自的偷懒点不同,因此有必要学会 Workflow
的编写,可以更好的满足自己的要求。
2. 开始写一个Workflows
今天想写一个生成随机字符串的Workflow
,可选接收一个长度参数,生成指定长度的字符串,这个字符串可以由数字、字符、数字+字符等构成。下面说一下整个创建过程。
2.1 创建一个 Workflows
打开 Alfred
的 Preferences
窗口,选择 Workflows
菜单,点击下面的“[+]”按钮,就能够创建新的 Workflows
了。Alfred
提供了多种模板可供参考,通常选择 Workflow Defaults...
就可以了。然后在弹出的窗口中填上必要的信息保存即可。这些信息在你发布这个 Workflow
的时候可以更好的描述它的作者、功能等信息,如果自己使用的话,随便填一下也无所谓:
2.2 一些概念
一个Workflow
中可以添加多种类型的对象,例如Triggers
, Inputs
等等,他们的具体功能可以参考官网的帮助信息:
Triggers: Activate Alfred from a hotkey, another Alfred feature or an external source. 简单的说Triggers的用途就是通过热键或者其他方式启动
Alfred
,进而启动Workflow
。
Inputs: Keyword-based objects used to perform an action, on its own or followed by a query. Inputs通过一个定义的关键字对象来执行一个action,这个关键字可以带查询参数也可以不带。例如你定义关键字
mc
,那么在Alfred搜索框中输入mc
就可以启动这个功能。
Actions: The objects that do most of the work in your workflows; opening or revealing files and web searches, running scripts and performing commands. Actions对象在
workflows
中负责完成绝大多数的工作,例如可以打开文件,打开搜索,执行脚本等等。
Utilities: Utilities give you control over how your objects are connected together and how the arguments output by the previous object is passed on to the next object. Utilities可以让你控制你的对象如何连接在一起工作,控制参数如何在对象之间传递。这个对象我用的不多。
Outputs: Collect the information from the earlier objects in your workflow to pop up a Notification Centre message, show output in Large Type, copy to clipboard or run a script containing the result of your workflow. Outputs对象负责从你的
Workflow
中的前一个对象中收集信息,然后真正输出到系统中,这个输出可能是:弹出一个通托盘通知,拷贝到剪贴板,写一个文件,播放一个声音等等。
这些对象不是都要用到,常用的有Script Filter
(Inputs),Keyword
(Inputs)、Run Script
(Actions)等几个。
这次要写一个生成随机字符串的功能,主要用到两个对象,分别是 Script Filter
和 Copy to Clipboard
。其中 Script Filter
负责生成随机数,Copy to Clipboard
负责将被选中的随机数拷贝到剪切板。
2.3 Script Filter的一些说明
Script Filter
的输出结果需要符合特定的格式才能够被Alfred
识别并解析出来。这个格式可以是xml,也可以是json。官方推荐用json格式。下面是一个例子:
1{
2 "items": [
3 {
4 "arg": "7RWa7SASoDVjuv45",
5 "title": "7RWa7SASoDVjuv45",
6 "subtitle": "字母加数字",
7 "icon": ""
8 },
9 {
10 "arg": "2550619258781486",
11 "title": "2550619258781486",
12 "subtitle": "数字",
13 "icon": ""
14 },
15 ...
16 ]
17}
在这个结构中,items是个数组,其中的内容就是多条要被显示出来的记录。每条记录中,关键的几个字段为:
- arg 这个值非常重要,被选中项目的arg值将被传递到后续的action中;官方的解释如下:
The argument which is passed through the workflow to the connected output action. While the arg attribute is optional, it’s highly recommended that you populate this as it’s the string which is passed to your connected output actions. If excluded, you won’t know which result item the user has selected.
- title 在Alfred结果栏中显示的内容,是必须的选项,通常这个值与arg相同,也就是显示的值也是要输出到下一个action中的值。官方解释如下:
The title displayed in the result row. There are no options for this element and it is essential that this element is populated.
- subtitle 对title的一个解释性信息,在主要内容下面以小字显示;官方说明如下:
The subtitle displayed in the result row. This element is optional.
- icon 是图标。为空的话就用workflow本身的图标代替。
上面的结果显示的效果图如下:
2.4 添加一个 Script Filter
在 Workflow
工作区中点右键,在弹出菜单中选择好 Script Filter
添加即可。Alfred
默认的Python
是2.7版本,因为要用到3.x版本,所以在 Language
中选择了 External Script
,然后选择新建一个脚本即可。
2.5 添加一个Copy to Clipboard
最后添加一个 Copy to Clipboard
对象,配置如图即可,不需要自己编写任何代码就能够把选中的项目拷贝到剪贴板:
3. 最终代码
下面代码是Script Filter
中的核心内容,负责生成随机字符串,并组装成特定格式的JSON
字符串,输出到控制台中。代码比较直观,就不做过多解读了。
1#!/usr/bin/python3
2
3import sys
4import json
5import random
6from datetime import datetime, timezone
7#from workflow import Workflow
8
9TABLES = [
10 "1234567890",
11 "1234567890abcdef",
12 "1234567890ABCDEF",
13 "1234567890ABCDEFabcdef",
14 "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
15]
16
17def addItem(items, itemValue, itemTitle):
18 item = {
19 'arg': itemValue,
20 'title': itemValue,
21 'subtitle': itemTitle,
22 'icon': ''
23 }
24 items.append(item)
25
26def randString(tableStr, length):
27 ret = ''
28 for i in range(length):
29 ret += random.choice(tableStr)
30 return ret
31
32def main():
33 randomLength = 16
34
35 if len(sys.argv)>1:
36 randomLength = int(sys.argv[1])
37
38 items = []
39
40 addItem(items, randString(TABLES[4], randomLength), '字母加数字')
41 addItem(items, randString(TABLES[0], randomLength), '数字')
42 addItem(items, randString(TABLES[1], randomLength), '小写16进制')
43 addItem(items, randString(TABLES[2], randomLength), '大写16进制')
44 addItem(items, randString(TABLES[3], randomLength), '16进制')
45
46
47 print(json.dumps({'items': items}))
48
49
50if __name__ == '__main__':
51 #wf = Workflow()
52 #sys.exit(wf.run(main))
53
54 main()
4. 调试及排错
刚开始写 Workflow
的时候难免会碰到问题,这时候就需要进行调试和排错了。首先可以找到 Workflow
的目录在哪里,这样就可以在命令行下执行自己写的脚本,看看结果怎么样。可以通过在Workflow
上点右键选择Open in Finder
,Open in Terminal
等功能找到脚本所在的目录。
另外,Alfred执行的时候会把输入输出内容都显示出来,可以通过Alfred
内置的控制台看到这些交互内容,方法是点击右上角的BUG
图标,就能够在打开控制台了。这时执行结果包括错误信息之类的都会显示在里面。