diff --git a/modules/keymaps.nix b/modules/keymaps.nix index 4004e122..3f441f84 100644 --- a/modules/keymaps.nix +++ b/modules/keymaps.nix @@ -19,36 +19,80 @@ with lib; { } ]; }; + + keymapsOnEvents = mkOption { + type = types.attrsOf (types.listOf helpers.keymaps.mapOptionSubmodule); + default = {}; + example = { + "InsertEnter" = [ + { + key = ""; + action = ''require("cmp").mapping.confirm()''; + lua = true; + } + { + key = ""; + action = ''require("cmp").mapping.select_next_item()''; + lua = true; + } + ]; + }; + description = '' + Register keymaps on an event instead of when nvim opens. + Keys are the events to register on, and values are lists of keymaps to register on each event. + ''; + }; }; - config = { - extraConfigLua = let - normalizeMapping = keyMapping: { - inherit - (keyMapping) - mode - key - options - ; + config = let + normalizeMapping = keyMapping: { + inherit + (keyMapping) + mode + key + options + ; - action = - if keyMapping.lua - then helpers.mkRaw keyMapping.action - else keyMapping.action; - }; - - mappings = map normalizeMapping config.keymaps; - in - optionalString (mappings != []) + action = + if keyMapping.lua + then helpers.mkRaw keyMapping.action + else keyMapping.action; + }; + in { + extraConfigLua = + optionalString (config.keymaps != []) '' -- Set up keybinds {{{ do - local __nixvim_binds = ${helpers.toLuaObject mappings} + local __nixvim_binds = ${helpers.toLuaObject (map normalizeMapping config.keymaps)} for i, map in ipairs(__nixvim_binds) do vim.keymap.set(map.mode, map.key, map.action, map.options) end end -- }}} ''; + + autoGroups = mapAttrs' (event: mappings: nameValuePair "nixvim_binds_${event}" {clear = true;}) config.keymapsOnEvents; + + autoCmd = + mapAttrsToList + ( + event: mappings: { + inherit event; + group = "nixvim_binds_${event}"; + callback = helpers.mkRaw '' + function() + do + local __nixvim_binds = ${helpers.toLuaObject (map normalizeMapping mappings)} + for i, map in ipairs(__nixvim_binds) do + vim.keymap.set(map.mode, map.key, map.action, map.options) + end + end + end + ''; + desc = "Load keymaps for ${event}"; + } + ) + config.keymapsOnEvents; }; } diff --git a/tests/test-sources/modules/keymaps.nix b/tests/test-sources/modules/keymaps.nix index de3c1063..7151ab97 100644 --- a/tests/test-sources/modules/keymaps.nix +++ b/tests/test-sources/modules/keymaps.nix @@ -44,4 +44,38 @@ } ]; }; + + mkKeymapsOnEvents = { + keymapsOnEvents = { + "InsertEnter" = + helpers.keymaps.mkKeymaps + { + mode = "x"; + options.silent = true; + } + [ + { + mode = "n"; + key = ","; + action = "echo \"test\""; + } + { + # raw action using rawType + key = ""; + action.__raw = "function() print('hello') end"; + } + { + key = ""; + action = "function() print('toto') end"; + lua = true; + options.silent = false; + } + { + mode = ["n" "v"]; + key = ""; + action = "bar"; + } + ]; + }; + }; }