定制属于自己的Alfred Workflow插件案例(超级详细)

前言

很多人mac上都安装了Alfred这款软件,这款软件称之为效率神器,怎么形容这个软件呢?我个人认为他就是一个完全定制化的搜索框,一个搜索框能做你想做的所有事情,那么大家在用Alfred这款软件也肯定会装各式各样的Alfred workflow插件(这个是高级收费版才有,相信大家有办法),但是有没有想过,这个插件到底怎么开发的呢,或者说当自己的需求网上找不到类似的插件怎么办呢? 本人刚好就有类似的需求,下文用这个案例来讲解,怎么定制属于自己的Alfred Workflow!

需求

本人有很多小工具,都是需要用命令行来启动,比如jadx,那现在就是想通过在Alfred里面通过快捷键弹出所有工具,这样省得每次都要输一长串命令,如下图:
在这里插入图片描述

需求分析

  1. 怎么增加一个自己的Alfred Workflow插件
  2. 怎么设置Alfred Workflow的快捷键
  3. 既然要弹出这么多个item,肯定要告诉Alfred,每个条目的标题,描述,图标,执行的命令
  4. 选择一个item后,怎么执行这个item

增加一个Alfred Workflow

首先打开Alfred的设置页面,然后进入到Workflow选择下图的➕ ,然后选择blank workflow说明是一个空的(提示:其实这里是有很多模板的,我们选择一个空workflow是为了学习用)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
完成后会显示一个自己定义的插件:如图
在这里插入图片描述

设置快捷键,输入后可以显示多个条目

一个插件就是由很多脚本程序组合而成的,脚本的类型很多,这里就不一一举例,只说明用到的脚本类型,在自己脚本黑色区域右键鼠标 -> 选择Inputs -> Script Filer -> 设置脚本
在这里插入图片描述
图2
脚本的大概意思是: 添加一个输入脚本,脚本的语言用php,关键词用tool

上面我们用到了本地的php文件,那么可以通过右键插件选择open in finder打开插件的目录,创建这个php文件,如果用其他语言也一样,创建其他语言的文件执行,甚至可以直接将代码写到输入框里面
在这里插入图片描述

要想显示item需要脚本返回特定格式的数据给插件,既然用的php,我们知道返回数据是用echo “xxx”,下面我们就展示应该返回的数据结构

举例:

{
  "items": [
    {
      "uid": "Android Device Monitor",
      "title": "Android Device Monitor",
      "subtitle": "open Android Device Monitor",
      "arg": "nohup \/Users\/fuheng\/Library\/Android\/sdk\/tools\/monitor  > \/dev\/null &",
      "icon": {
        "path": "\/Users\/fuheng\/tool\/clipboardTool.jar",
        "type": "fileicon"
      },
      "valid": true,
      "type": "default",
    }
  ]
}
参数 解释
items 数组的节点名
uid item的id
title 标题
subtitle 子标题
arg 参数
icon 图标
valid 该item是否是可执行
type 类型

我们只要返回这样的数据结构给脚本,就会自动识别,显示items下面数组的条目,具体是怎么返回,就看自己做什么,也可以什么都不做直接返回一个死数据.

右上角有个小瓢虫,可以显示出返回的数据
在这里插入图片描述

选择一个item后,执行这个item

看到这里那么我们第一个输入脚本已经写好了,我们需要加一个执行脚本,执行我们传过来的参数,我们右键(如图)Actions -> Run Script -> 设置脚本
在这里插入图片描述
在这里插入图片描述
然后将两个脚本连起来
在这里插入图片描述

脚本的大概意思就是: 添加了一个执行脚本, 使用bash语言,并且执行传过来的参数

注意

当我们输入指定的关键词时,搜索框就会显示插件名称,输入完插件关键词加上空格之后的就是参数,输入参数时,每输入一个字母都会调用脚本,所以我们可以匹配输入的参数显示合适的item,如图
在这里插入图片描述
其实代码很简单,就是在添加item的时候加了个参数判断

function addToolItem($query, $name, $subtitle, $shell) {
        if (empty($query) || self::startWith($name, $query)) {
            $item = new Item();
            ...
            $this->addItem($item);
        }
    }

相信自己动手后肯定能做出自己满意的插件,如果有地方不懂的可以评论区问我

如果对你有帮助请:点赞-关注-评论 (谢谢)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章