本文介紹清風之戀的 neovim 配置架構, 以及如何使用 Lazy 插件管理器
配置架构
我的配置架構如下
│
├── ftplugin -- 加載特定類型的文件補丁選項
│ ├── css.lua
│ ├── javascript.lua
│ ├── json.lua
│ ├── make.lua
│ ├── scss.lua
│ ├── typescript.lua
│ └── typescriptreact.lua
├── init.lua
├── lazy-lock.json
├── lsp -- lsp 配置
│ ├── clangd.lua
│ ├── clice.lua
│ ├── lua_ls.lua
│ ├── neocmake.lua
│ ├── pyright.lua
│ └── rust_analyzer.lua
├── lua
│ ├── config -- 自己編寫的模塊, 也許應該叫 `module` ?
│ │ ├── autocmd.lua
│ │ ├── diagnostics.lua
│ │ ├── keymaps.lua
│ │ ├── lsp.lua
│ │ ├── options.lua
│ │ ├── pairs.lua
│ │ ├── preload.lua
│ │ └── ssh_mode.lua
│ └── plugins -- 插件配置
│ ├── blankline.lua
│ ├── blinkcmp.lua
│ ├── color-preview.lua
│ ├── colorscheme.lua
│ ├── comment.lua
│ ├── dashboard.lua
│ ├── explorer.lua
│ ├── format.lua
│ ├── gitsigns.lua
│ ├── heirline.lua
│ ├── icons.lua
│ ├── im-switch.lua
│ ├── layout.lua
│ ├── lsp-installer.lua
│ ├── markdown.lua
│ ├── noice.lua
│ ├── notify.lua
│ ├── outline.lua
│ ├── tabline.lua
│ ├── telescope.lua
│ ├── terminal.lua
│ ├── tree-sitter.lua
│ └── which-key.lua
...
部分插件配置
文件樹
採用neo-tree實現,可以使用tab鍵切換查看開啟的 buffer 位置以及 git 狀態
close_if_last_window = true, -- NOTE: 这里设置防止关闭所有 buffer 之后只剩下 neo-tree
enable_git_status = true,
enable_diagnostics = true,
sources = { 'filesystem', 'buffers', 'git_status' },
source_selector = {
winbar = true,
statusline = false,
show_separator_on_edge = true,
separator = { left = ' ', right = '' },
sources = {
{ source = 'filesystem', display_name = ' Files' },
{ source = 'buffers', display_name = ' Buf' },
{ source = 'git_status', display_name = ' Git ' },
},
},
在退出 buffer 的時候 close_if_last_window 設定可能導致關閉 buffer 的時候 neovim 立即退出. 因此需要將關閉單個 buffer
的鍵位進行映射:
vim.keymap.set(
'n',
'<Leader>bc',
'<cmd>bp | bd #<CR>',
{ desc = 'Buffer close current', noremap = true, silent = true }
)
其他替換插件: snacks.explorer, nvim-tree
模糊搜索
我使用的是幾乎默認的 Telescope , 主要的配置都在 keymap.lua 裡面. Telescope 有個痛點,
就是無法讓廣播聚焦到右側的預覽區域. 對此我去 stack over flow 上面找了個片段
-- Fuzzy finder
local focus_preview = function(prompt_bufnr)
local action_state = require 'telescope.actions.state'
local picker = action_state.get_current_picker(prompt_bufnr)
local prompt_win = picker.prompt_win
local previewer = picker.previewer
local bufnr = previewer.state.bufnr or previewer.state.termopen_bufnr
local winid = previewer.state.winid or vim.fn.win_findbuf(bufnr)[1]
vim.keymap.set({ 'n', 'i' }, '<C-l>', function()
vim.cmd(string.format('noautocmd lua vim.api.nvim_set_current_win(%s)', prompt_win))
end, { buffer = bufnr })
vim.cmd(string.format('noautocmd lua vim.api.nvim_set_current_win(%s)', winid))
-- api.nvim_set_current_win(winid)
end
local Telescope = {
'nvim-telescope/telescope.nvim',
lazy = true,
cmd = { 'Telescope' },
opts = {
defaults = {
-- 其他配置...
mappings = {
n = {
['<C-l>'] = focus_preview,
},
i = {
['<C-l>'] = focus_preview,
},
},
},
},
}
return Telescope
其他替代品: snacks.picker. 功能比 telescope 更強大, 也更好看, 但我並不待見它.
mini.pick, 確實比較 mini, 功能有點少
git 提示
git 整合的確是作為開發編輯器不可缺少的一環, 但是我並不認為 Lazygit 這樣的工具應該整合在 neovim 裡面使用. 我使用gitsigns 獲得文件內內的 git 支持, 顯示變更的行號.
Markdown 渲染
Markdown Preview 是我從 vim 時期就在用的插件, 但是這個插件主要是 vimscript 和 javascript 寫成的, 不是非常方便移植到純 lua 的配置下, 我花了不少時間把 vim script 的配置改造成 lua 的。
Render Markdown 可以在 neovim 的 buffer 內直接渲染出 markdown。 但是缺乏對圖片和圖表之類的支援。

另外一個可以在 buffer 中直接渲染出 markdown 的插件是Markview。
我有一個正在實現的預覽圖片的 feature 正在實現正在咕咕中。 畢竟這種吃終端的東西要適配還是太難了
如果真的很需要圖片渲染, 請移步image.nvim或者snacks.image
輸入法切換
中文輸入場景下, 在 Normal 模式和 Insert 模式之間切換總是需要切換輸入法, 這比較麻煩. 我在 linux 和 macos 下都使用 fcitx5 輸入法. 但是兩者實現切換的機制是不一樣的, 使用體驗也並不相同.
Linux 下採用 fcitx5-zh-nvim 這個插件相當的老, 但是非常簡單. 通過 fcitx-remote
來控制輸入法狀態.
MacOS 下的 fcitx5 並沒有提供 ipc 接口來控制輸入法狀態, 因此只能用 im-switch 進行全局切換. 還需要設定在窗口失焦的時候儲存輸入法狀態. 使用體驗一坨
內置終端
內建終端並不常用, 但是冷不丁需要使用一下. 我使用 toggleterm. 這個懸浮的終端 只能完成基礎的工作, 用它開啟 yazi 預覽圖片什麼的工作就不太可能了.
NOTE
關於 snacks, 我並不怎麼待見的原因是它實在太大了. 我認為 neovim 插件應該遵循單一職責原則. 儘管 telescope 似乎也不遵守, 但是 telescope 主要負責模糊搜尋, 而且它的大部分功能我都用得上. 因此我能夠接受 telescope.
关于Lazy
馬上 neovim 都要推出
vim.pack了, 我為什麼仍然選擇 lazy?
lazy.nvim 可以說是最流行的 neovim 插件管理器了。幾乎所有適配 neovim 的插件都能在 README 裡面找到關於 lazy 下如何安裝和配置的代碼。lazy 有懶加載和異步的功能,有的插件可以設置成在打開 buffer,或者打開 特定類型文件的時候加載,可以優化啟動速度。現在我的 neovim 配置在啟動的時候只會加載 3-4 個插件。
關於 lazy-lock.json,這是用來鎖版本的文件,以我的習慣會將其納入版本管理,並且每次更新插件都會在提交中說明。在插件因為更新
而出現問題的時候我會及時回滾。納入版本管理的好處是容易重現 neovim 配置裡可能出現的 bug。