定製屬於自己的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);
        }
    }

相信自己動手後肯定能做出自己滿意的插件,如果有地方不懂的可以評論區問我

如果對你有幫助請:點贊-關注-評論 (謝謝)

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