iT邦幫忙

2025 iThome 鐵人賽

DAY 19
0

有兩種 Runtime 的知識,對於除錯特別有用:

  1. 如何檢查 Runtime 的內部狀態?
  2. Runtime 內部的執行順序為何?

檢查內部狀態

有幾種方法可以幫助你檢查 Neovim 的內部狀態,這對於除錯非常關鍵。

:lua 命令

你可以直接在命令列中使用 :lua 執行 Lua 程式碼。這是一個非常方便的 Ex 命令,特別適合用來快速測試幾行程式碼或檢查變數值。

舉例來說,當你想要確認一個 Lua 模組是否成功載入時,可以下指令:

:lua print(require('module.name'))

如果模組載入成功,require 函數會回傳該模組的 table,然後 :lua print(...) 就會印出這個 Table 的記憶體位址(例如:table: 0x...)。如果模組不存在,require 會拋出錯誤。這是一種簡單但有效的驗證方法。

檢視輸出

當 Neovim 運行時,所有由 print, vim.notify 等函數產生的輸出都會被記錄下來。你可以用以下的 Ex 指令來這些歷史訊息。

:messages

處理 Lua Table 輸出

當你直接使用 print 函數來輸出一個 Lua Table 時,你通常只會看到類似 table: 0x... 的記憶體位址,而無法看到具體的內容。這在除錯時會造成很大的困擾。

為了解決這個問題,你可以使用 Neovim 內建的 vim.inspect 函數,它能將任何 Lua 值(特別是 Table)轉換成易於閱讀的字串格式。這是一個在除錯時非常實用的工具,而且不需要額外安裝任何插件。

舉例來說,你可以在 Ex 指令中使用或在 Fennel 程式碼中使用它:

  • 在 Ex 指令中使用
:lua print(vim.inspect({a = 5, b = "hello"}))
-- 輸出結果會是:
-- { a = 5, b = 'hello' }
  • 在 Fennel 程式碼中使用
(vim.inspect {:a 5 :b "hello"})

內部的執行順序

在 Neovim 插件開發中,理解檔案的載入順序對於除錯和正確配置插件至關重要。以下是幾種常見的插件初始化方式及其差異。

plugin

plugin/ 目錄下的文件會在 Neovim 啟動時立即載入,不論你開啟的是什麼類型的文件。這類文件通常用於設定全域的快捷鍵、命令或自動指令(autocmd),這些配置應該在任何時候都有效。

ftplugin (Filetype Plugin)

ftplugin/ 目錄下的文件只會在 Neovim 識別出特定檔案類型(filetype)時才載入。例如,~/.config/nvim/ftplugin/lua.lua 只會在編輯 Lua 檔案時被執行。這類文件適合用於設定與特定語言相關的快捷鍵、當前緩衝區選項(buffer-local options)或自動指令。

after/plugin

after/plugin/ 目錄下的文件會在 plugin/ 目錄下的文件載入完成後才執行。這是一個非常重要的概念,它提供了一個覆蓋(override)或修改其他插件設定的機制。

舉例來說,如果你想修改某個插件在 plugin/ 目錄中設定的全域快捷鍵,你可以在 after/plugin/ 目錄中建立一個文件來重新定義它。這樣可以確保你的設定是在該插件的預設設定之後才被載入,從而成功覆寫掉它。

簡單來說,plugin 是用於全域設定,ftplugin 則針對特定檔案類型,而 after/plugin 則是提供一個在所有預設插件載入後,進行客製化或覆蓋設定的機會。理解這個執行順序,能幫助你更有效地管理和除錯你的 Neovim 配置。

小結

有效的 Neovim 插件除錯主要依賴兩大知識:檢查內部狀態理解執行順序

當然,Neovim 的檢查內部狀態指令不會只有上述的這些,還有許多其它的指令。同理,內部的執行順序也還有許多的變化。

將上述概念融入你的開發流程,並搭配查閱官方文件,相信除錯會變得更輕鬆。


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

尚未有邦友留言

立即登入留言