跳至内容

插件管理器

NvChad 2.0 中的插件管理由 folke/lazy.nvim 完成,该插件在引导程序过程中的第一次安装期间安装。该插件允许您对插件执行所有常见操作,例如安装、更新等。

Lazy Nvim

主要功能

  • 从统一界面管理对插件的所有操作。
  • 由于缓存和 Lua 模块字节码的编译,插件性能得到优化。
  • 在启动时自动检查和安装缺少的插件,这是在将配置从一台机器传输到另一台机器时非常有用的功能。
  • 用于咨询插件加载时间的探查器。允许您监控和解决由故障插件引起的故障问题。
  • 通过在 lazy-lock.json 文件中存储所有已安装插件的版本来同步多个工作站上的插件。

初步操作

lazy.nvim 集成了一个环境健康检查功能,可以使用命令 :checkhealth lazy 调用。该命令应在新的缓冲区中返回类似于以下内容的内容

lazy: require("lazy.health").check()
========================================================================
## lazy.nvim
  - OK: Git installed
  - OK: no existing packages found by other package managers
  - OK: packer_compiled.lua not found
  - WARNING: {nvim-lspconfig}: overriding <config>

虽然不是严格必要,但在我们开始编写自定义配置之前检查构建环境,可以让我们排除插件本身或编写其配置时可能出现的任何错误或故障。

您可能还希望咨询插件本身提供的内联帮助。要打开它,我们可以使用 :Lazy help 命令,或者通过在插件界面中键入 ? 来调用它。

Lazy Help

帮助提供有关界面导航、控件及其功能的介绍。

现在,在检查了环境并掌握了基本知识后,我们可以继续创建自己的配置。目的显然是向编辑器添加功能以满足我们的需求,并且由于这是通过在 NvChad 配置中包含插件来实现的,因此我们将从添加插件开始。

插入插件

虽然可以通过 lazy.nvim 界面方便地管理已安装的插件,但插入新插件需要手动编辑 lua/plugins/init.lua 文件。

在这个例子中,我们将安装 natecraddock/workspaces.nvim 插件。该插件允许您保存并稍后使用工作会话(工作区),以便您可以快速访问它们。我们使用以下命令打开文件

nvim ~/.config/nvim/lua/plugins/init.lua

我们在插件 better-escape.nvim 之后插入以下代码

    -- Workspaces
    {
        "natecraddock/workspaces.nvim",
        cmd = { "WorkspacesList", "WorkspacesAdd", "WorkspacesOpen", "WorkspacesRemove" },
        config = function()
            require("workspaces").setup {
        hooks = {
            open = "Telescope find_files",
        },
      }
    end,
    },

保存文件后,我们会收到一条通知,要求我们确认

# Config Change Detected. Reloading...

- **changed**: `lua/plugins/init.lua`

这得益于 lazy.nvim 中内置的机制,该机制会检查插件及其配置的状态,从而允许在不退出编辑器的情况下执行插件操作。

当然我们会回答“是”。

现在,如果我们使用 :Lazy 命令打开插件管理器,我们会发现我们的插件已被识别并已准备安装。要安装它,只需键入 I

Install Plugin

此时,lazy.nvim 将负责在路径 .local/share/nvim/lazy/ 中下载仓库并执行构建。安装完成后,我们将有一个名为 workspaces.nvim 的新文件夹

.local/share/nvim/lazy/workspaces.nvim/
├── CHANGELOG.md
├── doc
│   ├── tags
│   └── workspaces.txt
├── LICENSE
├── lua
│   ├── telescope
│   │   └── _extensions
│   │       └── workspaces.lua
│   └── workspaces
│       ├── init.lua
│       └── util.lua
├── README.md
└── stylua.toml

现在我们将拥有可以通过数组中设置的命令调用的插件功能

cmd = { "WorkspacesList", "WorkspacesAdd", "WorkspacesOpen", "WorkspacesRemove" },

输入还涉及向 lazy-lock.json 文件添加一个字符串以进行状态跟踪和后续更新。lazy-lock.json 文件的功能将在下面相应的章节中介绍。

  "workspaces.nvim": { "branch": "master", "commit": "dd9574c8a6fbd4910bf298fcd1175a0222e9a09d" },

删除插件

与安装一样,从配置中删除插件需要手动编辑 lua/plugins/init.lua 文件。为了遵循示例,我们将删除新安装的插件。

我们打开编辑器,从配置中删除插件。这可以通过鼠标选择要删除的行,然后按下 x 删除它们,并按下 Ctrl + s 保存文件来方便地完成。

Remove Plugin

