From ebf15fc198d6c82f64c17e0b752a30fd4c3cdbc7 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Fri, 2 Dec 2022 17:01:05 +0100 Subject: [PATCH] feat: for `event=`, fire any new autocmds created by loading the plugins for the event --- lua/lazy/core/handler.lua | 77 +++++++++++++++++++++++++++++++++------ 1 file changed, 66 insertions(+), 11 deletions(-) diff --git a/lua/lazy/core/handler.lua b/lua/lazy/core/handler.lua index eb040fd..b862d02 100644 --- a/lua/lazy/core/handler.lua +++ b/lua/lazy/core/handler.lua @@ -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 + 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 +---@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 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, }) @@ -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 }) @@ -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, }) @@ -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 })