0%

Install and Config Neovim on WSL

开始学习vim一是觉得非常炫酷,二也是发现自己配置的vim在不同的机器下的迁移成本最低,非常方便适合多机器的开发场景,而如果选择用vim开发,就一定会选择全新的neovim(具体区别可参考:Vim还是Neovim?为什么你应该使用后者?。虽然我们大可用别人现成的配置,完成一个开箱即用的编辑器,但纯命令行的插件快捷键也会让人十分头大,那不如趁有时间,从头配置自己的编辑器。

这是我目前的配置仓库,欢迎交流。注:仍在逐步配置中
强烈推荐chirs大佬的这个视频Neovim from Scratch,虽然有些配置已经不是最新的了,但是可以学习如何自己去定制化配置,如何找到想要的配置。

安装

Neovim

一开始安装的是v0.8的版本,但Ubuntu环境下只有0.6(apt) / 0.7(pip stable) / 0.9(pip unstable),没法安装0.8,因此选择直接下载编译后的包进行安装,这样也方便后续升级管理。可以在neovim github上找到对应的安装包。

1
2
3
wget https://github.com/neovim/neovim/releases/download/stable/nvim-linux64.tar.gz
sudo tar xzvf nvim-linux64.tar.gz -C /usr/local/
/usr/local/nvim-linux64/bin/nvim

如果安装顺利,输入第三行命令就可以正常打开nvim了,但现在的nvim应该什么都没,和vim一样的空空荡荡,最后记得把nvim加入path。

1
export PATH=$PATH:/usr/local/nvim-linux64/bin

Nerd Fonts

Nerd字体是含有大量的icon图标的字体,因为它不像网页或软件有icon库,所以需要集成在字体中,这样终端也可以改造得非常炫酷,可以在网站找到合适的字体下载,windows直接双击安装即可,然后在终端配置中修改字体,我选择的是hack nerd mono。

配置文件

Neovim的配置文件在~/.config/nvim下,采用lua编写,默认会读取init.lua。我的配置结构是下面有一个lua的文件夹编写各种配置,init.lua会执行这些配置文件,所有的插件在plugin-lazy中安装,在plugin-config文件夹下配置插件。

1
2
3
4
5
6
7
8
9
10
11
12
13
├── init.lua
├── lua
│   ├── lsp
│   │   └── <lsp>
│   ├── plugin-config
│   │   └── <plugins>
│   ├── autocmd.lua
│   ├── color.lua
│   ├── keymappings.lua
│   ├── plugin-lazy.lua
│   └── setting.lua
└── test
└── <test_files>

样式配置

类似.vimrc的配置,可以开启一些比如行号、鼠标、缩进的配置,只是用lua重写了一遍,以下为我的配置,对应文件setting.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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
local options = {
-- clipboard = 'unnamedplus', --同步系统剪贴板
cmdheight = 1,
showmode = true, --右下角显示模式
showcmd = true, --右下角显示命令
conceallevel = 0,
mouse = "a", --允许鼠标
fileencoding = "utf-8", --utf8编码
number = true, --行号
relativenumber = true, --相对行号
signcolumn = "yes", --展示状态行
-- search
ignorecase = true, --查找时忽略大小写
smartcase = true, --智能大小写
incsearch = true, -- 边输入边搜索
hlsearch = false,
-- indent
smartindent = true, --智能缩进
cindent = true, -- Enables automatic C program indenting
autoindent = true, --自动缩进
tabstop = 4, --Tab宽度
shiftwidth = 4, --每次Shift调整的缩进
softtabstop = 2,
showtabline = 2,
expandtab = true,

scrolloff = 5,
sidescrolloff = 5,
wrap = false, --不自动换行
termguicolors = false, --如果安装第三方主题,必须设置为true
cursorline = false, --不高亮当前行
cursorcolumn = false, --不高亮当前列
}

--应用上面配置
vim.opt.shortmess:append("c")
for k, v in pairs(options) do
vim.opt[k] = v
end

快捷键

自定义快捷键是必不可少的一个步骤,在使用以及配置插件的过程中我们也会根据需求去调整快捷键。在vim中有一个快捷键叫做leader,先按这个键再按其他的字母可以就可以组合出更多的快捷键。我将空格键设置为leader,并配置再normal模式下空格+q就可以退出页面。

1
2
3
4
5
6
7
8
vim.g.mapleader = " "
vim.g.maplocalleader = " "

-- 保存本地变量
local map = vim.api.nvim_set_keymap
local opt = { noremap = true, silent = true }

map("n", "<leader>q", ":q<CR>", opt)

剪贴板

想要windows和wsl的剪贴板互通可以安装win32yank

1
2
3
4
wget https://github.com/equalsraf/win32yank/releases/download/v0.1.1/win32yank-x64.zip
unzip win32yank.exe
chmod +x win32yank.exe
sudo mv win32yank.exe /usr/local/bin/

方案1:可以通过mapping设置与系统剪贴板的交互,这样我们可以控制什么时候和系统剪贴板交互

1
2
3
map("n", "<leader>y", "\"+y", opt)
map("v", "<leader>y", "\"+y", opt)
map("n", "<leader>Y", "\"+Y", opt)

方案2:覆盖vim剪贴板的配置,直接复制到系统剪贴板中,但有个问题是发现这个配置后我的启动速度特别慢(见测试启动速度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vim.cmd([[
let g:clipboard = {
\ 'name': 'win32yank-wsl',
\ 'copy': {
\ '+': 'win32yank.exe -i --crlf',
\ '*': 'win32yank.exe -i --crlf',
\ },
\ 'paste': {
\ '+': 'win32yank.exe -o --lf',
\ '*': 'win32yank.exe -o --lf',
\ },
\ 'cache_enabled': 0,
\ }
]])

插件

插件管理器

vim的插件管理器有很多个,现在最常见的有packerlazy两个,如果跟着教程学大多都是用packer的,但lazy这两年冒得很快,现在大佬们的仓库都是lazy居多,而且lazy安装插件方式比较配置化,看着清爽一点,安装也更加可视化操作一些,支持配置插件的加载方式。

lazy的安装方式非常简单,直接在lua文件中写入以下代码,重启就行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not vim.loop.fs_stat(lazypath) then
vim.fn.system({
"git",
"clone",
"--filter=blob:none",
"https://github.com/folke/lazy.nvim.git",
"--branch=stable", -- latest stable release
lazypath,
})
end
vim.opt.rtp:prepend(lazypath)

require("lazy").setup({})

如果要新增一个插件,只需要在setup中加上这个仓库

1
2
3
require("lazy").setup({
{ "folke/neoconf.nvim" },
})

Theme 主题

工欲善其事必先利其器,编辑器好看了才有动力配置下去,因此第一步当然是安装主题插件啦,这里推荐两个常见主题onedarknord

1
2
3
4
5
6
require("lazy").setup({
{ "navarasu/onedark.nvim", lazy = true },
{ "shaunsingh/nord.nvim", lazy = true },
})

require('onedark').load()

Telescope 模糊搜索

telescope.nvim是一个模糊搜索的插件。这个插件需要注意默认搜索能力是基于BurntSushi/ripgrep的能力,所以一定要记得在机器上安装ripgrep,否则会发现空白的搜索结果(甚至不报错。。)

Null-ls

null-ls的配置说明不是很完善,中文文档也不是很多,参考了这个视频Neovim - Null-LS Formatting, Linting & more,另外这篇英文文档也不错Nvim lsp: set up null-ls for beginners

Debug & Learning

测试启动速度

在刚开始配置没多久,就发现nvim加载异常缓慢,比vscode开启时间还长,于是排查了一些导致启动速度慢的原因,在开启nvim的时候只需要加上--startuptime就可以记录启动日志了。

1
nvim --startuptime startup.log

从日志中可以看到clipboard花费了700ms的时间来启动,虽然不知道是为什么,但为了解决启动速度的问题,我把这段配置去掉了,而且也有其他方法和剪贴板进行交互。

1
2
3
4
5
6
7
8
9
10
11
12
times in msec
clock self+sourced self: sourced script
clock elapsed: other lines

000.011 000.011: --- NVIM STARTING ---
000.184 000.173: event init
000.266 000.082: early init
000.451 000.186: locale set
000.480 000.028: init first window
...
783.095 753.181 753.181: sourcing /usr/local/nvim/share/nvim/runtime/autoload/provider/clipboard.vim
...

Lua

为了更好地配置vim,需要学习lua语法学习和规范,因此在本地也安装了lua和luarocks,也参考了LuaStyleGuide配置了规范。

  1. 缩进2个空格
  2. 字符串双引号

参考资料

  • Neovim from Scratch 非常推荐这个教程,LunarVim的开发者做的视频,很清晰
  • LunarVim 参考了不少这个配置
  • Credit to 小伙伴五木