diff --git a/plugins/by-name/efmls-configs/default.nix b/plugins/by-name/efmls-configs/default.nix index 061275f0..bf7c2f4a 100644 --- a/plugins/by-name/efmls-configs/default.nix +++ b/plugins/by-name/efmls-configs/default.nix @@ -1,114 +1,128 @@ { lib, - helpers, config, pkgs, ... }: -let - tools = lib.importJSON ../../../generated/efmls-configs-sources.json; - inherit (import ./packages.nix lib) packaged; -in -{ - options.plugins.efmls-configs = { - enable = lib.mkEnableOption "efmls-configs, premade configurations for efm-langserver"; +lib.nixvim.plugins.mkNeovimPlugin { + name = "efmls-configs"; + package = "efmls-configs-nvim"; + description = "Premade configurations for efm-langserver."; + maintainers = [ ]; - package = lib.mkPackageOption pkgs "efmls-configs-nvim" { - default = [ - "vimPlugins" - "efmls-configs-nvim" - ]; - }; + dependencies = [ + "efm-langserver" + ]; + imports = [ + # TODO: added 2025-10-23, remove after 26.05 + (lib.nixvim.mkRemovedPackageOptionModule { + plugin = "efmls-configs"; + oldPackageName = "efmLangServer"; + packageName = "efm-langserver"; + }) - externallyManagedPackages = lib.mkOption { - type = with lib.types; either (enum [ "all" ]) (listOf str); - description = '' - Linters/Formatters to skip installing with nixvim. Set to `all` to install no packages - ''; - default = [ ]; - }; + # Propagate setup warnings + { inherit (config.plugins.efmls-configs.setup) warnings; } + ]; - toolPackages = lib.pipe packaged [ - # Produce package a option for each tool - (lib.attrsets.mapAttrs ( - name: loc: - lib.mkPackageOption pkgs name { - nullable = true; - default = loc; - } - )) - # Filter package defaults that are not compatible with the current platform - (lib.attrsets.mapAttrs ( - _: opt: - opt - // { - default = if lib.meta.availableOn pkgs.stdenv.hostPlatform opt.default then opt.default else null; - defaultText = lib.literalMD '' - `${opt.defaultText.text}` if available on the current system, otherwise null - ''; - } - )) - ]; + hasSettings = false; + callSetup = false; - /* - Users can set the options as follows: - - { - c = { - linter = "cppcheck"; - formatter = ["clang-format" "uncrustify"]; - }; - go = { - linter = ["djlint" "golangci_lint"]; - }; - } - */ - setup = lib.mkOption { - type = lib.types.submodule { - freeformType = lib.types.attrsOf lib.types.anything; - - options = lib.mapAttrs ( - _: - lib.mapAttrs ( - kind: - { lang, possible }: - let - toolType = lib.types.maybeRaw (lib.types.enum possible); - in - lib.mkOption { - type = lib.types.either toolType (lib.types.listOf toolType); - default = [ ]; - description = "${kind} tools for ${lang}"; - } - ) - ) tools; - - # Added 2025-06-25 in https://github.com/nix-community/nixvim/pull/3503 - imports = - map (name: lib.mkRenamedOptionModule [ name ] [ (lib.toLower name) ]) [ - "HTML" - "JSON" - ] - ++ lib.singleton { - # NOTE: we need a warnings option for `mkRenamedOptionModule` to warn about unexpected definitions - # This can be removed when all rename aliases are gone - options.warnings = lib.mkOption { - type = with lib.types; listOf str; - description = "Warnings to propagate to nixvim's `warnings` option."; - default = [ ]; - internal = true; - visible = false; - }; - }; - }; - description = "Configuration for each filetype. Use `all` to match any filetype."; - default = { }; - }; - }; - config = + extraOptions = let - cfg = config.plugins.efmls-configs; + inherit (import ./packages.nix lib) packaged; + tools = lib.importJSON ../../../generated/efmls-configs-sources.json; + in + { + externallyManagedPackages = lib.mkOption { + type = with lib.types; either (enum [ "all" ]) (listOf str); + description = '' + Linters/Formatters to skip installing with nixvim. Set to `all` to install no packages + ''; + default = [ ]; + }; + toolPackages = lib.pipe packaged [ + # Produce package a option for each tool + (lib.attrsets.mapAttrs ( + name: loc: + lib.mkPackageOption pkgs name { + nullable = true; + default = loc; + } + )) + # Filter package defaults that are not compatible with the current platform + (lib.attrsets.mapAttrs ( + _: opt: + opt + // { + default = if lib.meta.availableOn pkgs.stdenv.hostPlatform opt.default then opt.default else null; + defaultText = lib.literalMD '' + `${opt.defaultText.text}` if available on the current system, otherwise null + ''; + } + )) + ]; + + /* + Users can set the options as follows: + + { + c = { + linter = "cppcheck"; + formatter = ["clang-format" "uncrustify"]; + }; + go = { + linter = ["djlint" "golangci_lint"]; + }; + } + */ + setup = lib.mkOption { + type = lib.types.submodule { + freeformType = lib.types.attrsOf lib.types.anything; + + options = lib.mapAttrs ( + _: + lib.mapAttrs ( + kind: + { lang, possible }: + let + toolType = lib.types.maybeRaw (lib.types.enum possible); + in + lib.mkOption { + type = lib.types.either toolType (lib.types.listOf toolType); + default = [ ]; + description = "${kind} tools for ${lang}"; + } + ) + ) tools; + + # Added 2025-06-25 in https://github.com/nix-community/nixvim/pull/3503 + imports = + map (name: lib.mkRenamedOptionModule [ name ] [ (lib.toLower name) ]) [ + "HTML" + "JSON" + ] + ++ lib.singleton { + # NOTE: we need a warnings option for `mkRenamedOptionModule` to warn about unexpected definitions + # This can be removed when all rename aliases are gone + options.warnings = lib.mkOption { + type = with lib.types; listOf str; + description = "Warnings to propagate to nixvim's `warnings` option."; + default = [ ]; + internal = true; + visible = false; + }; + }; + }; + description = "Configuration for each filetype. Use `all` to match any filetype."; + default = { }; + }; + }; + + extraConfig = + cfg: + let # Tools that have been selected by the user tools = lib.lists.unique ( lib.filter lib.isString ( @@ -152,7 +166,7 @@ in mkToolValue = kind: opt: map ( - tool: if lib.isString tool then helpers.mkRaw "require 'efmls-configs.${kind}.${tool}'" else tool + tool: if lib.isString tool then lib.nixvim.mkRaw "require 'efmls-configs.${kind}.${tool}'" else tool ) (lib.toList opt); setupOptions = @@ -177,9 +191,7 @@ in (mkToolValue "linters" cfg.setup.all.linter) ++ (mkToolValue "formatters" cfg.setup.all.formatter); }; in - lib.mkIf cfg.enable { - extraPlugins = [ cfg.package ]; - + { # TODO: print the location of the offending options warnings = lib.nixvim.mkWarnings "plugins.efmls-configs" { when = nixvimPkgs.wrong != [ ]; @@ -196,20 +208,5 @@ in }; extraPackages = map (name: cfg.toolPackages.${name}) nixvimPkgs.right; - dependencies.efm-langserver.enable = lib.mkDefault true; }; - - imports = [ - { - # Propagate setup warnings - inherit (config.plugins.efmls-configs.setup) warnings; - } - - # TODO: added 2025-10-23, remove after 26.05 - (lib.nixvim.mkRemovedPackageOptionModule { - plugin = "efmls-configs"; - oldPackageName = "efmLangServer"; - packageName = "efm-langserver"; - }) - ]; }