diff --git a/plugins/telescope/default.nix b/plugins/telescope/default.nix index 25e74c4c..a9079c96 100644 --- a/plugins/telescope/default.nix +++ b/plugins/telescope/default.nix @@ -15,6 +15,7 @@ in { ./fzy-native.nix ./media-files.nix ./project-nvim.nix + ./undo.nix ]; # TODO:add support for aditional filetypes. This requires autocommands! diff --git a/plugins/telescope/undo.nix b/plugins/telescope/undo.nix new file mode 100644 index 00000000..a7070940 --- /dev/null +++ b/plugins/telescope/undo.nix @@ -0,0 +1,137 @@ +{ + pkgs, + config, + lib, + ... +}: +with lib; let + cfg = config.plugins.telescope.extensions.undo; + helpers = import ../helpers.nix {inherit lib;}; +in { + options.plugins.telescope.extensions.undo = { + enable = mkEnableOption "undo"; + + package = helpers.mkPackageOption "telescope extension undo" pkgs.vimPlugins.telescope-undo-nvim; + + useDelta = mkOption { + type = types.nullOr types.bool; + description = '' + When set to true, [delta](https://github.com/dandavison/delta) is used for fancy diffs in the preview section. + If set to false, `telescope-undo` will not use `delta` even when available and fall back to a plain diff with + treesitter highlights. + ''; + default = true; + }; + + useCustomCommand = mkOption { + type = types.nullOr (types.listOf types.str); + description = '' + should be in this format: [ "bash" "-c" "echo '$DIFF' | delta" ] + ''; + default = null; + }; + + sideBySide = mkOption { + type = types.nullOr types.bool; + description = '' + If set to true tells `delta` to render diffs side-by-side. Thus, requires `delta` to be + used. Be aware that `delta` always uses its own configuration, so it might be that you're getting + the side-by-side view even if this is set to false. + ''; + default = false; + }; + + diffContextLines = mkOption { + type = with types; + either ints.unsigned str; + description = ''Defaults to the scrolloff''; + default = "vim.o.scrolloff"; + }; + + entryFormat = mkOption { + type = types.nullOr types.str; + description = ''The format to show on telescope for the different versions of the file.''; + default = "state #$ID, $STAT, $TIME"; + }; + + timeFormat = mkOption { + type = types.nullOr types.str; + description = '' + Can be set to a [Lua date format string](https://www.lua.org/pil/22.1.html). + ''; + default = ""; + }; + + mappings = { + i = + helpers.defaultNullOpts.mkNullable + ( + with types; + attrsOf str + ) + '' + { + "" = "yank_additions"; + "" = "yank_deletions"; + "" = "restore"; + } + '' + "Keymaps in insert mode"; + n = + helpers.defaultNullOpts.mkNullable + ( + with types; + attrsOf str + ) + '' + { + "y" = "yank_additions"; + "Y" = "yank_deletions"; + "u" = "restore"; + } + '' + "Keymaps in normal mode"; + }; + }; + + config = let + configuration = with cfg; { + use_delta = useDelta; + use_custom_command = useCustomCommand; + side_by_side = sideBySide; + diff_context_lines = + if isInt diffContextLines + then helpers.mkRaw "diffContextLines" + else diffContextLines; + entry_format = entryFormat; + time_format = timeFormat; + mappings = with mappings; { + i = + helpers.ifNonNull' i + ( + mapAttrs + (key: action: + helpers.mkRaw "require('telescope-undo.actions').${action}") + i + ); + + n = + helpers.ifNonNull' n + ( + mapAttrs + (key: action: + helpers.mkRaw "require('telescope-undo.actions').${action}") + n + ); + }; + }; + in + mkIf + cfg.enable + { + extraPlugins = [cfg.package]; + + plugins.telescope.enabledExtensions = ["undo"]; + plugins.telescope.extensionConfig."undo" = configuration; + }; +} diff --git a/tests/test-sources/plugins/telescope/undo.nix b/tests/test-sources/plugins/telescope/undo.nix new file mode 100644 index 00000000..6fef0028 --- /dev/null +++ b/tests/test-sources/plugins/telescope/undo.nix @@ -0,0 +1,34 @@ +{ + empty = { + plugins.telescope.enable = true; + }; + + example = { + plugins.telescope = { + enable = true; + + extensions.undo = { + enable = true; + + useDelta = true; + useCustomCommand = ["bash" "-c" "echo '$DIFF' | delta"]; + sideBySide = true; + diffContextLines = 8; + entryFormat = "state #$ID"; + timeFormat = "!%Y-%m-%dT%TZ"; + mappings = { + i = { + "" = "yank_additions"; + "" = "yank_deletions"; + "" = "restore"; + }; + n = { + "y" = "yank_additions"; + "Y" = "yank_deletions"; + "u" = "restore"; + }; + }; + }; + }; + }; +}