如果你指的是 Neovim 的插件管理器 lazy.nvim,以下是关于延迟加载规则(Lazy-loading Rules)的完整配置指南。
基础概念
Lazy.nvim 的核心优势是按需加载,通过配置规则让插件在特定时机加载,而非启动时全部加载。
-- 基础插件配置结构
{
"用户名/仓库名",
-- 这里配置各种 lazy 规则
lazy = true, -- 是否延迟加载(默认 true)
event = "VeryLazy", -- 触发条件
keys = {...}, -- 按键触发
ft = "lua", -- 文件类型触发
cmd = "Command", -- 命令触发
}
核心规则配置
事件触发(Event)
在特定自动命令事件时加载:
{
"nvim-telescope/telescope.nvim",
-- 常用事件:BufRead, BufEnter, VeryLazy, InsertEnter
event = "BufRead",
-- 或多个事件
event = {"BufRead", "BufNewFile"},
-- 或自定义事件条件
event = function()
-- 返回事件名或 nil
if vim.fn.argc() > 0 then
return "BufRead"
end
end,
}
常用事件推荐:
VeryLazy: 启动完成后(UI加载后),适合大多数插件BufRead: 读取文件时BufReadPre: 读取文件前InsertEnter: 进入插入模式时(适合补全插件)VimEnter: 进入 Vim 时
按键映射触发(Keys)
按下特定按键时才加载:
{
"folke/flash.nvim",
keys = {
-- 模式, 按键, 执行命令, 描述
{ "s", mode = { "n", "x", "o" }, function() require("flash").jump() end, desc = "Flash" },
{ "S", mode = { "n", "x", "o" }, function() require("flash").treesitter() end, desc = "Flash Treesitter" },
-- 简写形式
{ "<leader>ff", "<cmd>Telescope find_files<cr>", desc = "Find Files" },
},
-- 或者简化为仅定义按键,lazy 会自动解析
keys = {"<leader>ff", "<leader>fg"},
}
命令触发(Cmd)
执行特定 Ex 命令时加载:
{
"tpope/vim-fugitive",
cmd = { "Git", "Gwrite", "Gread", "Gdiffsplit" },
-- 或者使用函数返回命令列表
cmd = function()
return {"Git", "Gcommit"}
end,
}
文件类型触发(Ft)
打开特定类型文件时加载:
{
"nvim-treesitter/nvim-treesitter",
ft = { "lua", "python", "javascript" },
-- 或者使用函数
ft = function()
return vim.fn.expand("%:e") == "md" and "markdown" or nil
end,
}
依赖管理(Dependencies)
确保依赖先加载:
{
"nvim-telescope/telescope.nvim",
dependencies = {
"nvim-lua/plenary.nvim",
{ "nvim-telescope/telescope-fzf-native.nvim", build = "make" },
-- 依赖也可以有自己的 lazy 规则
{ "nvim-tree/nvim-web-devicons", lazy = true },
},
}
条件判断(Cond)
根据条件决定是否加载:
{
"iamcco/markdown-preview.nvim",
-- 仅当满足条件时加载
cond = function()
return vim.fn.executable("npm") == 1 and vim.g.mkdp_auto_start == 1
end,
-- 或者简单布尔值
cond = vim.fn.has("mac") == 1,
}
高级配置模式
优先级控制(Priority)
控制加载顺序(数字越大越优先):
{
"nvim-treesitter/nvim-treesitter",
priority = 1000, -- 高优先级,尽早加载
}
版本锁定(Version)
固定插件版本:
{
"neovim/nvim-lspconfig",
version = "v0.1.7", -- 标签、commit 或分支
pin = true, -- 锁定,不随 update 改变
}
自定义配置时机(Config)
加载后执行的配置:
{
"folke/which-key.nvim",
event = "VeryLazy",
config = function()
-- 插件加载后执行
require("which-key").setup({
-- 配置项
})
end,
-- 或者简写(如果配置简单)
opts = { preset = "modern" },
-- init 在加载前执行(用于设置全局变量等)
init = function()
vim.o.timeout = true
vim.o.timeoutlen = 300
end,
}
完整配置示例
-- lua/plugins/example.lua
return {
-- 示例 1:延迟到读取文件后加载
{
"echasnovski/mini.nvim",
event = "BufRead",
config = function()
require("mini.ai").setup()
require("mini.surround").setup()
end,
},
-- 示例 2:按键触发 + 依赖
{
"folke/trouble.nvim",
keys = {
{ "<leader>xx", "<cmd>TroubleToggle<cr>", desc = "Toggle Trouble" },
{ "<leader>xw", "<cmd>TroubleToggle workspace_diagnostics<cr>", desc = "Workspace Diagnostics" },
},
dependencies = { "nvim-tree/nvim-web-devicons" },
opts = {}, -- 使用默认配置
},
-- 示例 3:文件类型特定 + 构建命令
{
"iamcco/markdown-preview.nvim",
ft = "markdown",
build = function() vim.fn["mkdp#util#install"]() end,
cmd = { "MarkdownPreview", "MarkdownPreviewStop" },
},
-- 示例 4:条件加载(仅在工作环境)
{
"github/copilot.vim",
cond = function()
-- 只在特定目录或环境加载
local cwd = vim.fn.getcwd()
return vim.fn.executable("node") == 1 and cwd:match("work")
end,
event = "InsertEnter",
},
}
性能优化建议
-
避免过早加载:尽量使用
event = "VeryLazy"而非lazy = false -
按键优于命令:
keys比cmd更直观,且延迟加载效果相同 -
文件类型细分:语言相关插件使用
ft限制 -
检查启动时间:
:Lazy profile
-
结构化配置:按功能分文件存放(
lua/plugins/*.lua)
调试技巧
-- 查看插件加载状态 :Lazy -- 查看启动时间分析 :Lazy profile -- 强制立即加载某个插件 :Lazy load plugin-name -- 查看为什么某个插件被加载(依赖追踪) :Lazy debug
如果你指的是 LazyVim(基于 lazy.nvim 的发行版),配置方式类似,但通常通过 opts 函数修改默认行为,或覆盖 config 文件。
需要针对特定插件的配置示例吗?