Skip to content

Commit

Permalink
feat: for event=, fire any new autocmds created by loading the plug…
Browse files Browse the repository at this point in the history
…ins for the event
  • Loading branch information
folke committed Dec 2, 2022
1 parent e4cf8b1 commit ebf15fc
Showing 1 changed file with 66 additions and 11 deletions.
77 changes: 66 additions & 11 deletions lua/lazy/core/handler.lua
Original file line number Diff line number Diff line change
Expand Up @@ -29,23 +29,79 @@ function M.setup()
end
end

---@param events string|string[]
---@param pattern? string
function M.get_augroups(events, pattern)
-- Check for all autocmd groups listening for the events
---@type table<string,true>
local groups = {}
for _, autocmd in ipairs(vim.api.nvim_get_autocmds({ event = events, pattern = pattern })) do
if autocmd.group then
groups[autocmd.group] = true
end
end
return groups
end

---@param groups table<string,true>
---@param events string|string[]
---@param pattern? string
function M.trigger(groups, events, pattern)
events = type(events) == "string" and { events } or events
---@cast events string[]
for _, event in ipairs(events) do
for _, autocmd in ipairs(vim.api.nvim_get_autocmds({ event = event, pattern = pattern })) do
if autocmd.event == event and autocmd.group and not groups[autocmd.group] then
if Config.options.debug then
local lines = {
"# Firing Events",
" - **event:** " .. autocmd.event,
" - **group:** `" .. autocmd.group_name .. "`",
}
if pattern then
table.insert(lines, 2, "- **pattern:** " .. pattern)
end
Util.info(lines)
end
vim.api.nvim_exec_autocmds(autocmd.event, { group = autocmd.group, modeline = false })
end
end
end
end

---@type table<string, LazyHandler>
M.handlers = {}
function M.handlers.event(grouped)
local group = vim.api.nvim_create_augroup("lazy_handler_event", { clear = true })
for event, plugins in pairs(grouped) do
---@cast event string
if event == "VimEnter" and vim.v.vim_did_enter == 1 then
Loader.load(plugins, { event = event })
for event_spec, plugins in pairs(grouped) do
if event_spec == "VeryLazy" then
event_spec = "User VeryLazy"
end
if event_spec == "VimEnter" and vim.v.vim_did_enter == 1 then
Loader.load(plugins, { event = event_spec })
else
local _event, pattern = event:match("^(%w+)%s+(.*)$")
vim.api.nvim_create_autocmd(_event or event, {
local event, pattern = event_spec:match("^(%w+)%s+(.*)$")
event = event or event_spec
vim.api.nvim_create_autocmd(event, {
group = group,
once = true,
pattern = pattern,
callback = function()
Util.track({ event = event })
Loader.load(plugins, { event = event })
Util.track({ event = event_spec })
local events = { event }
if event == "BufRead" then
events = { "BufReadPre", "BufRead" }
elseif event == "BufReadPost" then
events = { "BufReadPre", "BufRead", "BufReadPost" }
end

local groups = M.get_augroups(events, pattern)

-- load the plugins
Loader.load(plugins, { event = event_spec })

-- check if any plugin created an event handler for this event and fire the group
M.trigger(groups, events, pattern)
Util.track()
end,
})
Expand All @@ -55,7 +111,6 @@ end

function M.handlers.keys(grouped)
for keys, plugins in pairs(grouped) do
---@cast keys string
vim.keymap.set("n", keys, function()
vim.keymap.del("n", keys)
Util.track({ keys = keys })
Expand All @@ -69,14 +124,15 @@ end
function M.handlers.ft(grouped)
local group = vim.api.nvim_create_augroup("lazy_handler_ft", { clear = true })
for ft, plugins in pairs(grouped) do
---@cast ft string
vim.api.nvim_create_autocmd("FileType", {
once = true,
pattern = ft,
group = group,
callback = function()
Util.track({ ft = ft })
local groups = M.get_augroups("FileType", ft)
Loader.load(plugins, { ft = ft })
M.trigger(groups, "FileType", ft)
Util.track()
end,
})
Expand All @@ -85,7 +141,6 @@ end

function M.handlers.cmd(grouped)
for cmd, plugins in pairs(grouped) do
---@cast cmd string
local function _load()
vim.api.nvim_del_user_command(cmd)
Util.track({ cmd = cmd })
Expand Down

0 comments on commit ebf15fc

Please sign in to comment.