Skip to content

Commit ebf15fc

Browse files
committed
feat: for event=, fire any new autocmds created by loading the plugins for the event
1 parent e4cf8b1 commit ebf15fc

File tree

1 file changed

+66
-11
lines changed

1 file changed

+66
-11
lines changed

lua/lazy/core/handler.lua

+66-11
Original file line numberDiff line numberDiff line change
@@ -29,23 +29,79 @@ function M.setup()
2929
end
3030
end
3131

32+
---@param events string|string[]
33+
---@param pattern? string
34+
function M.get_augroups(events, pattern)
35+
-- Check for all autocmd groups listening for the events
36+
---@type table<string,true>
37+
local groups = {}
38+
for _, autocmd in ipairs(vim.api.nvim_get_autocmds({ event = events, pattern = pattern })) do
39+
if autocmd.group then
40+
groups[autocmd.group] = true
41+
end
42+
end
43+
return groups
44+
end
45+
46+
---@param groups table<string,true>
47+
---@param events string|string[]
48+
---@param pattern? string
49+
function M.trigger(groups, events, pattern)
50+
events = type(events) == "string" and { events } or events
51+
---@cast events string[]
52+
for _, event in ipairs(events) do
53+
for _, autocmd in ipairs(vim.api.nvim_get_autocmds({ event = event, pattern = pattern })) do
54+
if autocmd.event == event and autocmd.group and not groups[autocmd.group] then
55+
if Config.options.debug then
56+
local lines = {
57+
"# Firing Events",
58+
" - **event:** " .. autocmd.event,
59+
" - **group:** `" .. autocmd.group_name .. "`",
60+
}
61+
if pattern then
62+
table.insert(lines, 2, "- **pattern:** " .. pattern)
63+
end
64+
Util.info(lines)
65+
end
66+
vim.api.nvim_exec_autocmds(autocmd.event, { group = autocmd.group, modeline = false })
67+
end
68+
end
69+
end
70+
end
71+
3272
---@type table<string, LazyHandler>
3373
M.handlers = {}
3474
function M.handlers.event(grouped)
3575
local group = vim.api.nvim_create_augroup("lazy_handler_event", { clear = true })
36-
for event, plugins in pairs(grouped) do
37-
---@cast event string
38-
if event == "VimEnter" and vim.v.vim_did_enter == 1 then
39-
Loader.load(plugins, { event = event })
76+
for event_spec, plugins in pairs(grouped) do
77+
if event_spec == "VeryLazy" then
78+
event_spec = "User VeryLazy"
79+
end
80+
if event_spec == "VimEnter" and vim.v.vim_did_enter == 1 then
81+
Loader.load(plugins, { event = event_spec })
4082
else
41-
local _event, pattern = event:match("^(%w+)%s+(.*)$")
42-
vim.api.nvim_create_autocmd(_event or event, {
83+
local event, pattern = event_spec:match("^(%w+)%s+(.*)$")
84+
event = event or event_spec
85+
vim.api.nvim_create_autocmd(event, {
4386
group = group,
4487
once = true,
4588
pattern = pattern,
4689
callback = function()
47-
Util.track({ event = event })
48-
Loader.load(plugins, { event = event })
90+
Util.track({ event = event_spec })
91+
local events = { event }
92+
if event == "BufRead" then
93+
events = { "BufReadPre", "BufRead" }
94+
elseif event == "BufReadPost" then
95+
events = { "BufReadPre", "BufRead", "BufReadPost" }
96+
end
97+
98+
local groups = M.get_augroups(events, pattern)
99+
100+
-- load the plugins
101+
Loader.load(plugins, { event = event_spec })
102+
103+
-- check if any plugin created an event handler for this event and fire the group
104+
M.trigger(groups, events, pattern)
49105
Util.track()
50106
end,
51107
})
@@ -55,7 +111,6 @@ end
55111

56112
function M.handlers.keys(grouped)
57113
for keys, plugins in pairs(grouped) do
58-
---@cast keys string
59114
vim.keymap.set("n", keys, function()
60115
vim.keymap.del("n", keys)
61116
Util.track({ keys = keys })
@@ -69,14 +124,15 @@ end
69124
function M.handlers.ft(grouped)
70125
local group = vim.api.nvim_create_augroup("lazy_handler_ft", { clear = true })
71126
for ft, plugins in pairs(grouped) do
72-
---@cast ft string
73127
vim.api.nvim_create_autocmd("FileType", {
74128
once = true,
75129
pattern = ft,
76130
group = group,
77131
callback = function()
78132
Util.track({ ft = ft })
133+
local groups = M.get_augroups("FileType", ft)
79134
Loader.load(plugins, { ft = ft })
135+
M.trigger(groups, "FileType", ft)
80136
Util.track()
81137
end,
82138
})
@@ -85,7 +141,6 @@ end
85141

86142
function M.handlers.cmd(grouped)
87143
for cmd, plugins in pairs(grouped) do
88-
---@cast cmd string
89144
local function _load()
90145
vim.api.nvim_del_user_command(cmd)
91146
Util.track({ cmd = cmd })

0 commit comments

Comments
 (0)