同样,我们会收到关于修改 init.lua 文件的通知,我们将会回答“yes”,一旦我们打开 Lazy,我们的插件将被标记为要删除。删除是通过按下 X 键来完成的。

Lazy Clean

删除插件基本上就是删除安装期间创建的文件夹。

更新插件

插件安装和配置完成后,它们将由 lazy.nvim 独立管理。要检查更新,只需打开管理器并键入 CLazy 会检查已安装插件的仓库(git fetch),然后会向我们展示一个可更新插件列表,一旦选中,就可以使用 U 一次性更新所有插件,或者在选择它们后使用 u 单个更新。

Lazy Check

注意

即使在上面的截图中没有显示,如果存在包含“重大更改”的提交的插件,这些插件将首先显示。

还可以使用 Sync 命令运行整个更新周期。从界面中键入 S 或使用 :Lazy sync 命令,我们将调用该函数,该函数由 install + clean + update 的串联组成。

更新过程,无论是单个更新还是累积更新,都会修改 lazy-lock.json 文件。特别是,提交将被修改以与 GitHub 上仓库的状态同步。

附加功能

在编写插件时,特别关注性能和代码效率,并为我们提供一种评估各种插件启动时间的方法。我们提供了一个 profiler,可以通过 :Lazy profile 命令或从界面中使用 P 键来调用。

Lazy Profiler

在这里,我们可以看到各种插件的加载时间,可以通过组合键 Ctrl + s 按配置中的条目或加载时间进行排序。我们还可以通过使用组合键 Ctrl + f 设置毫秒级的最小阈值,对插件的加载时间进行搜索。

如果编辑器速度异常缓慢,此信息对故障排除很有用。

插件还提供了对插件执行的最后操作的显示,可以通过从界面中使用 L 键或从编辑器本身使用 :Lazy log 命令来调用该显示。

Lazy Log

它还集成了一个调试功能,使我们能够检查活动的延迟加载处理程序以及模块缓存中的内容。要激活它,我们可以从界面中使用 D 键,或使用 :Lazy debug 命令调用它。

Lazy Debug

同步

Lazy.nvim 允许通过将所有已安装插件的状态存储在 json 文件中来同步所有已安装插件。在其中,为每个插件创建了一个字符串,其中包含对应于在 ~/.local/share/nvim/lazy/ 中找到的已安装插件的文件夹名称、相应的分支以及从 GitHub 仓库用于同步的提交。用于此目的的文件是位于 ~/.config/nvim 根文件夹中的 lazy-lock.json 文件。下面我们可以看到该文件的一部分

{
  "Comment.nvim": { "branch": "master", "commit": "8d3aa5c22c2d45e788c7a5fe13ad77368b783c20" },
  "LuaSnip": { "branch": "master", "commit": "025886915e7a1442019f467e0ae2847a7cf6bf1a" },
  "base46": { "branch": "v2.0", "commit": "eea1c3155a188953008bbff031893aa8cb0610e9" },
  "better-escape.nvim": { "branch": "master", "commit": "426d29708064d5b1bfbb040424651c92af1f3f64" },
  "cmp-buffer": { "branch": "main", "commit": "3022dbc9166796b644a841a02de8dd1cc1d311fa" },
  "cmp-nvim-lsp": { "branch": "main", "commit": "0e6b2ed705ddcff9738ec4ea838141654f12eeef" },
  "cmp-nvim-lua": { "branch": "main", "commit": "f3491638d123cfd2c8048aefaf66d246ff250ca6" },
  "cmp-path": { "branch": "main", "commit": "91ff86cd9c29299a64f968ebb45846c485725f23" },
  "cmp_luasnip": { "branch": "master", "commit": "18095520391186d634a0045dacaa346291096566" },
...

通过提交存储,我们可以准确地了解插件在安装或更新时在仓库中的状态。这允许我们通过 restore 函数,将它恢复到该状态或将它恢复到编辑器中的相同状态。该函数可以使用界面中的 R 键或使用 :Lazy restore 调用,将编辑器中的所有插件更新到 lazy-lock.json 文件中定义的状态。

通过将 lazy-lock.json 文件从一个稳定的配置复制到一个安全的地方,我们有能力在更新导致问题时将编辑器恢复到该状态。通过将其导出到另一个工作站,我们可以使用它来配置具有相同功能的编辑器。

如果我们将其放在版本控制下,我们可以在我们使用的所有工作站之间实现配置同步。

现在,在说明了插件管理器之后,我们可以继续分析用户界面。

作者:Franco Colussi

贡献者:Steven Spencer, Ganna Zhyrnova