iT邦幫忙

2025 iThome 鐵人賽

DAY 17
0

day16 的最後談到了,我們可以在 ~/.config/nvim/fnl 資料夾下,建立可以跟 Neovim 一起工作的插件。最關鍵的 Neovim Runtime 知識已經有了,那就開始一個新的 Hello World 吧!

Hello World 插件

規格概述

我們要建立一個 Hello World 插件,該插件它會在 Neovim 啟動時被初始化,且它會註冊一個 Ex 指令給 Neovim 。之後,使用者就可以使用 :HelloFennel 這個 Ex 指令。

實作

  • 前置準備,準備 nfnl 的設置檔。

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 的內容,在這個檔案,我們定義了兩個函數 hellosetup 。其中,hello 是用來做印出訊息的函數;而 setup 則是用來註冊 Ex 指令。

setup 裡, vim.api.nvim_create_user_commandNeovim 的 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 程式碼,同時,也透過實作,驗證了之前討論過的概念:

  • nfnl 插件如何自動將 Fennel 編譯成 Neovim 能讀懂的 Lua。
  • Neovim 利用 runtimepath 變數找到並載入編譯好的 Lua 模組。

於是,我們掌握了從無到有建立一個簡單 Neovim 插件的最精簡流程。


上一篇
Neovim 插件開發—起步
下一篇
Neovim 插件開發—標準插件
系列文
在 Neovim 中探索 Fennel 與函數式編程19
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言