介绍
**lazy.nvim ** 是最流行的插件管理工具,它具有高度的结构化,简单易用,并且稳定高效,完全超越了上一代流行的 packer.nvim 。
而 LazyVim 则是应运而生的插件配置集合,它集成了 Neovim 生态下最常见的插件及流行的配置,极大的方便了 Neovim 的新人上手使用。
为了更好的对自己的 Neovim 进行定制化,了解这两个项目的一些基础运作原理是非常有帮助的。这篇文章以 lazy.nvim 的 setup()
入口函数为视角,对它进行简单的剖析,为以后更深入的定制化操作打好基础。
案例
下面是一个最典型的配置方式:
lua
require("lazy").setup({
spec = {
{ "LazyVim/LazyVim", import = "lazyvim.plugins" },
{ import = "v.plugins" },
},
defaults = {
lazy = true,
version = false, -- always use the latest git commit
},
install = { colorscheme = { "tokyonight", "habamax" } },
}
解释:
当我们在 spec 中指定了 spec 为 { "LazyVim/LazyVim", import = "lazyvim.plugins" } 后,这个 spec 会传给 lazy.nvim 解析并处理,lazy.nvim 会把 LazyVim 作为模块名(module name),并且在 rtp 中加入该项目路径。
我们可以看下 require("lazy.core.config").spec.plugins 的结构是怎么样的:
可以看到,我们可以通过 require("lazy.core.config").spec.plugins.LazyVim 的方式访问到 LazyVim 项目的信息,包括 dir, name 等信息。
而对于其他的安装的 plugins,我们也是可以看到的:
可以看到,一旦 lazy.nvim 的 setup() 流程完成,那么所有 plugins 目录中的插件配置信息都会被载入到 lazy.core.config.spec.plugins
字段中,我们可以用 lazy.plugins() 的方法打印出来,比如:
lua
-- for debug purpose
local function debug_plugins()
vim.api.nvim_create_autocmd("VimEnter", {
callback = function()
vim.schedule(function()
local lazy = require("lazy")
local plugins = lazy.plugins()
local file = io.open(vim.fn.stdpath("data") .. "/lazy/all_plugins.lua", "w")
if file then
file:write(vim.inspect(plugins))
file:close()
print("Plugins data written to " .. vim.fn.stdpath("data") .. "/lazy/all_plugins.lua")
else
print("Failed to write plugins data")
end
end)
end,
})
end
spec 字段中的 import 语句解析
-
The import field tells lazy.nvim to load plugin specifications from the "lazyvim.plugins" module.
-
This module is typically a directory containing multiple Lua files, each defining one or more plugins.
后面的 "lazyvim.plugins" 是表示要处理的模块的名字,它是一个具体的目录,比如,这里就是 LazyVim/lua/lazyvim/plugins 目录。这个目录里面的每个文件都返回一个 table,表示每个 plugin 的 specification。所有的 tables 都保存在
lazy.core.config.spec.plugins 中,以你具体的 plugin name 为每个 table 的 name。
需要注意的是:所有 plugins 最终 spec 都是 normalize 之后的样子。 另外,lazy.core.cache.plugins 中也会保存一份,方便快速导入。
好了,入口函数就先简单介绍到这里,后续会继续更新相关的文章,深入探索这两个工具。
如果你喜欢我的文章,请关注我的公众号 deliverit。