@@ -29,23 +29,79 @@ function M.setup()
29
29
end
30
30
end
31
31
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
+
32
72
--- @type table<string , LazyHandler>
33
73
M .handlers = {}
34
74
function M .handlers .event (grouped )
35
75
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 })
40
82
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 , {
43
86
group = group ,
44
87
once = true ,
45
88
pattern = pattern ,
46
89
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 )
49
105
Util .track ()
50
106
end ,
51
107
})
55
111
56
112
function M .handlers .keys (grouped )
57
113
for keys , plugins in pairs (grouped ) do
58
- --- @cast keys string
59
114
vim .keymap .set (" n" , keys , function ()
60
115
vim .keymap .del (" n" , keys )
61
116
Util .track ({ keys = keys })
69
124
function M .handlers .ft (grouped )
70
125
local group = vim .api .nvim_create_augroup (" lazy_handler_ft" , { clear = true })
71
126
for ft , plugins in pairs (grouped ) do
72
- --- @cast ft string
73
127
vim .api .nvim_create_autocmd (" FileType" , {
74
128
once = true ,
75
129
pattern = ft ,
76
130
group = group ,
77
131
callback = function ()
78
132
Util .track ({ ft = ft })
133
+ local groups = M .get_augroups (" FileType" , ft )
79
134
Loader .load (plugins , { ft = ft })
135
+ M .trigger (groups , " FileType" , ft )
80
136
Util .track ()
81
137
end ,
82
138
})
85
141
86
142
function M .handlers .cmd (grouped )
87
143
for cmd , plugins in pairs (grouped ) do
88
- --- @cast cmd string
89
144
local function _load ()
90
145
vim .api .nvim_del_user_command (cmd )
91
146
Util .track ({ cmd = cmd })
0 commit comments