lazy.nvim 和 LazyVim 入口函数简单分析

介绍

**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。

相关推荐
Hello World . .10 小时前
数据结构:栈和队列
c语言·开发语言·数据结构·vim
-Try hard-13 小时前
数据结构 | 双向链表、双向循环链表、栈
数据结构·链表·vim
-Try hard-1 天前
数据结构|概念及单向有头链表
数据结构·算法·vim
cooldream20091 天前
Vim 报错 E325:swap 文件冲突的原理、处理流程与彻底避免方案
linux·编辑器·vim
-Try hard-1 天前
数据结构:链表常见的操作方法!!
数据结构·算法·链表·vim
Hello World . .2 天前
数据结构:链表(2)
c语言·数据结构·vim
森叶2 天前
Node.js 跨进程通信(IPC)深度进阶:从“杀人”的 kill 到真正的信号
node.js·编辑器·vim
学嵌入式的小杨同学2 天前
【Linux 实战】Makefile 自动化构建进阶:静态库 / 动态库通用模板(一键编译 + 系统安装)
linux·开发语言·git·vscode·spring·vim·ux
iFlow_AI2 天前
将iFlow CLI装进u盘,即插即用
linux·编辑器·vim·ai编程·u盘·iflow·iflow cli
Hello World . .3 天前
数据结构:数据结构基础、顺序表、链表
c语言·数据结构·vim