Skip to content

Commit d9544c7

Browse files
authored
refactor(events): define autocmd events using lua (#1727)
1 parent 9b5d671 commit d9544c7

File tree

2 files changed

+37
-22
lines changed

2 files changed

+37
-22
lines changed

lua/neo-tree/events/init.lua

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -52,39 +52,50 @@ local M = {
5252
VIM_WIN_ENTER = "vim_win_enter",
5353
}
5454

55+
---@param autocmds string
56+
---@return string event
57+
---@return string? pattern
58+
local parse_autocmd_string = function(autocmds)
59+
local parsed = vim.split(autocmds, " ")
60+
return parsed[1], parsed[2]
61+
end
62+
5563
---@param event_name neotree.Event|string
64+
---@param autocmds string[]
65+
---@param debounce_frequency integer
66+
---@param seed_fn function
67+
---@param nested boolean
5668
M.define_autocmd_event = function(event_name, autocmds, debounce_frequency, seed_fn, nested)
57-
local opts = {
69+
log.debug("Defining autocmd event: %s", event_name)
70+
local augroup_name = "NeoTreeEvent_" .. event_name
71+
q.define_event(event_name, {
5872
setup = function()
59-
local tpl =
60-
":lua require('neo-tree.events').fire_event('%s', { afile = vim.F.npcall(vim.fn.expand, '<afile>') or '' })"
61-
local callback = string.format(tpl, event_name)
62-
if nested then
63-
callback = "++nested " .. callback
73+
local augroup = vim.api.nvim_create_augroup(augroup_name, { clear = false })
74+
for _, autocmd in ipairs(autocmds) do
75+
local event, pattern = parse_autocmd_string(autocmd)
76+
log.trace("Registering autocmds on %s %s", event, pattern or "")
77+
vim.api.nvim_create_autocmd({ event }, {
78+
pattern = pattern or "*",
79+
group = augroup,
80+
nested = nested,
81+
callback = function(args)
82+
---@class neotree.Event.Autocmd.CallbackArgs : vim.api.keyset.create_autocmd.callback_args
83+
---@field afile string
84+
local event_args = args
85+
event_args.afile = args.file or ""
86+
M.fire_event(event_name, event_args)
87+
end,
88+
})
6489
end
65-
66-
local autocmd = table.concat(autocmds, ",")
67-
if not vim.startswith(autocmd, "User") then
68-
autocmd = autocmd .. " *"
69-
end
70-
local cmds = {
71-
"augroup NeoTreeEvent_" .. event_name,
72-
"autocmd " .. autocmd .. " " .. callback,
73-
"augroup END",
74-
}
75-
log.trace("Registering autocmds: %s", table.concat(cmds, "\n"))
76-
vim.cmd(table.concat(cmds, "\n"))
7790
end,
7891
seed = seed_fn,
7992
teardown = function()
8093
log.trace("Teardown autocmds for ", event_name)
81-
vim.cmd(string.format("autocmd! NeoTreeEvent_%s", event_name))
94+
vim.api.nvim_create_augroup(augroup_name, { clear = true })
8295
end,
8396
debounce_frequency = debounce_frequency,
8497
debounce_strategy = utils.debounce_strategy.CALL_LAST_ONLY,
85-
}
86-
log.debug("Defining autocmd event: %s", event_name)
87-
q.define_event(event_name, opts)
98+
})
8899
end
89100

90101
M.clear_all_events = q.clear_all_events

lua/neo-tree/events/queue.lua

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ M.destroy_event = function(event_name)
5757
return true
5858
end
5959

60+
---@param event string
61+
---@param args table
6062
local fire_event_internal = function(event, args)
6163
local queue = event_queues[event]
6264
if queue == nil then
@@ -99,6 +101,8 @@ local fire_event_internal = function(event, args)
99101
end)
100102
end
101103

104+
---@param event string
105+
---@param args table?
102106
M.fire_event = function(event, args)
103107
local freq = utils.get_value(event_definitions, event .. ".debounce_frequency", 0, true)
104108
local strategy = utils.get_value(event_definitions, event .. ".debounce_strategy", 0, true)

0 commit comments

Comments
 (0)