喜欢去探索各种效率工具,自然离不开alfred。alfred可以完成很多事情,其中包括打开各种app,搜索文件,搜索引擎等太多了。
这篇文章主要是记录 关于 Alfred的workflow的开发
alfred 插件开发概述
Workflow 是alfred2.0推出的最激动人心的特性, 通过与脚本语言的交互,workflow可以支持任意操作,把您日常的重复性事务封装在脚本中,大大的提高工作效率。
Workflow 支持php、bash、perl、ruby以及python作为脚本语言,并内置脚本语言解释器,并通过stdio的形式在各个脚本模块中传递参数。
在代码中插入 {query}块可以接收上一个脚本输出的内容。形成完整的控制链条。 最后由alfred输出至 Output 模块, 在Output模块中, 我们可以启动浏览器、将内容复制到剪切板、 启动通知中心、甚至执行bash脚本。
在日常的使用中,我们通常通过关键字来调用某一模块,例如“find xxx” 即是调用find内建模块 query内容为xxx。 在workflow的开发中, 开发者可以自定义自己编写模块的关键字,只要不与其他模块冲突即可。
在workflow的结构中,数据流通过alfred的控制线进行传递,每一个脚本模块的STDIO输出会被alfred替换到 下一个脚本的{query}块中。
创建一个新的workflow
- 首先点击workflow
- 创建一个workflow
然后图里的主要是Bundle Id ,主要就是唯一、description等这些看自己,都是一些无关键要的东西。可以简单对你的脚本进行描述或者是一个良好的命名或者也行了。
创建一个带有输入参数得workflow
然后就是选中之前创建的workflow。在右侧选中input,如下图所示。比如我们这里是创建一个关于时间戳转换的脚本,可以选择input里的Script Filter
然后出来以下这个界面,keyword就是唤醒的关键键。
如果这里是Python脚本的话,language这里是要选择/bin/zsh的,然后如果你的脚本是需要输入参数的话。后面要跟上wtih input as {query},如果你的脚步完全不依赖于外部库的话,也是可以直接在这里写的
然后 Script 这里的话是需要写你运行的脚本的路径
然后打开上图中 问号旁边的文件夹,会看到这样一个文件。接下来要做的事情就是要把python3有关的workflow代码放在这里去。
这里有一个不小的坑,然后网上大部分帖子都是粘贴复制,所以很多都还是n多年前复制过来的,因为原始仓库里只有python2的代码,python3不支持部分库了,所以我是根据 这里的一个仓库,clone下来后,其实只需要workflow里的代码就行。所以最终你会看到这样一个目录
另外附上t.py里的代码
代码语言:javascript复制import requests
import re
import sys
from datetime import datetime
from workflow import Workflow3
S = requests.Session()
REGEXP_TIMESTAMP = r'^d $'
def convert_timestamp_to_datetime(timestamp):
try:
timestamp = int(timestamp)
dt_object = datetime.utcfromtimestamp(timestamp)
return dt_object.strftime('%Y-%m-%d %H:%M:%S')
except ValueError:
return "Invalid timestamp"
def generate_feedback_results(judge_code, result):
wf = Workflow3()
if judge_code == 1:
kwargs = {
'title': result,
'subtitle': '',
"valid": True,
'arg': result
}
else:
kwargs = {
'title': result,
'subtitle': '',
'valid': False
}
wf.add_item(**kwargs)
wf.send_feedback()
def main():
timestamp = sys.argv[1]
if len(re.findall(REGEXP_TIMESTAMP, timestamp)) > 0:
result = convert_timestamp_to_datetime(timestamp)
generate_feedback_results(1, result)
else:
generate_feedback_results(0, "Invalid timestamp")
if __name__ == "__main__":
main()
然后效果大概就是这样了
其实类似于这些的话也能在python里通过参数来实现,也就是终端,但是如果是多方的一些东西的话,可能还是借助于该工具比较好
创建一个带有无参数得workflow
然后可能也有会有这样的需求,比如根据python处理后的结果,然后需要自动把这个结果比如复制到粘贴板里面去。然后就这样这样做
选择一个outputs,然后再选择copy to clipboard 。
这样输入now的时候,就会自动显示时间戳还能复制到粘贴板里面去了
从debug里的日志也能看出来
debug 模式
当然在创建workflow的过程中,还是比较顺畅的,如果要开启debug模式也很简单。
这里就能完美开启了
其他
比如在项目中会经常用ide打开某一些开发的应用,也可以一套流程下来。一键启动打开。如果大家有啥好玩的workflow也可以交流交流
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!