使用 Emacs 與 gah 套件實現可塑性運算
使用 Emacs 與 gah 套件實現可塑性運算 (Malleable Computing)
可塑性運算:賦予使用者自主權
可塑性運算是一種新的範式,軟體生產者提供的是構建模組而非僵化的成品,讓使用者能夠調整並重塑其數位工具,以符合其特定的工作流程。與供應商提供的軟體不同——後者為廣大受眾定義功能集——可塑性軟體允許消費者承擔產品定義的責任,透過重新組合現有的函式庫與程式,來創造所需的特定行為子集。
這種方法將開發重心從「為大眾 (N) 構建」轉向「為單一使用者 (1) 構建」。透過為單一使用者構建,開發者可以跳過廣泛錯誤處理、重用模組化以及正式發佈等繁瑣流程,迅速達到「足夠好用」的狀態。
個案研究:用於 GitHub 整合的 gah 套件
gah 套件是 Emacs 中可塑性運算的具體實現。它的創建是為了解决一個特定的摩擦點:手動將 GitHub issues 複製到 Org-mode 以便在 Org Agenda 中進行追蹤。
核心需求
為了避免使用功能完備的 GitHub 客戶端或複雜同步邏輯所帶來的開銷,gah 的設計目標如下:
- 無縫整合:將 GitHub issues(標題、描述、元數據)作為 Org 任務複製。
- 減少情境切換:在 Emacs 內完成大部分操作,而非在網頁瀏覽器中。
- Org 語法支援:使用 Org 語法表達想法與筆記。
- 基礎 GitHub Actions:創建新 issue 並在網頁瀏覽器中開啟現有 issue。
- 零認證開銷:將身份驗證委派給現有的系統工具。
技術規格
gah 利用 GitHub CLI (gh) 作為 REST 服務,將其視為與 GitHub 互動的主要介面。這種架構讓 Emacs 無需直接管理身份驗證。該工具集包含幾個專業組件:
- 使用者介面:使用
Transient套件處理選單,使用Variable Pitch Table (vtable)進行數據顯示。 - 轉換:採用
ox-gfm進行 Org 到 Markdown 的轉換,並使用Pandoc進行 Markdown 到 Org 的轉換。 - 數據處理:使用原生的 Elisp JSON 支援,將來自
ghCLI 的回應反序列化為 Elisp hash tables。
實作效率
其實作非常精簡,僅包含約 392 行程式碼。效率的一個關鍵範例是 gah-request-issues 函數,它透過結合指令列表、用於調度的 shell-command-to-string 以及用於反序列化的 json-parse-string,在不到 20 行程式碼內就完成了 issue 的檢索。
Emacs 的開發優勢
Emacs 作為一個動態程式設計環境,促進了可塑性運算的實現。由於 Elisp 是一種動態語言,且已載入的程式碼之間沒有隔離,使用者可以在運行中的會話中進行原型設計、求值並編排行為,而無需重啟應用程式。
開發者可以使用各種介面進行迭代,包括:
- Scratch buffers 與 Elisp 檔案
- Org source blocks
- IELM REPL、Eshell 或
eval-expression(M-:)
社群觀點與反對意見
雖然 gah 專案突顯了個人賦能的力量,但社群也注意到這種方法的一些細微差別:
- 現有的替代方案:部分使用者指出,對於類似的 GitHub 整合,已經存在如
Magit Forge等強大的解決方案。 - 「粗糙感」因素:可塑性運算的靈活性通常伴隨著一定程度的「vibeslop jank」,即工具對創作者來說功能完備,但缺乏專業軟體的精緻度。
- 技能差距:可塑性軟體需要一定程度的程式設計技能,這對非技術使用者來說可能是一個障礙,對他們而言「可塑性」可能被視為「複雜」。
- 同步挑戰:一些批評者認為,缺乏本地/遠端同步功能的工具在專業環境中的效用有限。
「我們工程師習慣於使用的工具是靈活的。只有當我們需要工具能被其他受眾接受時,它們才會變得更加受限。」
最終,gah 套件證明了一個概念:只要有適當的預期與高層次的抽象,使用者可以在一天內構建出高度特定且具備功能的工具——這在封閉、非可塑性的應用程式生態系統中是無法實現的。