nvim配置


NeoVim配置

起因是YCM的clangd无法支持c++20的协程,编写协程代码的时候一片红色,根本没办法用。
所以时隔多年打算重新配置一下vim,也顺便了解一下vim具体的东西。

目标

  1. 插件管理

插件管理是别的功能的基础。插件管理需要作出权衡:丰富的功能 vs 打开的响应时间

  1. 语法提示 & 自动补全

这是写代码最基本的要求。语法提示要求language server。自动补全会比较复杂,包括基于语法的自动补全,以及基于代码片段的自动补全。

  1. 目录管理

(a) 通过文件树快速访问文件

(b) 通过文件名快速查找文件(类似vscode Ctrl + p)

  1. 代码跳转

跳转到定义,以及跳转到实现,还有查找引用等。

  1. 代码格式化

缩进,空格等

  1. 全局查找

通过字符串匹配文件夹下面的所有内容

  1. 高亮,主题等

  2. 其它本人需要的东西,比如markdown预览,git支持等

实现

为了在安装的时候更方便,我们调整了一下功能的实现顺序。

基本配置

├── init.lua
└── lua
    ├── core
    │   ├── keymaps.lua
    │   └── options.lua
    └── plugins
        └── plugins-setup.lua

lua是一种脚本语言,neovim可以通过lua完成配置。如文件结构所示,在init.lua中进行所有的配置,然后在lua文件夹下面可以进行一些子配置。通过require进行对其它文件的引用。lua的路径可以直接忽略,之后每级目录用”.”进行分割。

require("core.options")
require("core.keymaps")
require("plugins.plugins-setup")

插件管理

网上目前争论比较多的是lazy.nvim以及packer.nvim。
目前认为lazy.nvim的启动速度是更快的,而且能动态的决定应该加载哪些插件,但是packer.vim的配置更加简单,而且能够自动更新插件。
我们这里使用lazy.nvm,因为我们的目标是快速启动,而且我们的插件不会经常更新。

安装vim-plug的命令如下:

curl -fLo ~/.local/share/nvim/site/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

然后在.config/nvim/lua/plugins/plugins-setup.lua中加入

call plug#begin()
" 中间的位置加入其它的插件
call plug#end()

主题

tokyonight是目前最火的主题。
状态栏有lualine。

Plug 'folke/tokyonight.nvim'
Plug 'kyazdani42/nvim-web-devicons' "状态栏图标"
Plug 'nvim-lualine/lualine.nvim' "状态栏"

文档树

nerdTree在nvim下的替代是nvim-tree

Plug 'nvim-tree/nvim-web-devicons' "文档树图标
Plug 'nvim-tree/nvim-tree.lua' "文档树

然后是修改快捷键,使用<leader>n打开文档树。在tree中,用tab键可以查看文件但是不跳转光标,用回车键可以跳转光标。

文件查找和全局查找

telescope可以实现文件的查找,配合ripgrep可以实现文件内容的查找。

主题和高亮

主题和状态栏可以用tokyonight和lualine。
高亮用treesiter

语法提示 & 自动补全

首先是LSP的支持,LSP是Language Server Protocol的缩写,是一种通用的语言服务器协议。通过LSP,我们可以实现语法提示,自动补全,代码跳转,代码格式化等功能。这里我们用这三个插件来实现LSP的支持。

Plug 'williamboman/mason.nvim'
Plug 'williamboman/mason-lspconfig.nvim'
Plug 'neovim/nvim-lspconfig'

自动补全需要以下的插件

Plug 'hrsh7th/nvim-cmp'
Plug 'hrsh7th/cmp-nvim-lsp'
Plug 'L3MON4D3/LuaSnip'
Plug 'saadparwaiz1/cmp_luasnip'
Plug 'rafamadriz/friendly-snippets'
Plug 'hrsh7th/cmp-path' -- 文件路径

lsp的配置只需要启动对应的language server就好了

require("lspconfig").clangd.setup {}

通过lsp和telescope的配合,可以实现代码的跳转

-- 实现函数跳转
vim.keymap.set('n', '<C-]>', builtin.lsp_definitions)
vim.keymap.set('n', '<C-i>', builtin.lsp_implementations)
vim.keymap.set('n', '<F12>', builtin.lsp_references)

TODO: 自动补全
自动补全的插件

Markdown支持

使用nvim-lspconfig可以提供markdown的language server的支持


Author: 蒋璋
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source 蒋璋 !