neovim配置方案

什么是neovim

neovim诞生的背景

一个巴西程序员申请向vim合入一些patch,但是这些patch遭到vim创始人的拒绝。
在此背景下,该程序员fork了vim项目,并在此基础上发起了neovim项目。
neovim是基于vim项目开发的新项目,它能够完全兼容vim,并且提供了一些vim不具备的优秀功能。

neovim的特点

//todo
我是在网上调研了neovim比vim更加易用,因此我才使用neovim,后期补充自己对neovim的使用感受以及特点

安装neovim

以windos为例,直接从github上下载对应版本即可。
下载地址是这里:Neovim下载地址, 我这里选择的版本是:v0.9.1

将下载好的neovim zip包解压至指定目录,并将{NEOVIM_HOME}\bin目录配置到系统环境变量中,即可完成对neovim的安装。

针对windows版本,neovim提供了两个命令:nvim.exenvim-qt.exe,前者是命令行式的,后者提供一个图形化界面。这里常用的式nvim.exe,也可以简写为nvim

我们可以通过如下命令验证neovim及其环境变量是否安装成功。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 打开powershell,输入如下命令
nvim --verion

# 会打印如下结果
NVIM v0.9.1
Build type: RelWithDebInfo
LuaJIT 2.1.0-beta3
Compilation: C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/cl.exe /MD /Zi /O2 /Ob1 -W3 -wd4311 -wd4146 -DUNIT_TESTING -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE -D_WIN32_WINNT=0x0602 -DMSWIN -DINCLUDE_GENERATED_DECLARATIONS -ID:/a/neovim/neovim/.deps/usr/include/luajit-2.1 -ID:/a/neovim/neovim/.deps/usr/include -ID:/a/neovim/neovim/.deps/usr/include -ID:/a/neovim/neovim/build/src/nvim/auto -ID:/a/neovim/neovim/build/include -ID:/a/neovim/neovim/build/cmake.config -ID:/a/neovim/neovim/src -ID:/a/neovim/neovim/.deps/usr/include -ID:/a/neovim/neovim/.deps/usr/include -ID:/a/neovim/neovim/.deps/usr/include -ID:/a/neovim/neovim/.deps/usr/include -ID:/a/neovim/neovim/.deps/usr/include -ID:/a/neovim/neovim/.deps/usr/include -ID:/a/neovim/neovim/.deps/usr/include

system vimrc file: "$VIM\sysinit.vim"
fall-back for $VIM: "C:/Program Files (x86)/nvim/share/nvim"

Run :checkhealth for more info

neovim自检

在powershell中输入nvim打开neovim,在normal模式下,输入命令:checkhealth,可以实现对neovim的自检工作。

同时,如果没有配置neovim所需要的配置文件的话,自检结果还会显示需要我们在指定路径下新建neovim所需要的配置文件。

对于windows而言,需要在${user}\AppData\Local\nvim目录下新建init.lua文件,如果文件夹不存在,需要手动创建。

neovim 配置

packer.vim

packer.nvim是neovim的插件管理工具,基于该工具可以安装我们所需的插件。

要想使用packer.vim,需要首先从github上下载该安装包,并放到指定路径下,对于windows用户而言,默认需要将其放到这个目录中:${user}\AppData\Local\nvim-data\site\pack\packer\start,如果该目录不存在,请手动创建。

1
2
3
4
cd ${user}\AppData\Local\nvim-data\site\pack\packer\start

# 下载packer.nvim
git clone https://github.com/wbthomason/packer.nvim

然后进入到neovim的配置目录(${user}\AppData\Local\nvim),新建一个文件夹,文件夹名字随意,这里我选择名字为lua,然后进入到lua文件夹中,新建一个lua文件,名字随意,这里我选择新建一个plugin_manager.lua.然后在文件中写入如下内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
local ensure_packer = function()
local fn = vim.fn
local install_path = fn.stdpath('data')..'/site/pack/packer/start/packer.nvim'
if fn.empty(fn.glob(install_path)) > 0 then
fn.system({'git', 'clone', '--depth', '1', 'https://github.com/wbthomason/packer.nvim', install_path})
vim.cmd [[packadd packer.nvim]]
return true
end
return false
end

