从零开始的 neovim 配置
Created|Updated
|Post Views:
本文介绍清风之恋的 neovim 配置的架构, 以及如何使用lazy管理插件
配置架构
我的配置架构如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| │ ├── 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 状态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| close_if_last_window = true, 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
的键位进行映射:
1 2 3 4 5 6
| 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 上面找了个补丁
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
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)) 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.