跳至内容

插件管理器

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

Lazy Nvim

主要功能

  • 通过统一的界面管理对插件的所有操作。
  • 通过缓存和编译 Lua 模块字节码来优化插件性能。
  • 启动时自动检查并安装缺失的插件,这是一个非常有用的功能,尤其是在将配置从一台机器传输到另一台机器时。
  • 用于查看插件加载时间的剖析器。它允许您监控和排除由 faulty 插件引起的问题。
  • 通过将所有已安装插件的版本存储在 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 内置的机制,该机制会检查插件及其配置的状态,从而允许在不退出编辑器的情况下执行对插件的操作。

当然,我们将回答“yes”。

现在,如果我们使用 :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

注意

即使在上面的屏幕截图中没有显示,如果存在包含“breaking changes”提交的插件,它们将首先显示。

还可以通过 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