NeoVim配置
起因是YCM的clangd无法支持c++20的协程,编写协程代码的时候一片红色,根本没办法用。
所以时隔多年打算重新配置一下vim,也顺便了解一下vim具体的东西。
目标
- 插件管理
插件管理是别的功能的基础。插件管理需要作出权衡:丰富的功能 vs 打开的响应时间
- 语法提示 & 自动补全
这是写代码最基本的要求。语法提示要求language server。自动补全会比较复杂,包括基于语法的自动补全,以及基于代码片段的自动补全。
- 目录管理
(a) 通过文件树快速访问文件
(b) 通过文件名快速查找文件(类似vscode Ctrl + p)
- 代码跳转
跳转到定义,以及跳转到实现,还有查找引用等。
- 代码格式化
缩进,空格等
- 全局查找
通过字符串匹配文件夹下面的所有内容
高亮,主题等
其它本人需要的东西,比如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的支持