效率啟動器是一類工具的總稱,主要方便通過鍵盤操作快速檢索信息、開啟應用、甚至完成一系列自定義工作流。Mac 上的 Spotlight 搜索實際上可以看作是系統自帶的效率啟動器,默認情況下你可以通過 + 空格鍵快速喚出,並執行文件搜索、天氣查詢、詞典查詢、計算器等一系列方便實用的操作。
Spotlight 詞典查詢
不過 Spotlight 正如它的名字一樣,功能更偏重於搜索。相比之下,Mac 上最具代表性的第三方效率啟動器 Alfred 和 LaunchBar 則擁有更強大的功能。特別是第三方效率啟動器支持的腳本功能,能夠實現大量的自定義操作。
Alfred 的腳本通過 Workflows 功能中的 Run Script Action 執行,支持 Bash、PHP、Ruby、Python、Perl、AppleScript 和 JavaScript 等多種語言。
Alfred Workflows 示例
同樣,LaunchBar 也支持 Bash、Ruby、Python、Swift、AppleScript 和 JavaScript 等常用的腳本語言,並通過 Action Editor 進行管理。
Action Editor 界面
相比之下,Raycast 支持的腳本語言最少,目前只支持 Bash、Swift、AppleScript 等 3 種。對腳本語言支持較少是 Raycast 目前的劣勢,但相比之下 Raycast 創建和管理腳本的方式最為簡潔,入門成本最低。
創建腳本
使用 Raycast 創建一個腳本非常簡單,沒有 Alfred 和 LaunchBar 複雜流程和選項,只需要在 Raycast 中搜索 Create Script Command 命令即可。
通過命令新建自定義腳本
接下來,你會進入到創建腳本的引導界面。此時,需要選擇腳本語言和運行模式,並輸入腳本名稱和腳本描述。界面中還有 2 個複選框,分別是運行腳本前需確認、以及腳本支持傳入參數的選項。
自定義腳本模版初始化
點擊右下角的 Create Script 創建並保存腳本。此時,非常建議大家在 iCloud Drive 或者你其它常用的雲同步應用中新建一個名為 Raycast Scripts 的文件夾用於存放腳本。這會極大地方便你在不同設備之間同步創建的自定義腳本。
保存自定義腳本到指定目錄
創建完成之後,使用編輯器打開相應的腳本文件,你會看到 Raycast 創建好的腳本模板。
#!/bin/bash# Required parameters:# @raycast.schemaVersion 1# @raycast.title Echo SSPAI# @raycast.mode compact# Optional parameters:# @raycast.icon echo "Hello World!"
上面是一個簡單的 Bash 腳本,通過 echo 命令支持列印出 Hello World! 字符串。其中,注釋掉的部分是腳本配置項。其中包含參數:
schemaVersion:架構版本,Raycast 預留為將來 API 的變化做準備。目前只有第 1 版。
title:腳本名稱,初始化腳本時填入的名稱,支持在腳本中直接修改。
mode:運行模式,目前 Raycast 支持 3 種運行模式,下文中會介紹。
icon:腳本顯示圖標,支持 Emoji 或者絕對路徑引用本地圖片。
此外,Raycast 腳本還支持的配置參數有:
argument:腳本支持參數傳入。
needsConfirmation:運行前是否需要二次確認。
packageName:作為副標題顯示的名稱。當沒有提供時,名稱將使用腳本文件名。
iconDark:和 icon 參數一樣,用於配置明亮和暗色主題不同的圖標。
refreshTime:腳本運行在 inline 模式下的刷新時間。
currentDirectoryPath:自定義腳本執行路徑,默認在腳本存放路徑。
author:作者名稱。
authorURL:作者連結。
description:腳本描述信息。
運行模式
@raycast.mode 參數所支持配置的腳本運行模式是 Raycast 腳本功能中最為值得一提的特性,目前支持:
fullOutput:命令在單獨的視圖中列印整個輸出。
compact:命令在 Raycast 窗口下方運行並列印結果。
silent: 命令關閉 Raycast 窗口並在後臺運行。
inline:將腳本設置為以刷新儀錶板的方式顯示,支持配置參數 refreshTime。
默認情況下,Raycast 的腳本運行模式為 compact,即在窗口下方顯示運行狀態和列印輸出結果。例如上方的示例腳本採用 compact 模式執行之後的效果如下,呈現在左下角的小窗口是否簡潔,同時還能展示較少的關鍵信息。
compact 模式顯示效果
fullOutput 模式則適合腳本輸出信息較多的情況,因為 compact 顯示的信息長度有限。例如在一個支持 Ping 服務的腳本中,需要列印較多的信息,那麼這些信息則會在單獨的窗口中顯示出來。
支持 Ping 伺服器的自定義腳本
silent 模式很好理解,即腳本在後臺靜默執行,例如下面清空廢紙簍 Empty Trash 的腳本中,我們不需要列印任何輸出,只需要腳本執行即可。
silent 模式下不會展示任何輸出
Empty Trash 的腳本源碼如下:
#!/usr/bin/osascript# Required parameters:# @raycast.schemaVersion 1# @raycast.title Empty Trash# @raycast.mode silent# @raycast.packageName System# Optional parameters:# @raycast.icon # Documentation:# @raycast.description Empty the trash.tell application "Finder" to empty trash
inline 則直接在 Raycast 窗口中顯示腳本輸出信息。該模式下,我們不需要回車執行腳本,而腳本支持配置 refreshTime 參數支持固定頻率刷新,並將輸出信息緩存在 Raycast 界面中。
inline 模式直接在界面展示信息
例如上方顯示系統 CPU 和內存佔用信息的腳本中,代碼配置了 5s 刷新一次。這種模式下,我們期望少量的信息直觀呈現,而不需要多餘的交互。
#!/bin/bash# Required parameters:# @raycast.schemaVersion 1# @raycast.title System Activity# @raycast.mode inline# @raycast.refreshTime 5s# @raycast.packageName Dashboard# Optional parameters:# @raycast.icon cpu_mem=$(ps -A -o %cpu,%mem | awk '{ cpu += $1; mem += $2} END {print "CPU: "cpu"% MEM: "mem"%"}')echo "${cpu_mem}"
總之,Raycast 提供的四種運行模式各有適用場景:
fullOutput 模式:適合腳本輸出信息較多的場景,展示美觀。
compact 模式:適合腳本輸出信息較少的場景,簡約大方。
silent 模式:適合腳本無輸出信息的場景,後臺靜默執行。
inline 模式:適合腳本輸出信息需要直觀展示的情形。
參數輸入
Raycast 1.2 版本中,自定義腳本正式支持傳入參數,這是裡程碑式的特性。之前不能傳參的腳本功能更為死板,沒有可交互的能力。而支持參數輸入之後,你就可以打造更多更有意思的腳本。
腳本傳入參數的方式非常簡單,只需要在腳本中添加參數配置項即可。例如上方演示的 Ping 腳本中,其支持通過參數輸入需要 Ping 的域名或伺服器地址,所以我們可以輸入 sspai.com 測試相應的 Ping 值。
#!/bin/bash# @raycast.title Ping# @raycast.author Caleb Stauffer# @raycast.authorURL https://github.com/crstauf# @raycast.description Ping an IP address or URL.# @raycast.icon # @raycast.mode fullOutput# @raycast.packageName Internet# @raycast.schemaVersion 1# @raycast.argument1 { "type": "text", "placeholder": "URL or IP address" }ping -i 0.25 -t 3 "$1"
腳本代碼中的 argument1 即為支持的第一個參數,而後方的字典配置項中支持定義參數的默認類型和佔位提示信息。如果你的腳本需要傳入多個參數,則可以使用 argument2 這樣羅馬數字遞增的方式,添加更多的參數配置項目即可。
而在 Bash 腳本中,我們只需要使用腳本內獲取參數的標準格式 $N 即可獲取參數值。
Python 腳本
目前,Raycast 僅支持 Bash、Swift、AppleScript 等 3 種腳本語言。如今是全民學 Python 的時代,尚不支持如此「時髦」的語言有點說不過去了。
但實際上,只要我們的腳本能夠通過命令行運行,都可以結合 Bash 採用曲線救國的方式來編寫腳本代碼,在 Raycast 腳本中運行 Python 代碼自然可行。
例如上方的 Hello World 代碼中,我們除了可以使用 Bash 支持的 Echo 命令直接列印信息,還可以結合 Python 來列印輸出。
#!/bin/bash# Required parameters:# @raycast.schemaVersion 1# @raycast.title Echo SSPAI# @raycast.mode fullOutput# Optional parameters:# @raycast.icon # 方法 1:使用 Bash 執行echo "Bash: Hello World!"# 方法 2:使用 Python 輸出結合 Bash 執行echo $(python -c "print('Python: Hello,World.')")
運行輸出如下:
2 種方法下的輸出信息
再例如,我之前分享過一個《Setapp 設備一鍵解綁 LaunchBar 動作》,該動作用於一鍵刪除 Setapp 登錄設備,方便登錄設備超出限額時使用。這個 LaunchBar Action 是通過 Python 代碼實現。那麼如果將其轉寫成 Raycast 腳本,實際上也非常簡單。
首先,我們在 Raycast 腳本目錄中單獨創建一個 Python 腳本文件,比如命名為 delete-setapp.py。下面的代碼中,我們可以在 Python 腳本中基於 Setapp 提供的 API 來刪除已登錄的設備。
import jsonimport requests# 配置 Setapp 登錄名和密碼EMAIL = "郵箱"PASSWORD = "密碼"def auth(): """獲取 token """ response = requests.post( url="https://user-api.setapp.com/v1/auth", headers={ "Accept": "application/json", "Content-Type": "text/plain; charset=utf-8", }, # 請在此處填入用戶名和密碼 data=json.dumps( {"email": EMAIL, "password": PASSWORD, "remember": True}) ) token = response.json()['data']['token'] return token def delete(): """刪除用戶 """ try: token = auth() headers = { "Authorization": f"Token {token}", "Content-Type": "application/json", "Accept": "application/json", } devices = requests.get( url="https://user-api.setapp.com/v1/devices", headers=headers).json() if len(devices['data']) == 0: return "無在線設備" else: device_id = devices['data'][0]['id'] r = requests.delete( f'https://user-api.setapp.com/v1/devices/{device_id}', headers=headers) if r.status_code == 204: return f'成功刪除設備 {device_id}' else: return f'刪除失敗,返回值 {r.status_code}' except: return '請求失敗' if __name__ == "__main__": print(delete())
接下來,我們基於 Bash 創建一個 Raycast 腳本,其中只需要添加一行 echo 命令將 Python 腳本執行的返回結果列印輸出即可。
#!/bin/bash# Required parameters:# @raycast.schemaVersion 1# @raycast.title Delete Setapp Device# @raycast.mode compact# Optional parameters:# @raycast.author huhuhang# @raycast.authorURL https://github.com/huhuhang# @raycast.icon icons/delete.png# @raycast.packageName Delete Setapp Deviceecho $(python delete-setapp.py)
最後,在 Raycast 中執行該腳本即可看到運行結果。
使用 compact 模式刪除 Setapp 設備
雖然 Raycast 目前官方支持的腳本語言不如 Alfred 和 LaunchBar 多,但理論上你均可以使用 Bash 實現曲線救國方案,結合你自己熟悉的腳本語言來實現更多自定義操作。
腳本管理
效率啟動器的腳本管理是繞不開的話題。以我熟悉的 LaunchBar 為例,創建和管理腳本都需要依賴於 Action Editor 功能。雖然我長期使用 LaunchBar,但卻對其管理腳本的方式並不滿意,因為它太複雜了。
如下圖所示,實際上到目前為止我都不知道 Action Editor 中的一部分功能和選項是什麼意思。例如界面中的 Default Script,Suggestions Script,Action URL Script 三者有何區別、該怎樣使用?雖然我知道 LaunchBar 官方應該提供了相應的說明文檔,但是其對於普通用戶而言,上手門檻實在太高了。我相信很多人應該和我一樣,看到這個複雜界面的時候就已經頭大了。
LaunchBar 複雜的腳本管理界面
相比之下,Raycast 的腳本管理界面就簡潔很多。因為其支持直接從文件夾中加載包含的全部腳本。還記得我在文章一開始提到推薦大家在 iCloud Drive 或者你其他常用的雲同步應用中新建一個名為 Raycast Scripts 的文件夾用於存放腳本嗎?如果你這樣做,只需要在 Raycast 設置中關聯相應的文件夾即可加載文件夾下的全部腳本。
Raycast 的腳本管理界面
如果有需要的話,你還可以將不同類型的腳本存放在不同的文件夾中,Raycast 支持關聯多個文件夾,並實現腳本的自動 Reload,即在腳本代碼更新之後自動更新,保證 Raycast 會執行最新的腳本。
如果你習慣使用 Git,那麼對創建的腳本進行版本管理也就十分方便了,直接在腳本文件夾中初始化 Git 倉庫即可。
腳本推薦
除了我文章中提到的部分腳本,目前 Raycast 官方維護了一個 GitHub 腳本倉庫用於分享 社區開發的實用腳本。雖然 Raycast 的社區腳本共享量還遠不如 Alfred 和 LaunchBar,但由於 Raycast 本身的定位就是開發人員,隨著用戶越來越多,相信也會有更多實用的腳本被分享出來。
自定義腳本解決的核心需求往往並不具有普適性,所以我個人經常使用的腳本無法分享出來,因為僅和自己所做的事情有關,用於提升我個人的工作效率。授人以魚不如授人以漁,如果你期望用好 Raycast 或者其他效率啟動器的腳本功能,可以嘗試學習 Bash 或者 Python 等任意一種腳本語言,實際上掌握基礎語法寫一個簡單腳本並不困難,網絡上免費的學習資源也非常豐富。
如果你想了解 Raycast 作為效率啟動器的基礎功能,可以 搜索並閱讀相關文章。目前,Raycast 完全免費,可以 前往官網下載 使用。
> 下載少數派 客戶端、關注 少數派公眾號,發現更多實用 App
> 年度回顧、好物推薦…… 更多精彩盡在少數派 2020 年度盤點
本文著作權歸作者所有,並授權少數派獨家使用,未經少數派許可,不得轉載使用。