auto-conjure 是我第一次開發 Neovim 插件的作品,也因此,它非常地簡單。
讀者在設定自己的第一個 Neovim 插件題目時,不妨問問自己,我的題目有沒有比 auto-conjure 困難得多?如果是的話,要不要先從更簡單的開始?
在使用 Conjure 來開發 ClojureScript 時,我必須要下一個指令 :ConjureShadowSelect [build-id]
才能啟動 ClojureScript 的互動式開發模式 (interactive development),偏偏這個指令我常常忘記。還有,每次要下這個指令,都要專程去打開一個 shadow-cljs.edn 檔來找 [build-id]
也滿煩人的。
有一天,我發現了別人似乎也有相同的問題,於是,他提了一個基於 Neovim 自動命令 (auto command) 的解決方案:
" define a function `AutoConjureSelect` to auto select
function! AutoConjureSelect()
let shadow_build=system("ps aux | grep 'shadow-cljs watch' | head -1 | sed -E 's/.*?shadow-cljs watch //' | tr -d '\n'")
let cmd='ConjureShadowSelect ' . shadow_build
execute cmd
endfunction
command! AutoConjureSelect call AutoConjureSelect()
" trigger the function `AutoConjureSelect` whenever you open a cljs file.
autocmd BufReadPost *.cljs :AutoConjureSelect
該解法會透過監看 shadow-cljs 這個程序 (process) 的輸出,從而取得 [build-id]
,進而生成正確的指令。
很可惜,這個解法在我的電腦上不太成功,應該是因為作業系統的差異。所以我自己改了一個 Babashka script 來取代上述解法裡的 system(...)
。
#!/usr/bin/env bb
(require '[clojure.edn :as edn])
(require '[clojure.java.io :as io])
(def shadow-config (edn/read-string (slurp (io/file "shadow-cljs.edn"))))
(def build-ids (map name (keys (:builds shadow-config)))) ;; 轉換成字串
(print (first build-ids))
而 Babashka script 一旦可以改成 Fennel 的話,我的編輯器設置就可以完全只依賴於 Neovim runtime ,不用再多依賴一個 Babashka runtime 。
一開始就想著,那就把 Babashka script 翻譯成 Fennel 吧。畢竟 Babashka 也是 Clojure-inspired Lisp ,語法與 Fennel 有七成像。
然後,就遇上了一個問題:Fennel 並沒有解析 EDN 格式的函式庫。
幸運的事情是,不久,我就找到了 Ray Stubbs 發表的一個 Lua 語言寫的解析 EDN 格式的函式庫。
理想的起步專案應該小到可以先用其他語言實作一次,然後再從翻譯的過程之中學習 Fennel 與 Neovim 插件開發。
第一步踏出了,之後就簡單多了。