在 day16 的最後談到了,我們可以在 ~/.config/nvim/fnl
資料夾下,建立可以跟 Neovim 一起工作的插件。最關鍵的 Neovim Runtime 知識已經有了,那就開始一個新的 Hello World 吧!
我們要建立一個 Hello World 插件,該插件它會在 Neovim 啟動時被初始化,且它會註冊一個 Ex 指令給 Neovim 。之後,使用者就可以使用 :HelloFennel
這個 Ex 指令。
echo "{}" > ~/.config/nvim/.nfnl.fnl
有了這個設置檔之後,nfnl 的自動編譯功能就可以啟用。詳細說明可參考 nfnl 的 README。
mkdir ~/.config/nvim/fnl
~/.config/nvim/fnl/hello.fnl
,檔案內容如下:(fn hello []
(print "Hello World Fennel!"))
(fn setup []
(vim.api.nvim_create_user_command
:HelloFennel
hello
{}))
;; 將 setup 函式對外匯出,讓 init.vim 可以呼叫
{: setup}
~/.config/nvim/init.vim
檔,在其中增加一行:lua require("hello").setup()
當你儲存 hello.fnl
檔案時,nfnl
會自動將它編譯成 ~/.config/nvim/lua/hello.lua
。
重新啟動 Neovim 之後,下一個 Ex 指令 :HelloFennel
,就會看到 Hello World Fennel!
的訊息在底部印出了。
首先是 hello.fnl
的內容,在這個檔案,我們定義了兩個函數 hello
和 setup
。其中,hello
是用來做印出訊息的函數;而 setup
則是用來註冊 Ex 指令。
在 setup
裡, vim.api.nvim_create_user_command
是 Neovim 的 API 。該 API 的第一個參數是 Ex 指令的名稱;第二個參數是 Ex 指令要執行函數;第三個參數是要傳給函數的參數 (Lua Table 的資料型態)。
在 hello.fnl
的結尾,照慣例要寫一個 Lua Table ,裡頭放的這個 hello 模組的對外 API 。在這個例子裡,顯然是 setup
。
當 Neovim 啟動時,它會先去讀取 init.vim
,而當它讀到指令 lua require("hello").setup()
時,會去 ~/.config/nvim/lua/
資料夾尋找 hello.lua
檔並載入。接著,該檔案裡 setup
函數就會執行,並且註冊 :HelloFennel
指令。
在本篇中,我們成功地完成了第一個 Fennel 插件的「Hello World」。我們不僅親手建立了專案結構、編寫了簡單的 Fennel 程式碼,同時,也透過實作,驗證了之前討論過的概念:
runtimepath
變數找到並載入編譯好的 Lua 模組。於是,我們掌握了從無到有建立一個簡單 Neovim 插件的最精簡流程。