feat: GH-40 Add pattern to trigger_events (#42)

This commit is contained in:
Toni Müller
2023-11-08 09:30:21 +01:00
committed by GitHub
parent 610e72307d
commit 723168365b
5 changed files with 72 additions and 38 deletions

View File

@@ -12,11 +12,11 @@ Config = {
cleaning_interval = 1250, -- (milliseconds) automatically clean MsgArea after displaying `message`. See :h MsgArea
},
trigger_events = { -- See :h events
--- @type nil|string[]
--- @type TriggerEvent[]?
immediate_save = { "BufLeave", "FocusLost" }, -- vim events that trigger an immediate save
--- @type nil|string[]
--- @type TriggerEvent[]?
defer_save = { "InsertLeave", "TextChanged" }, -- vim events that trigger a deferred save (saves after `debounce_delay`)
--- @type nil|string[]
--- @type TriggerEvent[]?
cancel_defered_save = { "InsertEnter" }, -- vim events that cancel a pending deferred save
},
-- function that takes the buffer handle and determines whether to save the current buffer or not

View File

@@ -117,40 +117,33 @@ function M.on()
local augroup = autocmds.create_augroup({ clear = true })
local events = cnf.opts.trigger_events
if events.immediate_save ~= nil and #events.immediate_save > 0 then
api.nvim_create_autocmd(events.immediate_save, {
callback = function(opts)
if should_be_saved(opts.buf) then
immediate_save(opts.buf)
end
end,
group = augroup,
desc = "Immediately save a buffer",
})
end
if events.defer_save ~= nil and #events.defer_save > 0 then
api.nvim_create_autocmd(events.defer_save, {
callback = function(opts)
if should_be_saved(opts.buf) then
defer_save(opts.buf)
end
end,
group = augroup,
desc = "Save a buffer after the `debounce_delay`",
})
end
if events.cancel_defered_save ~= nil and #events.cancel_defered_save > 0 then
api.nvim_create_autocmd(events.cancel_defered_save, {
callback = function(opts)
if should_be_saved(opts.buf) then
cancel_timer(opts.buf)
end
end,
group = augroup,
desc = "Cancel a pending save timer for a buffer",
})
end
autocmds.create_autocmd_for_trigger_events(events.immediate_save, {
callback = function(opts)
if should_be_saved(opts.buf) then
immediate_save(opts.buf)
end
end,
group = augroup,
desc = "Immediately save a buffer",
})
autocmds.create_autocmd_for_trigger_events(events.defer_save, {
callback = function(opts)
if should_be_saved(opts.buf) then
defer_save(opts.buf)
end
end,
group = augroup,
desc = "Save a buffer after the `debounce_delay`",
})
autocmds.create_autocmd_for_trigger_events(events.cancel_defered_save, {
callback = function(opts)
if should_be_saved(opts.buf) then
cancel_timer(opts.buf)
end
end,
group = augroup,
desc = "Cancel a pending save timer for a buffer",
})
local function setup_dimming()
if cnf.opts.execution_message.enabled then

4
lua/auto-save/types.lua Normal file
View File

@@ -0,0 +1,4 @@
--- @meta
--- @alias VerboseTriggerEvent { [1]: string, pattern?: string }
--- @alias TriggerEvent string | VerboseTriggerEvent

View File

@@ -3,6 +3,15 @@ local M = {}
local api = vim.api
local augroup_name = "AutoSave"
--- @param event TriggerEvent
--- @return VerboseTriggerEvent
local function parse_trigger_event(event)
if type(event) == "string" then
return { event }
end
return event
end
--- @param opts? table
--- @return number
M.create_augroup = function(opts)
@@ -16,4 +25,15 @@ M.exec_autocmd = function(pattern, saved_buffer)
api.nvim_exec_autocmds("User", { pattern = pattern, data = { saved_buffer = saved_buffer } })
end
--- @param trigger_events TriggerEvent[]?
M.create_autocmd_for_trigger_events = function(trigger_events, autocmd_opts)
if trigger_events ~= nil then
for _, event in pairs(trigger_events) do
local parsed_event = parse_trigger_event(event)
local autocmd_opts_with_pattern = vim.tbl_extend("force", autocmd_opts, { pattern = parsed_event.pattern })
api.nvim_create_autocmd(parsed_event[1], autocmd_opts_with_pattern)
end
end
end
return M