之前我們介紹了基礎配置部分和快捷鍵配置部分。如果你配置了這兩個部分,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來重新下載
本篇就到這里了。后面幾篇文章主要通過該插件管理工具來下載并配置一些插件,敬請期待!