local packer_bootstrap = ensure_packer()

return require('packer').startup(function(use)
use 'wbthomason/packer.nvim'
-- My plugins here
-- use 'foo1/bar1.nvim'
-- use 'foo2/bar2.nvim'

-- Automatically set up your configuration after cloning packer.nvim
-- Put this at the end after all plugins
if packer_bootstrap then
require('packer').sync()
end
end)

最后,再在${user}\AppData\Local\nvim\init.lua中添加如下内容,表示使用该插件。

1
2
-- 其中lua文件夹这个路径可以缺省,neovim会自动在该目录下的lua文件夹中寻找
require('plugins_manager')

至此,packer.nvim插件管理工具安装过完成。

可以通过打开neovim,并在normal模式下执行:PackerSync来检查我们的安装效果。

文档树插件nvim-tree

nvim-tree能够使得neovim实现如下形式的功能。
20230822213140
安装该插件的方式非常简单,在plugin_manager.lua文件中的-- use 'foo2/bar2.nvimm -- Automatically set up your configuration after cloning packer.nvim之间添加如下内容即可:

1
2
3
4
5
6
use {
'nvim-tree/nvim-tree.lua',
requires = {
'nvim-tree/nvim-web-devicons', -- optional
}
}

然后保存,重启neovim,在normal模式下输入命令:PackerSync即可实现对该插件的安装。

为了更好的使用nvim-tree,需要对该插件进行额外的配置。
lua文件夹下创建一个plugins-config文件夹,并在该文件夹中创建nvim-tree的配置文件nvim-tree.lua,内容如下所示:

1
2
3
4
5
-- 表示默认情况下不打开nvim-tree
vim.g.loaded_netrw = 1
vim.g.loaded_netrwPlugin = 1

require("nvim-tree").setup()

然后在init.lua配置文件中,指定对该配置的使用:

1
2
3
4
5
-- 其中lua文件夹这个路径可以缺省,neovim会自动在该目录下的lua文件夹中寻找
require('plugins_manager')

-- 指定lua目录下的plugins-config/vim-tree.lua配置文件,lua后缀默认可缺省
require('plugins-config.nvim-tree')

保存并重启neovim,在normal模式下使用命令:NvimTreeToggle,就可以使用文档树的功能了。

:NvimTreeToggle命令太长了,输入有些麻烦,neovim支持快捷键,因此我们可以设置快捷键来实现该功能。
lua文件夹下创建一个core文件夹,并在该文件夹下创建keymaps.lua文件,专门用于设置各种快捷键。为实现上述快捷键功能,填写如下内容。

1
2
3
4
5
6
7
8
-- 设置<leader>表示一个空格键
vim.g.mapleader = " "

-- 提供公共部分
local keymap = vim.keymap

-- 设定:NvimTreeToggle的快捷键是空格 + e
keymap.set("n", "<leader>e", ":NvimTreeToggle<CR>")

于此同时,在init.lua中引用该快捷键配置。

1
2
3
4
5
6
7
8
-- 其中lua文件夹这个路径可以缺省,neovim会自动在该目录下的lua文件夹中寻找
require('plugins_manager')

-- 指定lua目录下的plugins-config/vim-tree.lua配置文件,lua后缀默认可缺省
require('plugins-config.nvim-tree')

-- 引用快捷键
require('core.keymaps')

保存重启neovim,就可以按快捷键空格 + e键,快速打开文档树。

nvim-tree首先会有文档树的导航功能,其次它还会对不同的文件按照不同图标形式显示。为了实现图标的显示,需要安装nerd font字体。

nerd font字体安装

