杂谈:我的现代化neovim配置
点击这里跳转到Github。
写在前面
该配置仅支持neovim,如果要使用同时支持vim 8.2+和neovim 0.5.0+的公共配置,可以使用分支common_config_for_n_vim,该分支仍在维护中,但是不会再添加新功能。
这份公共配置使用coc.nvim作为LSP协议中server/client的桥梁,而新配置使用neovim原生的nvim-lsp作为基于语义的补全、LSP和其他酷炫功能的基础设置。新配置具有更好的性能与可扩展性,以及更好的可读性,它完全使用Lua编写。
此外,该配置只支持在terminal中使用neovim,暂时没有支持neovim的图形化前端,例如neovide或者neovim-qt的计划。我也只在Windows terminal中测试过该配置。如果你打算在Windows上使用,我不保证一切功能正常,欢迎针对此类问题提出PR。
使用方法
支持的编程语言:
c
,cpp
,objective-c
,objective-c++
make
,cmake
bash
python3
,lua
,vimL
json
,xml
,toml
,yaml
rust
(计划中)
依赖
你需要提前安装以下依赖,以保证配置可以正常工作:
- neovim 0.6.0+ or nightly build,
- git 2.18+,
- cmake 3.18+,
- GCC 9.2.0 或者更新版本,或者其他支持cpp14及更新标准的C++编译器(编译nvim-treesitter parsers),
- Node.js 17.0+(pyright),
- Nerd Fonts,终端显示用(我比较喜欢
FiraCode NF
).
安装步骤
-
安装C++ LSP
使用clangd
作为默认的C/C++ LSP服务器,可以通过包管理器安装或者在这里下载编译好的二进制文件。 -
安装Node.js
部分LSP,例如pyright
, 是npm package,可以使用系统的包管理器安装它,或者到这里下载最新的二进制文件,解压后添加到$PATH
中; -
git、cmake,以及GCC,也可以通过包管理器安装,或者自行编译;
-
克隆项目并把
nvim/
目录软链接到~/.config/nvim
:git clone https://github.com/stark-zhang/dotfiles-on-unix-like.git --depth 1
ln -sf /absolute/path/to/dotfiles-on-unix-like/nvim ~/.config/nvim -
运行
nvim +PackerSync
,所有的扩展,包括受nvim-lspinstaller管理的LSP server,以及nvim-treesitter parsers将会被自动安装到~/.local/share/nvim/
下。
好了,开始享受吧!
Gallery
启动时间统计:
启动屏幕(powered by alpha.nvim
):
最近文件(powered by telescope
):
基于LSP的定义预览(powered by lspsaga
& ccls
), 你还可以在状态栏上和virtual text中找到git相关的信息:
大纲视图:
还有更多功能等你探索!
演示中使用的代码为libuv。
定制
如果你需要自定义配置,请fork一份到自己的Github仓库。
基本选项
你可以在lua/core/options.lua
找到neovim的基本配置,并修改它们。
按键映射
使用<space>
作为<leader>
。
快捷键定义在lua/core/keymap.lua
的两个表中,分别是keymap.builtin
和keymap.plugins
,并且使用lua/utility/keybinding
提供的方法进行绑定。除此之外,还有些扩展的快捷键和它们的初始化高度相关,因而定义在扩展的配置中。
在lua/core/keymap.lua
中,快捷键映射的格式如下:
keymap = { |
其中,|
之前的n
对应Normal模式,也可以用v
表示该映射在Visual模式下有效;|
之后是实际的快捷键;map_cr()
方法指定快捷键对应的命令,除了这个方法之外,可以用map_cu()
,使映射的命令带有<C-u>
前缀,或者map_cmd()
,用于指定快捷键对应的按键组合。
map_cr()
等方法返回一个对象,支持三种with
方法,分别是:
with_silent()
,为映射的命令附加<silent>
前缀,不适用于map_cmd()
方法;with_recursive()
,递归映射;with_nowait()
,为映射的按键组合添加<nowait>
前缀。
除非你知道递归映射是怎么工作的,否则不要使用with_recursive()
方法!
按键映射的相关方法正在重构,将基于which-key插件提供更现代化、更友好的映射方式。
插件
使用packer.nvim作为默认的插件管理器,并作为lazy-loader配置的生成器。lazy-loader配置文件会被生成为~/.local/share/nvim/site/lua/_compiled.lua
。
如果需要增删插件,需要修改lua/modules/<category>/init.lua
;如果要修改插件的配置,需要修改lua/modules/<category>/config.lua
。修改任何modules
下的文件后,需要运行nvim +PackerSync
方可生效。
所有的插件分为四个类别: ui
、editor
、lsp
以及tools
。
lsp(Language Server Protocol)
主要依赖于nvim-lspconfig
和nvim-lsp-installer
插件,前者负责配置LSP server,后者负责自动从Github、NPM或者其他来源安装LSP server,安装目录为~/.local/share/nvim/lsp_servers/
。
LSP server的主要配置见lua/modules/lsp/config/init.lua
中的config.lspconfig()
方法。其中,除了clangd
之外的LSP server均由nvim-lsp-installer
管理。
utility/logger
这是一个logger的简单实现,基于vim.notify()
,可以帮助调试问题。
已知问题
如果有人使用这份配置,欢迎提出issues和PR!
- 使用
FiraCode NF
时,斜体字在Windows Terminal中显示不正常; - 使用
:Telescope oldfiles
打开最近打开过的C++源文件时,ccls
可能无法被正常调起; bashls
启动异常;
计划
References
受ayamir/nvimdots启发并直接使用了其中的一部分代码,在此向ayamir表示感谢!