diff --git a/README.md b/README.md index 372bcfd..9c552a9 100644 --- a/README.md +++ b/README.md @@ -119,9 +119,26 @@ EOF } ``` +### Trigger Events + +The `trigger_events` field of the configuration allows the user to customize at which events **auto-save** saves. +While the default are very sane and should be enough for most usecases, finetuning for extended possibilities is supported. + +It is also possible to pass a pattern to a trigger event, if you only want to execute the event on special file patterns: + +``` lua +{ + trigger_events = { + immediate_save = { + { "BufLeave", pattern = {"*.c", "*.h"} } + } + } +} +``` + ### Condition -The condition field of the configuration allows the user to exclude **auto-save** from saving specific buffers. +The `condition` field of the configuration allows the user to exclude **auto-save** from saving specific buffers. Here is an example using a helper function from `auto-save.utils.data` that disables auto-save for specified file types: diff --git a/lua/auto-save/config.lua b/lua/auto-save/config.lua index 2c52de8..f0cd01e 100644 --- a/lua/auto-save/config.lua +++ b/lua/auto-save/config.lua @@ -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 diff --git a/lua/auto-save/init.lua b/lua/auto-save/init.lua index 5ba1932..87d49a1 100644 --- a/lua/auto-save/init.lua +++ b/lua/auto-save/init.lua @@ -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 diff --git a/lua/auto-save/types.lua b/lua/auto-save/types.lua new file mode 100644 index 0000000..a37a4c3 --- /dev/null +++ b/lua/auto-save/types.lua @@ -0,0 +1,4 @@ +--- @meta + +--- @alias VerboseTriggerEvent { [1]: string, pattern?: string } +--- @alias TriggerEvent string | VerboseTriggerEvent diff --git a/lua/auto-save/utils/autocommands.lua b/lua/auto-save/utils/autocommands.lua index e33c16d..1d0adf9 100644 --- a/lua/auto-save/utils/autocommands.lua +++ b/lua/auto-save/utils/autocommands.lua @@ -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