之前我们介绍了基础配置部分和快捷键配置部分。如果你配置了这两个部分,vim已经算是比较好用了。但是作为代码编辑器来讲还是显的比较简陋,用这些配置来完成日常的编码任务会显得力不从心。vim比较强大的一点是它拥有丰富的插件系统。大量高手在上面为它开发各种形式的插件。今天我们将从插件管理开始,利用前人的成果丰富我们的vim功能
使用lua添加自动命令组
在正式开始介绍插件之前我们先优化一下加载配置文件的时机。之前我们介绍自动命令的时候已经给出了如何自动加载配置
augroup NVIMRC
autocmd!
autocmd BufWritePost init.lua source %
augroup END
在使用vimscript的场合它可以正常工作。但是如何在 neovim中配置它呢?
目前有两种解决办法
使用新版 neovim api
在 neovim0.7
版本以后,我们可以使用下列 api
来创建并使用自动命令组
-
nvim_create_augroup({name}, {*opts})
: 创建自动命令组,如果创建成功,返回自动命令组的id -
nvim_create_autocmd({event}, {*opts})
:创建自动命令。
nvim_create_augroup
传递一个自动命令组的名称,另外它可以接受一个 table
作为属性值,目前属性值可以传入一个 clear
的布尔值,相当于是否执行 autocmd!
。
nvim_create_autocmd
,第一个参数是一个或者多个事件字符串组成的 table
,它的含义与 autocmd
中的事件相同,用的字符串也相同。第二个参数是一个表示属性的 table
。常用的有:
- group: 所属自动命令组
- pattern: autocmd中的 pattern部分
- callback: 一个lua的回调函数,当事件发生时,调用该回调函数
- command: 该字段可以填入一个 vim命令的字符串,相当于 autocmd中的 command部分
我们要将上述代码改为 lua
版本,首先使用创建一个自动命令组
local nvimrc = vim.api.nvim_create_augroup("NVIMRC", {clear = true})
接着为了方便我们使用 command
字段来完成这个自动命令
vim.api.nvim_create_autocmd({"BufWritePost"}, {
pattern = "init.lua",
group = nvimrc,
command = "source %"
})
在上一篇文章中,我们已经初步有了划分模块的概念。随着配置的越来越多,以后在 init.lua
中一定伴随着大量的 require
。我们可以通过 gf
快速跳转到对应的模块,但是前提条件是我们已经设置了 path
变量。每次退出 nvim
再进来,需要重新设置,有没有觉得很麻烦呢?如果我们使用自动命令组,在进入 init.lua
之后自动设置 path
就好了。我们学会了使用自动命令组之后,来自己实现这个需求
vim.api.nvim_create_autocmd({"BufWritePost"}, {
pattern = "init.lua",
group = nvimrc,
callback = function()
vim.o.path = vim.o.path .. ",**/*"
end
})
path
中可以添加多个路径作为文件搜索的路径,多个路径之间以 ,
分割。我们之前说过可以使用 **/*
表示当前目录下所有文件。这样退出重新进入 nvim
之后不需要再次手动输入 path
了。
在lua中执行vim命令
在 0.7以前的版本中无法通过上述api来创建自动命令。但是它提供了执行vim命令的接口。
我们可以使用 vim.cmd
来执行 vim
命令。它接收一个字符串参数,该字符串表示将要执行的 vim
命令。可以使用引号括起来,但是需要对其中的特殊字符进行转义。也可以使用 [[]]
来括起来,此时就不需要进行转义了。使用上述函数我们可以很轻松的实现上面的功能
vim.cmd[[
augroup NVIMRC
autocmd!
autocmd BufWritePost init.lua source %
autocmd BufReadPost init.lua set path+=**/*
augroup END
]]
两种方式各有千秋,但是既然使用 lua做配置,那么我想的是能使用 lua的地方尽量用 lua。
为了照顾还在使用 0.6 版本的小伙伴,我们先进行一下版本判断。最后的代码如下所示
if vim.fn.has "nvim-0.7" then
local nvimrc = vim.api.nvim_create_augroup("NVIMRC", {clear = true})
vim.api.nvim_create_autocmd({"BufWritePost"}, {
pattern = "init.lua",
group = nvimrc,
command = "source %"
})
vim.api.nvim_create_autocmd({"BufWritePost"}, {
pattern = "init.lua",
group = nvimrc,
callback = function()
vim.o.path = vim.o.path .. ",**/*"
end
})
else
vim.cmd[[
augroup NVIMRC
autocmd!
autocmd BufWritePost init.lua source %
autocmd BufReadPost init.lua set path+=**/*
augroup END
]]
end
我将这段代码放到了 lua/autocmd.lua
中。所以我需要在 init.lua
中加载这个文件
require("autocmd")
插件管理
在新版 neovim
(版本大于 0.5
) 中,一般推荐使用 packer 这个插件管理工具。
根据官方的描述,我们使用如下方式来进行安装
git clone --depth 1 https://github.com/wbthomason/packer.nvim\
~/.local/share/nvim/site/pack/packer/start/packer.nvim
根据官方的描述,我们可以在 lua/plugins.lua
中添加插件管理相关的代码。
return require('packer').startup(function(use)
-- Packer can manage itself
use 'wbthomason/packer.nvim'
-- 添加另外插件
end)
接着我们需要在 init.lua
中加载这个文件
require("plugins")
后面我们可以使用下面的一些命令来对插件进行管理
-
PackerInstall
:先清理不需要的插件然后安装插件 -
PackerClean
: 清理不需要的插件 -
PackerUpdate
:先清理插件,然后更新已有的插件,再安装暂时没有的插件 -
PackerSync
: 包括PackerClean
和PackerUpdate
的功能
根据官方的描述,不管是要增删改哪些插件,都可以用 PackerSync
这一条命令搞定。
完成之后我们可以使用 q来退出,如果出错可以使用 r来重新下载
本篇就到这里了。后面几篇文章主要通过该插件管理工具来下载并配置一些插件,敬请期待!