Bryan

Bryan

twitter
medium

使用 TypeScript 撰寫 OmniFocus 腳本

OmniFocus 4 即將發布!在我多年管理我的待辦的過程中,我嘗試過 Todoist、滴答清單、Things、Sorted 等等幾乎所有市面上的 TODO 軟體,但最終,OmniFocus 終成我一直以來的最終選擇。而談及 OmniFocus 的強大性,不得不提的就是他強大的自動化能力 —— Omni Automation

Omni Automation 實際上是基於 JS 腳本的,而編寫純 JS 腳本的過程…… 一言難盡。雖然 Omni Automation 官方提供了 TypeScript 的定義文件,但一方面難以做好類型檢查,另一方面其詳盡程度仍有待提升(長久不更新、大量使用 any 等),此外,由於缺乏打包工具,代碼邏輯的複用也顯得頗為困難(我甚至很長一段時間都是靠著 Mac 版本 OmniFocus 的一個 bug 實現的邏輯複用)。

為了慶祝 OmniFocus 4 的面世,我決定將我個人開發並使用的方案整理開源,包括打包腳本和類型定義,還有我使用的一些工具函數及腳本,希望可以讓更多人能夠愉快地編寫 OmniFocus Script。

使用#

  1. 使用此模板創建一個倉庫
  2. 克隆你創建的倉庫
  3. 運行 pnpm install 安裝依賴項
  4. 運行 pnpm build 構建腳本

腳本源碼放在 src 目錄中,編譯結果(可被 OmniFocus Scripts 使用的)放在 dist 目錄中。

撰寫腳本#

src 目錄內的任何不以 _ 開頭的 TypeScript 文件都將被視為 OmniFocus 腳本並編譯(_ 開頭的腳本文件被保留用於工具函數)。

任何腳本都必須遵循以下模式:

export const action = new PlugIn.Action(function (selection) {
  // do anything you want
});

action.validate = function (selection) {
  // do anything you want
};

export const meta: Meta = {
  label: "...",
  description: "...",
  identifier: "...",
  author: "...",
  version: "0.1",
};

其中:

  1. actionmeta 是必需的,action.validate 是可選的
  2. meta 必須是腳本的最後一部分。它之後不可以有任何內容。

構建與使用#

運行 pnpm build,構建後的腳本(以 .omnifocusjs 結尾)將被放置在 dist 目錄下。

你可以直接將 dist 目錄中的腳本拷貝到 OmniFocus 的腳本目錄,也可以利用腳本進行同步。

如果你使用 iCloud 保存 OmniFocus 腳本,可以直接使用 pnpm sync 自動將構建好的腳本同步到 iCloud 中的 OmniFocus 腳本目錄;如果你不使用 iCloud 而是使用了自定義路徑,可修改 sync.sh 文件改變目標路徑。

End#

此方案我個人已用一年有餘,但一方面開源版本可能有些錯誤,另一方面可能有更多的定制化需求。

歡迎進入 倉庫 頁面提交 Issue 和 PR!

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。