diff --git a/docs/release-notes/rl-0.5.adoc b/docs/release-notes/rl-0.5.adoc index 2d02973d..530e9eef 100644 --- a/docs/release-notes/rl-0.5.adoc +++ b/docs/release-notes/rl-0.5.adoc @@ -69,3 +69,7 @@ https://github.com/jacekpoz[jacekpoz]: * Updated clangd to 16 * Disabled `useSystemClipboard` by default + +https://github.com/ksonj[ksonj]: + +* Add support to change mappings to utility/surround diff --git a/modules/utility/surround/config.nix b/modules/utility/surround/config.nix index bcd1f51f..aa7f7bde 100644 --- a/modules/utility/surround/config.nix +++ b/modules/utility/surround/config.nix @@ -6,14 +6,38 @@ with lib; with builtins; let cfg = config.vim.utility.surround; + self = import ./surround.nix {inherit lib config;}; + mappingDefinitions = self.options.vim.utility.surround.mappings; + mappings = addDescriptionsToMappings cfg.mappings mappingDefinitions; in { - config = mkIf (cfg.enable) { - vim.startPlugins = [ - "nvim-surround" - ]; + config = mkIf cfg.enable { + vim = { + startPlugins = [ + "nvim-surround" + ]; - vim.luaConfigRC.surround = nvim.dag.entryAnywhere '' - require('nvim-surround').setup() - ''; + luaConfigRC.surround = nvim.dag.entryAnywhere '' + require('nvim-surround').setup() + ''; + + maps = { + insert = mkMerge [ + (mkIf (mappings.insert != null) (mkSetBinding mappings.insert "(nvim-surround-insert)")) + (mkIf (mappings.insertLine != null) (mkSetBinding mappings.insertLine "(nvim-surround-insert-line)")) + ]; + normal = mkMerge [ + (mkIf (mappings.normal != null) (mkSetBinding mappings.normal "(nvim-surround-normal)")) + (mkIf (mappings.normalCur != null) (mkSetBinding mappings.normalCur "(nvim-surround-normal-cur)")) + (mkIf (mappings.normalLine != null) (mkSetBinding mappings.normalLine "(nvim-surround-normal-line)")) + (mkIf (mappings.normalCurLine != null) (mkSetBinding mappings.normalCurLine "(nvim-surround-normal-cur-line)")) + (mkIf (mappings.delete != null) (mkSetBinding mappings.delete "(nvim-surround-delete)")) + (mkIf (mappings.change != null) (mkSetBinding mappings.change "(nvim-surround-change)")) + ]; + visualOnly = mkMerge [ + (mkIf (mappings.visual != null) (mkSetBinding mappings.visual "(nvim-surround-visual)")) + (mkIf (mappings.visualLine != null) (mkSetBinding mappings.visualLine "(nvim-surround-visual-line)")) + ]; + }; + }; }; } diff --git a/modules/utility/surround/surround.nix b/modules/utility/surround/surround.nix index a29b19bf..405e3f20 100644 --- a/modules/utility/surround/surround.nix +++ b/modules/utility/surround/surround.nix @@ -1,7 +1,88 @@ -{lib, ...}: +{ + lib, + config, + ... +}: with lib; with builtins; { options.vim.utility.surround = { - enable = mkEnableOption "nvim-surround: add/change/delete surrounding delimiter pairs with ease"; + enable = mkOption { + type = types.bool; + default = false; + description = "nvim-surround: add/change/delete surrounding delimiter pairs with ease. Note that the default mappings deviate from upstreeam to avoid conflicts with nvim-leap."; + }; + useVendoredKeybindings = mkOption { + type = types.bool; + default = true; + description = "Use alternative set of keybindings that avoids conflicts with other popular plugins, e.g. nvim-leap"; + }; + mappings = { + insert = mkOption { + type = types.nullOr types.str; + default = "z"; + description = "Add surround character around the cursor"; + }; + insertLine = mkOption { + type = types.nullOr types.str; + default = "Z"; + description = "Add surround character around the cursor on new lines"; + }; + normal = mkOption { + type = types.nullOr types.str; + default = "gz"; + description = "Surround motion with character"; + }; + normalCur = mkOption { + type = types.nullOr types.str; + default = "gZ"; + description = "Surround motion with character on new lines"; + }; + normalLine = mkOption { + type = types.nullOr types.str; + default = "gzz"; + description = "Surround line with character"; + }; + normalCurLine = mkOption { + type = types.nullOr types.str; + default = "gZZ"; + description = "Surround line with character on new lines"; + }; + visual = mkOption { + type = types.nullOr types.str; + default = "gz"; + description = "Surround selection with character"; + }; + visualLine = mkOption { + type = types.nullOr types.str; + default = "gZ"; + description = "Surround selection with character on new lines"; + }; + delete = mkOption { + type = types.nullOr types.str; + default = "gzd"; + description = "Delete surrounding character"; + }; + change = mkOption { + type = types.nullOr types.str; + default = "gzr"; + description = "Change surrounding character"; + }; + }; + }; + config.vim.utility.surround = let + cfg = config.vim.utility.surround; + in { + mappings = mkIf (! cfg.useVendoredKeybindings) (mkDefault { + insert = null; + insertLine = null; + normal = null; + normalCur = null; + normalLine = null; + normalCurLine = null; + visual = null; + visualLine = null; + delete = null; + change = null; + }); }; }