From 49452662b7b4dd2467cbac19e0f9820d570d8976 Mon Sep 17 00:00:00 2001 From: Nikita Shirokov Date: Sat, 22 Jun 2024 04:17:31 +0700 Subject: [PATCH] plugins/auto-save: switch to mkNeovimPlugin --- plugins/utils/auto-save.nix | 220 ++++++++++-------- .../test-sources/plugins/utils/auto-save.nix | 88 ++++--- typos.toml | 1 + 3 files changed, 180 insertions(+), 129 deletions(-) diff --git a/plugins/utils/auto-save.nix b/plugins/utils/auto-save.nix index d1d5410f..06c8b606 100644 --- a/plugins/utils/auto-save.nix +++ b/plugins/utils/auto-save.nix @@ -6,30 +6,62 @@ ... }: with lib; -let - cfg = config.plugins.auto-save; -in -{ - options.plugins.auto-save = helpers.neovim-plugin.extraOptionsOptions // { - enable = mkEnableOption "auto-save"; +helpers.neovim-plugin.mkNeovimPlugin config { + name = "auto-save"; + originalName = "auto-save.nvim"; + defaultPackage = pkgs.vimPlugins.auto-save-nvim; - package = helpers.mkPluginPackageOption "auto-save" pkgs.vimPlugins.auto-save-nvim; + maintainers = [ helpers.maintainers.braindefender ]; - keymaps = { - silent = mkOption { - type = types.bool; - description = "Whether auto-save keymaps should be silent."; - default = false; - }; + # TODO: introduced 2024-06-21, remove after 24.11 + deprecateExtraOptions = true; + optionsRenamedToSettings = [ + [ + "executionMessage" + "message" + ] + [ + "executionMessage" + "dim" + ] + [ + "executionMessage" + "cleaningInterval" + ] + "triggerEvents" + "writeAllBuffers" + "debounceDelay" + ]; - toggle = helpers.mkNullOrOption types.str "Keymap for running auto-save."; - }; + imports = + let + basePluginPath = [ + "plugins" + "auto-save" + ]; + settingsPath = basePluginPath ++ [ "settings" ]; + in + [ + (mkRenamedOptionModule (basePluginPath ++ [ "enableAutoSave" ]) (settingsPath ++ [ "enabled" ])) + (mkRemovedOptionModule (basePluginPath ++ [ "keymaps" ]) '' + Use the top-level `keymaps` option to create a keymap that runs :ASToggle - enableAutoSave = helpers.defaultNullOpts.mkBool true '' + keymaps = [ + { key = "s"; action = "ASToggle"; } + ]; + '') + ]; + + settingsOptions = { + enabled = helpers.defaultNullOpts.mkBool true '' Whether to start auto-save when the plugin is loaded. ''; - executionMessage = { + execution_message = { + enabled = helpers.defaultNullOpts.mkBool true '' + Show execution message after successful auto-save. + ''; + message = helpers.defaultNullOpts.mkStr { @@ -40,7 +72,7 @@ in ''; } '' - The message to print en save. + The message to print on save. This can be a lua function that returns a string. ''; @@ -48,97 +80,101 @@ in 1 ) 0.18 "Dim the color of `message`."; - cleaningInterval = helpers.defaultNullOpts.mkInt 1250 '' + cleaning_interval = helpers.defaultNullOpts.mkUnsignedInt 1250 '' Time (in milliseconds) to wait before automatically cleaning MsgArea after displaying `message`. See `:h MsgArea`. ''; }; - triggerEvents = - helpers.defaultNullOpts.mkListOf types.str - [ - "InsertLeave" - "TextChanged" - ] - '' - Vim events that trigger auto-save. - See `:h events`. - ''; + trigger_events = { + immediate_save = + helpers.defaultNullOpts.mkListOf types.str + [ + "BufLeave" + "FocusLost" + ] + '' + Vim events that trigger an immediate save.\ + See `:h events` for events description. + ''; - condition = - helpers.defaultNullOpts.mkLuaFn - '' - function(buf) - local fn = vim.fn - local utils = require("auto-save.utils.data") + defer_save = + helpers.defaultNullOpts.mkListOf types.str + [ + "InsertLeave" + "TextChanged" + ] + '' + Vim events that trigger a deferred save (saves after `debounceDelay`).\ + See `:h events` for events description. + ''; - if - fn.getbufvar(buf, "&modifiable") == 1 and utils.not_in(fn.getbufvar(buf, "&filetype"), {}) then - return true -- met condition(s), can save - end - return false -- can't save + cancel_defered_save = helpers.defaultNullOpts.mkListOf types.str [ "InsertEnter" ] '' + Vim events that cancel a pending deferred save.\ + See `:h events` for events description. + ''; + }; + + condition = helpers.defaultNullOpts.mkLuaFn' { + pluginDefault = null; + description = '' + Function that determines whether to save the current buffer or not. + - return true: if buffer is ok to be saved + - return false: if it's not ok to be saved + + In this example, the second argument of `utils.not_in(..., {})` + determines which filetypes will be ignored by auto-save plugin. + + Buffers that are `nomodifiable` are not saved by default. + ''; + example = '' + function(buf) + local fn = vim.fn + local utils = require("auto-save.utils.data") + + if utils.not_in(fn.getbufvar(buf, "&filetype"), {}) then + return true end - '' - '' - Function that determines whether to save the current buffer or not. - - return true: if buffer is ok to be saved - - return false: if it's not ok to be saved - ''; + return false + end + ''; + }; - writeAllBuffers = helpers.defaultNullOpts.mkBool false '' + write_all_buffers = helpers.defaultNullOpts.mkBool false '' Write all buffers when the current one meets `condition`. ''; - debounceDelay = helpers.defaultNullOpts.mkInt 135 '' + noautocmd = helpers.defaultNullOpts.mkBool false '' + Do not execute autocmds when saving. + ''; + + lockmarks = helpers.defaultNullOpts.mkBool false '' + Lock marks when saving, see `:h lockmarks` for more details. + ''; + + debounce_delay = helpers.defaultNullOpts.mkUnsignedInt 1000 '' Saves the file at most every `debounce_delay` milliseconds. ''; - callbacks = - mapAttrs (name: desc: helpers.mkNullOrLuaFn "The code of the function that runs ${desc}.") - { - enabling = "when enabling auto-save"; - disabling = "when disabling auto-save"; - beforeAssertingSave = "before checking `condition`"; - beforeSaving = "before doing the actual save"; - afterSaving = "after doing the actual save"; - }; + debug = helpers.defaultNullOpts.mkBool false '' + Log debug messages to `auto-save.log` file in NeoVim cache directory. + ''; }; - config = - let - options = { - enabled = cfg.enableAutoSave; - execution_message = with cfg.executionMessage; { - inherit message dim; - cleaning_interval = cleaningInterval; - }; - trigger_events = cfg.triggerEvents; - inherit (cfg) condition; - write_all_buffers = cfg.writeAllBuffers; - debounce_delay = cfg.debounceDelay; - callbacks = with cfg.callbacks; { - inherit enabling disabling; - before_asserting_save = beforeAssertingSave; - before_saving = beforeSaving; - after_saving = afterSaving; - }; - } // cfg.extraOptions; - in - mkIf cfg.enable { - extraPlugins = [ cfg.package ]; + settingsExample = { + condition = '' + function(buf) + local fn = vim.fn + local utils = require("auto-save.utils.data") - extraConfigLua = '' - require('auto-save').setup(${helpers.toLuaObject options}) - ''; - - keymaps = - with cfg.keymaps; - optional (toggle != null) { - mode = "n"; - key = toggle; - action = ":ASToggle"; - options.silent = cfg.keymaps.silent; - }; - }; + if utils.not_in(fn.getbufvar(buf, "&filetype"), {'oil'}) then + return true + end + return false + end + ''; + write_all_buffers = true; + debounce_delay = 1000; + }; } diff --git a/tests/test-sources/plugins/utils/auto-save.nix b/tests/test-sources/plugins/utils/auto-save.nix index ae529ba3..9260bc4d 100644 --- a/tests/test-sources/plugins/utils/auto-save.nix +++ b/tests/test-sources/plugins/utils/auto-save.nix @@ -3,47 +3,61 @@ plugins.auto-save.enable = true; }; + example = { + plugins.auto-save = { + enable = true; + + settings = { + condition = '' + function(buf) + local fn = vim.fn + local utils = require("auto-save.utils.data") + + if utils.not_in(fn.getbufvar(buf, "&filetype"), {'oil'}) then + return true + end + return false + end + ''; + write_all_buffers = true; + debounce_delay = 1000; + }; + }; + }; + defaults = { plugins.auto-save = { enable = true; - keymaps = { - silent = true; - toggle = "s"; - }; - enableAutoSave = true; - executionMessage = { - message.__raw = '' - function() - return ("AutoSave: saved at " .. vim.fn.strftime("%H:%M:%S")) - end - ''; - dim = 0.18; - cleaningInterval = 1250; - }; - triggerEvents = [ - "InsertLeave" - "TextChanged" - ]; - condition = '' - function(buf) - local fn = vim.fn - local utils = require("auto-save.utils.data") - - if fn.getbufvar(buf, "&modifiable") == 1 and utils.not_in(fn.getbufvar(buf, "&filetype"), {}) then - return true -- met condition(s), can save - end - return false -- can't save - end - ''; - writeAllBuffers = false; - debounceDelay = 135; - callbacks = { - enabling = null; - disabling = null; - beforeAssertingSave = null; - beforeSaving = null; - afterSaving = null; + settings = { + enabled = true; + execution_message = { + enabled = true; + dim = 0.18; + cleaning_interval = 1250; + message.__raw = '' + function() + return ("AutoSave: saved at " .. vim.fn.strftime("%H:%M:%S")) + end + ''; + }; + trigger_events = { + immediate_save = [ + "BufLeave" + "FocusLost" + ]; + defer_save = [ + "InsertLeave" + "TextChanged" + ]; + cancel_defered_save = [ "InsertEnter" ]; + }; + condition = null; + write_all_buffers = false; + noautocmd = false; + lockmarks = false; + debounce_delay = 1000; + debug = false; }; }; }; diff --git a/typos.toml b/typos.toml index 90ebb342..dbefc290 100644 --- a/typos.toml +++ b/typos.toml @@ -5,6 +5,7 @@ darcula = "darcula" # base16-list Parm = "Parm" # clangd-extensions Definitons = "Definitons" # TODO: ./plugins/languages/treesitter/treesitter-refactor.nix deffered = "deffered" # TODO: ./plugins/utils/vim-matchup.nix +defered = "defered" # ./plugins/utils/auto-save.nix Highligt = "Highligt" # TODO: ./plugins/utils/neogen.nix Annote = "Annote" # TODO: ./plugins/lsp/fidget.nix ket = "ket" # ./plugins/utils/sandwich.nix