本人习惯用 Golang 来写些小工具什么的,所以,这里以 Golang 为例子

方式

Alfred 的 workflow ,个人的理解就是在 Alfred 中输入,然后它会调用其他程序,将你的输入作为程序的输入,然后程序就负责处理并输出数据。

keyworkd input -> program with [input] paratemer -> result

例子:毫秒转换为 YYYY-MM-dd HH:mm:ss 的输出

package main

import (
	"time"
	"strconv"
	"github.com/emacsist/alfred3/utils"
)

const DATE_FORMAT  = "2006-01-02 15:04:05"

func main() {
	query := utils.GetQuery()

	response := utils.NewAlfredResponse()

	timestampInMillis, err := strconv.ParseInt(query, 10, 64)
	if err == nil {
		//毫秒转换为时间  Jan 2 15:04:05 2006 MST
		t := time.Unix(0, timestampInMillis*int64(time.Millisecond))
		dateTimeString := t.Format(DATE_FORMAT)
		response.AddDefaultItem("时间: " + dateTimeString)
	} else {
		// 时间 转换为毫秒
		t, err := time.Parse(DATE_FORMAT, query)
		if err == nil {
			seconds := t.Unix()
			ms := int64(t.Nanosecond()) / int64(time.Millisecond)

			response.AddDefaultItem("时间戳:" + strconv.FormatInt(int64(seconds), 10))
			response.AddDefaultItem("毫秒:" + strconv.FormatInt(ms, 10))
		} else {
			response.AddDefaultItem("输入的数据格式不对. 毫秒或 YYYY-MM-DD HH:mm:ss")
		}
	}
	response.WriteOutput()
}

解释

query: 就是我们的输入,这里对于各种编程语言应该是通用的,就是读取 main 函数的 argv 的参数出来。Alfred 会自动将我们的输入作为参数来调用我们这个程序的。

输出

从 Alfred3 开始,官方建议使用 JSON 的数据结构作为输出,则不是XML了。

输出的JSON数据结构:

{"items": [
    {
        "uid": "desktop",
        "type": "file",
        "title": "Desktop",
        "subtitle": "~/Desktop",
        "arg": "~/Desktop",
        "autocomplete": "Desktop",
        "icon": {
            "type": "fileicon",
            "path": "~/Desktop"
        }
    }
]}

字段解释

items: 表示输出的每一个元素的数组。最直观的,就是每一个项,就代表 Alfred 中输出的每一行。

img

  • uid: 每一行中,唯一的标识ID。只要唯一就可以了。

  • type: 表示类型

  • title: 标题

  • subtitle: 子标题

  • arg: 参数(这个要特别注意,这个最好要设置一下。该参数是传递给 output 链的。比如,将结果再输出到粘贴板、输出到通知中心,这时 Alfred 就会将 arg 参数的值传递给它们)

  • autocomplete: 自动补全

  • icon: 图标

img

参考资料

https://www.alfredapp.com/help/workflows/inputs/script-filter/json/