diff --git a/modules/keymaps.nix b/modules/keymaps.nix index fe5b8d0d..38b73f08 100644 --- a/modules/keymaps.nix +++ b/modules/keymaps.nix @@ -54,32 +54,42 @@ in # TODO remove entirely in 25.05? warnings = let - # All keymap options that have historically supported the `lua` sub-option - keymapOptions = [ - options.keymaps - options.keymapsOnEvents - # NOTE: lsp `diagnostic` and `lspBuf` don't use `mapOptionSubmodule` yet - # So we only need `lua` deprecation in lsp's `extra` option - options.plugins.lsp.keymaps.extra - # NOTE: tmux-navigator added `mapOptionSubmodule` support _after_ branching off 24.05 - options.plugins.tmux-navigator.keymaps - ] - # NOTE: barbar added `mapOptionSubmodule` support shortly _before_ branching off 24.05 - ++ builtins.attrValues (builtins.removeAttrs options.plugins.barbar.keymaps [ "silent" ]); + keymapsUsingLua = + lib.pipe + # All keymap options that have historically supported the `lua` sub-option + [ + options.keymaps.valueMeta.list + (lib.concatMap (ev: ev.list) (lib.attrValues options.keymapsOnEvents.valueMeta.attrs)) + + # NOTE: lsp `diagnostic` and `lspBuf` don't use `mapOptionSubmodule` yet + # So we only need `lua` deprecation in lsp's `extra` option + options.plugins.lsp.keymaps.extra.valueMeta.list + + # NOTE: tmux-navigator added `mapOptionSubmodule` support _after_ branching off 24.05 + options.plugins.tmux-navigator.keymaps.valueMeta.list + + # NOTE: barbar added `mapOptionSubmodule` support shortly _before_ branching off 24.05 + # FIXME: types.nullOr doesn't propagate valueMeta as it doesn't implement v2 check+merge + (lib.mapAttrsToList (name: opt: opt.valueMeta) ( + builtins.removeAttrs options.plugins.barbar.keymaps [ "silent" ] + )) + ] + [ + lib.concatLists + (lib.filter (meta: meta.configuration.options.lua.isDefined or false)) + (map (meta: meta.configuration.options)) + ]; in - lib.pipe keymapOptions [ - (map (opt: (opt.type.getSubOptions opt.loc).lua)) - (lib.filter (opt: opt.isDefined)) - (map (opt: '' - ${"\n"} - The `${lib.showOption opt.loc}' option is deprecated and will be removed in 24.11. + lib.optional (keymapsUsingLua != [ ]) '' + The `lua` keymap option is deprecated and will be removed in 26.05. - You should use a "raw" `action` instead; - e.g. `action.__raw = ""` or `action = lib.nixvim.mkRaw ""`. + You should use a "raw" `action` instead; + e.g. `action.__raw = ""` or `action = lib.nixvim.mkRaw ""`. - ${lib.options.showDefs opt.definitionsWithLocations} - '')) - ]; + ${lib.concatMapStringsSep "\n" ( + m: "- `${m.lua}' is defined in " + lib.options.showFiles m.lua.files + ) keymapsUsingLua} + ''; extraConfigLua = lib.mkIf (config.keymaps != [ ]) '' -- Set up keybinds {{{ diff --git a/tests/test-sources/modules/keymaps.nix b/tests/test-sources/modules/keymaps.nix index c212d5c5..05891d77 100644 --- a/tests/test-sources/modules/keymaps.nix +++ b/tests/test-sources/modules/keymaps.nix @@ -92,4 +92,59 @@ ]; }; }; + + luaWarning = { + imports = [ + (lib.modules.setDefaultModuleLocation "test-module" { + keymaps = [ + { + lua = true; + key = "a"; + action = "function() print('keymaps') end"; + } + ]; + keymapsOnEvents.InsertEnter = [ + { + lua = true; + key = "a"; + action = "function() print('keymap on InsertEnter') end"; + } + ]; + plugins.lsp.keymaps.extra = [ + { + lua = true; + key = "a"; + action = "function() print('plugins.lsp.keymaps.extra') end"; + } + ]; + plugins.tmux-navigator.keymaps = [ + { + lua = true; + key = "a"; + action = "function() print('plugins.tmux-navigator.keymaps') end"; + } + ]; + plugins.barbar.keymaps.first = { + lua = true; + key = "a"; + action = "function() print('plugins.barbar.keymaps') end"; + }; + }) + ]; + + test.warnings = expect: [ + (expect "count" 1) + (expect "any" "The `lua` keymap option is deprecated and will be removed") + (expect "any" "You should use a \"raw\" `action` instead;") + (expect "any" "e.g. `action.__raw = \"\"` or `action = lib.nixvim.mkRaw \"\"`.") + (expect "any" "- `keymaps.\"[definition 1-entry 1]\".lua' is defined in `test-module'") + (expect "any" "- `keymapsOnEvents.InsertEnter.\"[definition 1-entry 1]\".lua' is defined in `test-module'") + (expect "any" "- `plugins.lsp.keymaps.extra.\"[definition 1-entry 1]\".lua' is defined in `test-module'") + (expect "any" "- `plugins.tmux-navigator.keymaps.\"[definition 1-entry 1]\".lua' is defined in `test-module'") + # FIXME: nullOr breaks our warning + # (expect "any" "- `plugins.barbar.keymaps.first.lua' is defined in `test-module'") + ]; + + test.runNvim = false; + }; }