{ lib, config, ... }: let inherit (lib.modules) mkIf mkDefault; inherit (lib.options) mkOption; inherit (lib.types) bool nullOr str; in { options.vim.utility.surround = { enable = mkOption { type = 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 = bool; default = true; description = "Use alternative set of keybindings that avoids conflicts with other popular plugins, e.g. nvim-leap"; }; mappings = { insert = mkOption { type = nullOr str; default = "<C-g>z"; description = "Add surround character around the cursor"; }; insertLine = mkOption { type = nullOr str; default = "<C-g>Z"; description = "Add surround character around the cursor on new lines"; }; normal = mkOption { type = nullOr str; default = "gz"; description = "Surround motion with character"; }; normalCur = mkOption { type = nullOr str; default = "gZ"; description = "Surround motion with character on new lines"; }; normalLine = mkOption { type = nullOr str; default = "gzz"; description = "Surround line with character"; }; normalCurLine = mkOption { type = nullOr str; default = "gZZ"; description = "Surround line with character on new lines"; }; visual = mkOption { type = nullOr str; default = "gz"; description = "Surround selection with character"; }; visualLine = mkOption { type = nullOr str; default = "gZ"; description = "Surround selection with character on new lines"; }; delete = mkOption { type = nullOr str; default = "gzd"; description = "Delete surrounding character"; }; change = mkOption { type = nullOr 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; }); }; }