{ lib, config, ... }: let inherit (lib.options) mkOption; inherit (lib.types) bool str; inherit (lib.nvim.types) mkPluginSetupOption; cfg = config.vim.utility.surround; vendoredKeybinds = { insert = "z"; insert_line = "Z"; normal = "gz"; normal_cur = "gZ"; normal_line = "gzz"; normal_cur_line = "gZZ"; visual = "gz"; visual_line = "gZ"; delete = "gzd"; change = "gzr"; change_line = "gZR"; }; mkKeymapOption = name: default: mkOption { description = "keymap for ${name}"; type = str; default = if cfg.useVendoredKeybindings then vendoredKeybinds.${name} else default; }; 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. ''; }; setupOpts = mkPluginSetupOption "nvim-surround" { keymaps = { insert = mkKeymapOption "insert" "s"; insert_line = mkKeymapOption "insert_line" "S"; normal = mkKeymapOption "normal" "ys"; normal_cur = mkKeymapOption "normal_cur" "yss"; normal_line = mkKeymapOption "normal_line" "yS"; normal_cur_line = mkKeymapOption "normal_cur_line" "ySS"; visual = mkKeymapOption "visual" "S"; visual_line = mkKeymapOption "visual_line" "gS"; delete = mkKeymapOption "delete" "ds"; change = mkKeymapOption "change" "cs"; change_line = mkKeymapOption "change_line" "cS"; }; }; useVendoredKeybindings = mkOption { type = bool; default = true; description = "Use alternative set of keybindings that avoids conflicts with other popular plugins, e.g. nvim-leap"; }; }; }