所谓Nerd Fonts 是一个使用大量字体图标来解决程序员在开发过程中缺少合适字体的问题的项目。
举个例子诸如如下的图标,我们在powershell中是不能直接粘贴复制的。
20230822213314

但是一旦当前字体支持nerd font,就会实现快速的粘贴,如下所示。
20230822213524

可以在这个网站上选择自己喜欢的nerd font字体:https://www.nerdfonts.com/font-downloads,下载字体包,解压并安装。
我这里选择的是:font-sourcecodepro-nerd-fon,字体效果如以下所示。
20230822214558

字体安装之后,重启powershell,然后再powershell设置 - 默认值 - 外观 - 字体中选择目标字体,即可完成设置,再次打开neovim即可实现上面nvim-tree中的文档树效果及图标显示。

该字体不仅仅再这里需要,后面很多需要图标的插件都需要这种类型的字体。

主题插件

tokyonight是一个主题插件,支持4种主题:

1
2
3
4
tokyonight-night
tokyonight-storm
tokyonight-day
tokyonight-moon

安装方式和安装nvim-tree方式一样,也是现在plugins_manager.lua中声明,如下所示:

1
use 'folke/tokyonight.nvim'

要使该主题生效,需要进行声明,为方便管理,我再lua文件夹下创建一个core文件夹,然后新建文件options.lua文件,填写如下内容:

1
2
-- 使用tokyonight主题
vim.cmd[[colorscheme tokyonight]]

同时在init.lua文件中声明:

1
2
3
4
5
6
7
8
9
10
-- 其中lua文件夹这个路径可以缺省,neovim会自动在该目录下的lua文件夹中寻找
require('plugins_manager')

-- 指定lua目录下的plugins-config/vim-tree.lua配置文件,lua后缀默认可缺省
require('plugins-config.nvim-tree')

-- 引用快捷键
require('core.keymaps')
-- 引用options
require('core.options')

标签插件

neovim默认的标签也不好,可以使用bufferline插件,实现一个好看的标签页,如下图所示。
20230822225027

安装该插件的方式和安装nvim-tree一样,也是现在plugins_manager.lua中声明,如下所示:

1
use {'akinsho/bufferline.nvim', tag = "*", requires = 'nvim-tree/nvim-web-devicons'}

该插件需要进行一些配置,以便于更好的使用。在plugins-config目录下新建bufferline.lua,填写如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vim.opt.termguicolors = true

require("bufferline").setup {
options = {
-- 使用 nvim 内置lsp
diagnostics = "nvim_lsp",
-- 左侧让出 nvim-tree 的位置
offsets = {{
filetype = "NvimTree",
text = "File Explorer",
highlight = "Directory",
text_align = "left"
}}
}
}

同时在init.lua声明对该配置的使用。

1
2
3
4
5
6
7
8
9
10
11
12
-- 其中lua文件夹这个路径可以缺省,neovim会自动在该目录下的lua文件夹中寻找
require('plugins_manager')

-- 指定lua目录下的plugins-config/vim-tree.lua配置文件,lua后缀默认可缺省
require('plugins-config.nvim-tree')
-- 引用bufferline插件配置
require('plugins-config.bufferline')

-- 引用快捷键
require('core.keymaps')
-- 引用options
require('core.options')

保存重启neovim,执行:PackerSync命令实现对插件的安装,再次重启neovim即可使用该插件功能。

状态栏插件安装

这里需要的插件是lualine,该插件实现的功能是neovim的地步状态栏更加好看。如下图所示。
20230822222242

安装该插件的方式和安装nvim-tree一样,也是现在plugins_manager.lua中声明,如下所示:

1
2
3
4
use {
'nvim-lualine/lualine.nvim', -- 状态栏
requires = { 'kyazdani42/nvim-web-devicons', opt = true } -- 状态栏图标
}

同样重启neovim,执行:PackerSync完成对该插件的安装工作。

