iT邦幫忙

2025 iThome 鐵人賽

DAY 20
0

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 插件開發。

第一步踏出了,之後就簡單多了。


上一篇
Neovim 插件開發—如何除錯?
下一篇
專案研討—Conjure Piglet Client
系列文
在 Neovim 中探索 Fennel 與函數式編程21
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言