plugins/auto-save: switch to mkNeovimPlugin

This commit is contained in:
Nikita Shirokov 2024-06-22 04:17:31 +07:00
parent 54207d1eff
commit 49452662b7
3 changed files with 180 additions and 129 deletions

View file

@ -6,30 +6,62 @@
... ...
}: }:
with lib; with lib;
let helpers.neovim-plugin.mkNeovimPlugin config {
cfg = config.plugins.auto-save; name = "auto-save";
in originalName = "auto-save.nvim";
{ defaultPackage = pkgs.vimPlugins.auto-save-nvim;
options.plugins.auto-save = helpers.neovim-plugin.extraOptionsOptions // {
enable = mkEnableOption "auto-save";
package = helpers.mkPluginPackageOption "auto-save" pkgs.vimPlugins.auto-save-nvim; maintainers = [ helpers.maintainers.braindefender ];
keymaps = { # TODO: introduced 2024-06-21, remove after 24.11
silent = mkOption { deprecateExtraOptions = true;
type = types.bool; optionsRenamedToSettings = [
description = "Whether auto-save keymaps should be silent."; [
default = false; "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 = "<leader>s"; action = "<cmd>ASToggle<CR>"; }
];
'')
];
settingsOptions = {
enabled = helpers.defaultNullOpts.mkBool true ''
Whether to start auto-save when the plugin is loaded. 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 = message =
helpers.defaultNullOpts.mkStr 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. This can be a lua function that returns a string.
''; '';
@ -48,97 +80,101 @@ in
1 1
) 0.18 "Dim the color of `message`."; ) 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 Time (in milliseconds) to wait before automatically cleaning MsgArea after displaying
`message`. `message`.
See `:h MsgArea`. See `:h MsgArea`.
''; '';
}; };
triggerEvents = trigger_events = {
immediate_save =
helpers.defaultNullOpts.mkListOf types.str
[
"BufLeave"
"FocusLost"
]
''
Vim events that trigger an immediate save.\
See `:h events` for events description.
'';
defer_save =
helpers.defaultNullOpts.mkListOf types.str helpers.defaultNullOpts.mkListOf types.str
[ [
"InsertLeave" "InsertLeave"
"TextChanged" "TextChanged"
] ]
'' ''
Vim events that trigger auto-save. Vim events that trigger a deferred save (saves after `debounceDelay`).\
See `:h events`. See `:h events` for events description.
''; '';
condition = cancel_defered_save = helpers.defaultNullOpts.mkListOf types.str [ "InsertEnter" ] ''
helpers.defaultNullOpts.mkLuaFn 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) function(buf)
local fn = vim.fn local fn = vim.fn
local utils = require("auto-save.utils.data") local utils = require("auto-save.utils.data")
if if utils.not_in(fn.getbufvar(buf, "&filetype"), {}) then
fn.getbufvar(buf, "&modifiable") == 1 and utils.not_in(fn.getbufvar(buf, "&filetype"), {}) then return true
return true -- met condition(s), can save
end end
return false -- can't save return false
end 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
''; '';
};
writeAllBuffers = helpers.defaultNullOpts.mkBool false '' write_all_buffers = helpers.defaultNullOpts.mkBool false ''
Write all buffers when the current one meets `condition`. 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. Saves the file at most every `debounce_delay` milliseconds.
''; '';
callbacks = debug = helpers.defaultNullOpts.mkBool false ''
mapAttrs (name: desc: helpers.mkNullOrLuaFn "The code of the function that runs ${desc}.") Log debug messages to `auto-save.log` file in NeoVim cache directory.
{
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";
};
};
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 ];
extraConfigLua = ''
require('auto-save').setup(${helpers.toLuaObject options})
''; '';
keymaps =
with cfg.keymaps;
optional (toggle != null) {
mode = "n";
key = toggle;
action = ":ASToggle<CR>";
options.silent = cfg.keymaps.silent;
}; };
settingsExample = {
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;
}; };
} }

View file

@ -3,47 +3,61 @@
plugins.auto-save.enable = true; 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 = { defaults = {
plugins.auto-save = { plugins.auto-save = {
enable = true; enable = true;
keymaps = { settings = {
silent = true; enabled = true;
toggle = "<leader>s"; execution_message = {
}; enabled = true;
enableAutoSave = true; dim = 0.18;
executionMessage = { cleaning_interval = 1250;
message.__raw = '' message.__raw = ''
function() function()
return ("AutoSave: saved at " .. vim.fn.strftime("%H:%M:%S")) return ("AutoSave: saved at " .. vim.fn.strftime("%H:%M:%S"))
end end
''; '';
dim = 0.18;
cleaningInterval = 1250;
}; };
triggerEvents = [ trigger_events = {
immediate_save = [
"BufLeave"
"FocusLost"
];
defer_save = [
"InsertLeave" "InsertLeave"
"TextChanged" "TextChanged"
]; ];
condition = '' cancel_defered_save = [ "InsertEnter" ];
function(buf) };
local fn = vim.fn condition = null;
local utils = require("auto-save.utils.data") write_all_buffers = false;
noautocmd = false;
if fn.getbufvar(buf, "&modifiable") == 1 and utils.not_in(fn.getbufvar(buf, "&filetype"), {}) then lockmarks = false;
return true -- met condition(s), can save debounce_delay = 1000;
end debug = false;
return false -- can't save
end
'';
writeAllBuffers = false;
debounceDelay = 135;
callbacks = {
enabling = null;
disabling = null;
beforeAssertingSave = null;
beforeSaving = null;
afterSaving = null;
}; };
}; };
}; };

View file

@ -5,6 +5,7 @@ darcula = "darcula" # base16-list
Parm = "Parm" # clangd-extensions Parm = "Parm" # clangd-extensions
Definitons = "Definitons" # TODO: ./plugins/languages/treesitter/treesitter-refactor.nix Definitons = "Definitons" # TODO: ./plugins/languages/treesitter/treesitter-refactor.nix
deffered = "deffered" # TODO: ./plugins/utils/vim-matchup.nix deffered = "deffered" # TODO: ./plugins/utils/vim-matchup.nix
defered = "defered" # ./plugins/utils/auto-save.nix
Highligt = "Highligt" # TODO: ./plugins/utils/neogen.nix Highligt = "Highligt" # TODO: ./plugins/utils/neogen.nix
Annote = "Annote" # TODO: ./plugins/lsp/fidget.nix Annote = "Annote" # TODO: ./plugins/lsp/fidget.nix
ket = "ket" # ./plugins/utils/sandwich.nix ket = "ket" # ./plugins/utils/sandwich.nix