From 8bcb4c4a8cd083bff3e1d00100dc7a40affb3984 Mon Sep 17 00:00:00 2001 From: Gaetan Lepage Date: Fri, 3 Oct 2025 17:54:48 +0200 Subject: [PATCH] plugins/neogen: migrate to mkNeovimPlugin Tracking: https://github.com/nix-community/nixvim/issues/2638 --- plugins/by-name/neogen/default.nix | 212 +++--------------- plugins/by-name/neogen/deprecations.nix | 15 ++ .../plugins/by-name/neogen/default.nix | 41 ++-- 3 files changed, 73 insertions(+), 195 deletions(-) create mode 100644 plugins/by-name/neogen/deprecations.nix diff --git a/plugins/by-name/neogen/default.nix b/plugins/by-name/neogen/default.nix index aaebc5d8..a4931050 100644 --- a/plugins/by-name/neogen/default.nix +++ b/plugins/by-name/neogen/default.nix @@ -1,14 +1,8 @@ { lib, - helpers, - config, - pkgs, ... }: -with lib; let - cfg = config.plugins.neogen; - keymapDef = { generate = { command = ""; @@ -43,181 +37,47 @@ let }; }; in -{ - options.plugins.neogen = lib.nixvim.plugins.neovim.extraOptionsOptions // { - enable = mkEnableOption "neogen"; +lib.nixvim.plugins.mkNeovimPlugin { + name = "neogen"; + maintainers = [ lib.maintainers.GaetanLepage ]; - package = lib.mkPackageOption pkgs "neogen" { - default = [ - "vimPlugins" - "neogen" - ]; - }; + # TODO: introduced 2025-10-03: remove after 26.05 + inherit (import ./deprecations.nix) deprecateExtraOptions optionsRenamedToSettings; - keymaps = mapAttrs ( - optionsName: properties: helpers.mkNullOrOption types.str properties.description - ) keymapDef; - - keymapsSilent = mkOption { - type = types.bool; - description = "Whether Neogen keymaps should be silent"; - default = false; - }; - - inputAfterComment = helpers.defaultNullOpts.mkBool true '' - If true, go to annotation after insertion, and change to insert mode - ''; - - enablePlaceholders = helpers.defaultNullOpts.mkBool true '' - If true, enables placeholders when inserting annotation - ''; - - languages = helpers.defaultNullOpts.mkAttrsOf' { - # No plugin default (see upstream) - type = types.anything; - description = '' - Configuration for languages. - - `template.annotation_convention` (default: check the language default configurations): - Change the annotation convention to use with the language. - - `template.use_default_comment` (default: true): - Prepend any template line with the default comment for the filetype - - `template.position` (fun(node: userdata, type: string):(number,number)?): - Provide an absolute position for the annotation. - If return values are nil, use default position - - `template.append`: - If you want to customize the position of the annotation. - - `template.append.child_name`: - What child node to use for appending the annotation. - - `template.append.position` (before/after): - Relative positioning with `child_name`. - - `template.` (replace with an annotation convention): - Template for an annotation convention. - To know more about how to create your own template, go here: - https://github.com/danymat/neogen/blob/main/docs/adding-languages.md#default-generator - ''; - example = { - csharp = { - template = { - annotation_convention = "..."; - }; - }; - }; - }; - - snippetEngine = helpers.mkNullOrOption types.str '' - Use a snippet engine to generate annotations. - Some snippet engines come out of the box bundled with neogen: - - `"luasnip"` (https://github.com/L3MON4D3/LuaSnip) - - `"snippy"` (https://github.com/dcampos/nvim-snippy) - - `"vsnip"` (https://github.com/hrsh7th/vim-vsnip) - ''; - - placeholderHighlight = helpers.defaultNullOpts.mkStr "DiagnosticHint" '' - Placeholders highlights to use. If you don't want custom highlight, pass "None" - ''; - - placeholdersText = { - description = helpers.defaultNullOpts.mkStr "[TODO:description]" '' - Placeholder for description. - ''; - - tparam = helpers.defaultNullOpts.mkStr "[TODO:tparam]" '' - Placeholder for tparam. - ''; - - parameter = helpers.defaultNullOpts.mkStr "[TODO:parameter]" '' - Placeholder for parameter. - ''; - - return = helpers.defaultNullOpts.mkStr "[TODO:return]" '' - Placeholder for return. - ''; - - class = helpers.defaultNullOpts.mkStr "[TODO:class]" '' - Placeholder for class. - ''; - - throw = helpers.defaultNullOpts.mkStr "[TODO:throw]" '' - Placeholder for throw. - ''; - - varargs = helpers.defaultNullOpts.mkStr "[TODO:varargs]" '' - Placeholder for varargs. - ''; - - type = helpers.defaultNullOpts.mkStr "[TODO:type]" '' - Placeholder for type. - ''; - - attribute = helpers.defaultNullOpts.mkStr "[TODO:attribute]" '' - Placeholder for attribute. - ''; - - args = helpers.defaultNullOpts.mkStr "[TODO:args]" '' - Placeholder for args. - ''; - - kwargs = helpers.defaultNullOpts.mkStr "[TODO:kwargs]" '' - Placeholder for kwargs. - ''; + settingsExample = { + snippet_engine = "mini"; + languages = { + lua.template.annotation_convention = "emmylua"; + python.template.annotation_convention = "numpydoc"; }; }; - # TODO introduced 2024-03-07: remove 2024-05-07 - imports = [ - (mkRenamedOptionModule - [ - "plugins" - "neogen" - "placeholderHighligt" - ] - [ - "plugins" - "neogen" - "placeholderHighlight" - ] - ) - ]; + extraOptions = { + keymaps = lib.mapAttrs ( + optionsName: properties: lib.nixvim.mkNullOrOption lib.types.str properties.description + ) keymapDef; - config = - let - setupOptions = with cfg; { - enabled = enable; - input_after_comment = inputAfterComment; - inherit languages; - snippet_engine = snippetEngine; - enable_placeholders = enablePlaceholders; - placeholder_text = placeholdersText; - placeholder_hl = placeholderHighlight; - }; - in - mkIf cfg.enable { - extraPlugins = [ cfg.package ]; - - extraConfigLua = '' - require("neogen").setup(${lib.nixvim.toLuaObject setupOptions}) - ''; - - keymaps = flatten ( - mapAttrsToList ( - optionName: properties: - let - key = cfg.keymaps.${optionName}; - in - optional (key != null) { - mode = "n"; - inherit key; - action = ":Neogen ${properties.command}"; - options.silent = cfg.keymapsSilent; - } - ) keymapDef - ); + keymapsSilent = lib.mkOption { + type = lib.types.bool; + description = "Whether Neogen keymaps should be silent"; + default = false; }; + }; + + extraConfig = cfg: { + keymaps = lib.flatten ( + lib.mapAttrsToList ( + optionName: properties: + let + key = cfg.keymaps.${optionName}; + in + lib.optional (key != null) { + mode = "n"; + inherit key; + action = ":Neogen ${properties.command}"; + options.silent = cfg.keymapsSilent; + } + ) keymapDef + ); + }; } diff --git a/plugins/by-name/neogen/deprecations.nix b/plugins/by-name/neogen/deprecations.nix new file mode 100644 index 00000000..810343fc --- /dev/null +++ b/plugins/by-name/neogen/deprecations.nix @@ -0,0 +1,15 @@ +{ + deprecateExtraOptions = true; + + optionsRenamedToSettings = [ + "inputAfterComment" + "languages" + "snippetEngine" + "enablePlaceholders" + "placeholdersText" + { + old = "placeholderHighlight"; + new = "placeholder_hl"; + } + ]; +} diff --git a/tests/test-sources/plugins/by-name/neogen/default.nix b/tests/test-sources/plugins/by-name/neogen/default.nix index 46bd89a8..2a3c54e2 100644 --- a/tests/test-sources/plugins/by-name/neogen/default.nix +++ b/tests/test-sources/plugins/by-name/neogen/default.nix @@ -7,8 +7,6 @@ plugins.neogen = { enable = true; - enablePlaceholders = false; - inputAfterComment = false; keymaps = { generate = "a"; generateClass = "b"; @@ -17,26 +15,31 @@ generateType = "e"; }; keymapsSilent = true; - languages = { - csharp = { - template = { - annotation_convention = "..."; + + settings = { + enable_placeholders = false; + input_after_comment = false; + languages = { + csharp = { + template = { + annotation_convention = "..."; + }; }; }; + placeholder_hl = "None"; + placeholders_text = { + attribute = "attribute"; + class = "class"; + description = "description"; + kwargs = "kwargs"; + parameter = "parameter"; + throw = "throw"; + tparam = "tparam"; + type = "type"; + varargs = "varargs"; + }; + snippet_engine = "vsnip"; }; - placeholderHighlight = "None"; - placeholdersText = { - attribute = "attribute"; - class = "class"; - description = "description"; - kwargs = "kwargs"; - parameter = "parameter"; - throw = "throw"; - tparam = "tparam"; - type = "type"; - varargs = "varargs"; - }; - snippetEngine = "vsnip"; }; }; }