该插件同样需要一些配置,因此在plugins-config目录下新建lualine.lua配置文件,并填写如下内容:

1
2
3
4
5
require('lualine').setup({
options = {
theme = 'tokyonight'
}
})

然后在init.lua中引用该配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- 其中lua文件夹这个路径可以缺省,neovim会自动在该目录下的lua文件夹中寻找
require('plugins_manager')

-- 指定lua目录下的plugins-config/vim-tree.lua配置文件,lua后缀默认可缺省
require('plugins-config.nvim-tree')
-- 引用bufferline插件配置
require('plugins-config.bufferline')
-- 引用lualine插件配置
require('plugins-config.lualine')

-- 引用快捷键
require('core.keymaps')
-- 引用options
require('core.options')

然后重启neovim,就可以发现状态变成上图所示的形式了。

全文检索插件

这里需要的插件是telescope,该插件实现的功能是能够在项目中对文件及文件内容进行检索。如下图所示。

20230822230657

安装该插件的方式和安装nvim-tree一样,也是现在plugins_manager.lua中声明,如下所示:

1
2
3
4
use {
'nvim-telescope/telescope.nvim', tag = '0.1.1', -- 文件检索
requires = { {'nvim-lua/plenary.nvim'} }
}

同样重启neovim,执行:PackerSync完成对该插件的安装工作。

该插件同样需要一些配置,因此在plugins-config目录下新建telescope.lua配置文件,并填写如下内容:

1
2
3
4
5
6
7
8
9
10
local builtin = require('telescope.builtin')

-- 进入telescope页面会是插入模式,回到正常模式就可以用j和k来移动了

-- 搜索文件名
vim.keymap.set('n', '<leader>ff', builtin.find_files, {})
-- 搜索文件内容
vim.keymap.set('n', '<leader>fg', builtin.live_grep, {}) -- 环境里要安装ripgrep
vim.keymap.set('n', '<leader>fb', builtin.buffers, {})
vim.keymap.set('n', '<leader>fh', builtin.help_tags, {})

然后再init.lua中引用该配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- 其中lua文件夹这个路径可以缺省,neovim会自动在该目录下的lua文件夹中寻找
require('plugins_manager')

-- 指定lua目录下的plugins-config/vim-tree.lua配置文件,lua后缀默认可缺省
require('plugins-config.nvim-tree')
-- 引用bufferline插件配置
require('plugins-config.bufferline')
-- 引用lualine插件配置
require('plugins-config.lualine')
-- 引用telescope插件配置
require('plugins-config.telescop')

-- 引用options
require('core.options')
-- 引用options
require('core.keymaps')

然后重启neovim,按快捷键空格 + f + f就可以实现对文件的搜索了。

安装ripgrep

要实现对文件内容的检索,需要安装ripgrep.
首先下载该安装包,可以在这里下载:https://github.com/BurntSushi/ripgrep/releases. 解压,安装,并将其添加至环境变量中,即完成了该工具包的安装。
然后重启powershell,重新打开neovim,按空格 + f + g即可实现对文件内容的搜索,如下图所示。
20230822233116

vim-tmux-navigator插件

该插件可以实现焦点快速从文件侧转移至文档树导航侧,或者反过来。

安装该插件的方式和安装nvim-tree一样,也是现在plugins_manager.lua中声明,如下所示:

1
use "christoomey/vim-tmux-navigator"

同样重启neovim,执行:PackerSync完成对该插件的安装工作。

该插件安装成功之后,重启neovim,按ctrl + H,ctrl + L 快速实现焦点切换。

其他的一些配置

在options.lua文件中配置。

1
2
3
4
5
6
7
8
9
10
11
local opt = vim.opt

-- 显示行号
opt.number = true

-- vim中的粘贴板和系统中的粘贴板共通
opt.clipboard = "unnamedplus"

opt.termguicolors = true
opt.signcolumn = "yes"
vim.cmd[[colorscheme tokyonight-moon]]