点击这里跳转到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).

安装步骤

  1. 安装C++ LSP
    使用clangd作为默认的C/C++ LSP服务器,可以通过包管理器安装或者在这里下载编译好的二进制文件。

  2. 安装Node.js
    部分LSP,例如pyright, 是npm package,可以使用系统的包管理器安装它,或者到这里下载最新的二进制文件,解压后添加到$PATH中;

  3. git、cmake,以及GCC,也可以通过包管理器安装,或者自行编译;

  4. 克隆项目并把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
  5. 运行nvim +PackerSync,所有的扩展,包括受nvim-lspinstaller管理的LSP server,以及nvim-treesitter parsers将会被自动安装到~/.local/share/nvim/下。

好了,开始享受吧!

启动时间统计:

StartUp Time

启动屏幕(powered by alpha.nvim):

alpha-dashboard

最近文件(powered by telescope):

Recent Files

基于LSP的定义预览(powered by lspsaga & ccls), 你还可以在状态栏上和virtual text中找到git相关的信息:

LSP preview

大纲视图:

LSP outline

还有更多功能等你探索!

演示中使用的代码为libuv

定制

如果你需要自定义配置,请fork一份到自己的Github仓库。

基本选项

你可以在lua/core/options.lua找到neovim的基本配置,并修改它们。

按键映射

使用<space>作为<leader>
快捷键定义在lua/core/keymap.lua的两个表中,分别是keymap.builtinkeymap.plugins,并且使用lua/utility/keybinding提供的方法进行绑定。除此之外,还有些扩展的快捷键和它们的初始化高度相关,因而定义在扩展的配置中。

lua/core/keymap.lua中,快捷键映射的格式如下:

keymap = {
['n|<leader>e'] = map_cr('NvimTreeToggle'):with_silent(),
}

其中,|之前的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方可生效。

所有的插件分为四个类别: uieditorlsp以及tools

lsp(Language Server Protocol)

主要依赖于nvim-lspconfignvim-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表示感谢!