近期 Neovim 生态变化

最近几个月(2023下半年) Neovim 的插件生态发生了很大的变化.

Packer.nvim 停止维护

首先是高达 7.2k stars 的插件管理器 Packer.nvim 在今年八月宣布停止维护. 而笔者在使用 neovim 的时间内都在使用 packer.nvim. 作为现代 neovim 的最重要的工具之一, 插件管理器必须使用被长期维护的, 因而笔者决定切换到 lazy.nvim

lazy.nvim 的界面更为美观, 而且有高度灵活可以自定义的懒加载 hook, 从而大大提高启动速度.

null-ls.nvim 停止维护

之前依赖 null-ls 的诸多功能可能在未来一段时间后 break. 所以必须找到一个可以替换 null-ls 的工具.

Neovim 配置思路

笔者并不认为读者 应当 照抄某人的配置, 因为其按键绑定, 插件的使用习惯等等都会不同. 因而笔者写作本文旨在描述一个具有拓展性的配置. 笔者总结了以下几个原则:

1. 使用 Lua 作为配置的脚本语言

作为一个 neovim 用户, 自然要使用作为 一等公民 的 lua 作为配置脚本语言. 这将保证配置文件的长期可用性.

所有配置的入口文件则是在nvim 配置目录的根目录下的 init.lua 文件中.

2. 模块化配置

笔者认为作为一个具有在无图形化界面条件下对服务器进行运维功能的编辑器, 应该拥有一个 “最小模式”. 最小模式应当包括所有的按键绑定和其他基础的界面等等的配置. 并且不能配置特殊的字体, 不能配置插件(毕竟你的设备可能由于种种原因无法正常使用国际互联网) 此外不同 种类 的配置应该被放置在不同的文件中, 以供检索和修改.

笔者认为大致可以分为以下几个模块:

  1. 基础配置(也就是最小模式)
  2. 插件安装配置
  3. 插件配置
  4. LSP 相关配置

3. 懒加载

懒加载就是用的时候再去加载特定的插件, 这样可以提高vim 的启动速度和内存占用. 越快肯定越好, 使用懒加载准没错, 笔者目前的五十个插件, 打开一个空的 buffer 只需要 50ms 左右.

4. 使用相对流行的插件

用的人越多, 遇到的问题可以解决的可能性就会越大. 插件的维护就越勤快, 当然要使用相对流行的插件.

5. 注意各种材料的时间

由于 neovim 在不断开发, 生态不断变化. 关注网络上的各种信息要注意时间. 很多配置(可能一年前的)已经过时.

几个名词解释和相关插件

对你的配置文件了如指掌是十分重要的, 因此对 neovim/vim 生态中的这几个概念的了解是必要的. 这几个概念有些是 neovim/vim 生态中特有的概念, 有些则是相对通用的概念, 有些则是著名的 neovim/vim 插件

LSP

Language Server Protocol, 语言服务器协议.

是用于解析编程语言(包括标记语言, 接口描述语言等)的协议. 一般我们说 LSP 都是指 LSP Server (也即实现了 Language Server Protocol 的语言服务器)

具体的例子是 golang 的 gopls, python 的 pyright, vue 的 volar. 有些lsp 是官方维护的, 有的是第三方的, 他们的开发语言可能不同, 性能和功能可能不同, 但是都要实现 lsp 协议, 从而能在 支持 lsp 的编辑器中使用 (例如 nvim, vim, vscode等)

对于 neovim 生态, lsp 这一块有几个重要的插件

  1. nvim-lspconfig 这是最重要的一个插件, 它的作用是配置 neovim 的 lsp 服务器, 其中包括了上百个lsp的配置, 大大的减少了插件配置的难度.
  2. mason.nvim mason 中可以一键下载常见的lsp, 是 lsp 的包管理器, 当然你也可以自己手动下载 lsp. 当然 mason 也可以下载dap, linter 等等, 这个后面说
  3. mason-lspconfig.nvim基本上使用 mason 必装的一个插件, 用于弥合 mason 和 lsp-config 之间的差距(最直观的感觉是lsp的名称不同)
  4. lspsaga.nvim 通过 lspsaga 可以增强 lsp 功能(例如可以调用CodeAction, QuickFix等等) 是很方便的一个插件

Complele

也就是自动补全. 有 lsp 的基础上, 还需要自动补全插件来帮你写代码. 自动补全插件有很多, 有很经典的 ycm (you compelete me), 有很的 coc.nvim, 也有笔者在用的 nvim-cmp.

笔者曾经使用过一段时间的 coc.nvim, 不得不说 coc.nvim 是一个很好用的东西, 基本上是"另起炉灶"的使用自己的一套生态 而笔者不太认可这种行为, (会让我觉得coc.nvim 很重, 但是笔者的实际使用中并没有什么明显的卡顿) 所以笔者切换到了 nvim-cmp.

lsp 只是 nvim-cmp 的一个 source, 除了这个 source 之外还有的 source 有例如 snippets, buffer, 甚至 copilot.

Treesitter

Treesitter 也是解析语法的一个工具, 它解析语法, 高亮的功能已经被 lsp 代替, 其他的代码折叠, 缩进彩虹等等的功能可以用其他插件解决.

现在使用它的唯一理由是 lspsaga 的 doc_hover() (悬浮显示文档) 需要 TS. 如果不需要 lspsaga 的这一功能, 可以把 TS 删掉了.

其他插件推荐

  • indent-blankline-nvim 缩进彩虹可以通过这个插件实现
  • nvim-transparent 可以实现背景色透明(配合透明的终端)
  • nvim-scrollbar 屏幕右侧的一个滚动指示条
  • nvim-colorizer 对形如#FFFFFF的 hex 颜色着色
  • todo-comments 对 注释中的 TODO, FIX等等加颜色
  • telescope.nvim 模糊搜索, 有时候很好用
  • Comment.nvim 一间加/去注释, 改代码的时候很有用
  • nvim-surrounded 一个颇具特色的vim插件, 可以修改"环绕"的内容

参考配置

我的一些 dotfiles: https://github.com/FinleyGe/dotfiles

Neovim 之外

终端复用器 Tmux

除了 Neovim 之外, 笔者还在使用 tmux 作为 “终端复用器”. 可以实现分屏, 多 session 的操作. 虽然 neovim/vim 本身也可以实现这些功能, 但是笔者认为使用 tmux 更为灵活方便. 但是 tmux 已经相当古老了, 但笔者暂时也没有找到替代品.

使用 vim-tmux-navigator 可以通过一套快捷键在 tmux 的分屏和 vim 的分屏之间衔接, 很有用.

终端 Wezterm

笔者使用的终端是 Wezterm, 一个颇为小众的 Rust 写的终端, 支持 wayland, 值得推荐

字体

额外说一下字体, wezterm 里面可以对不同样式的字体(斜体, 粗体等等)配置不同的字体, 这样就可以对斜体和常规字体配置不同的字体, 实现很多花里胡哨的效果.

wezterm 也支持 font fallback, 同时配置多个字体, 支持连体(例如firacode 和 部分手写体字体)