diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index 28e4bc21..ff0f23a9 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -346,11 +346,6 @@ - Added `phpantom` LSP preset and into `languages.php`. -- Moved extra diagnostic modules under `diagnostics.presets.` this will - allow for more flexibility in the future for nvf. - -- Added {option}`vim.diagnostics.presets.cpplint.enable`. - - Added {option}`vim.treesitter.queries` to support adding custom queries. - Added injections for `query = '' ... ''` as `query` and `mkLualine '' ... ''`, diff --git a/lib/types/default.nix b/lib/types/default.nix index cc71e21b..57fb43fe 100644 --- a/lib/types/default.nix +++ b/lib/types/default.nix @@ -6,13 +6,11 @@ typesPlugin = import ./plugins.nix {inherit lib self;}; typesLanguage = import ./languages.nix {inherit lib;}; typesLsp = import ./lsp.nix {inherit lib;}; - typesDiagnostics = import ./diagnostics.nix {inherit lib;}; customTypes = import ./custom.nix {inherit lib;}; in { inherit (typesDag) dagOf; inherit (typesPlugin) pluginsOpt extraPluginType mkPluginSetupOption luaInline pluginType borderType; - inherit (typesLanguage) mkGrammarOption mkTreesitterGrammarOption; + inherit (typesLanguage) diagnostics mkGrammarOption mkTreesitterGrammarOption; inherit (typesLsp) mkLspPresetEnableOption; - inherit (typesDiagnostics) mkDiagnosticsPresetEnableOption; inherit (customTypes) char hexColor mergelessListOf deprecatedSingleOrListOf enumWithRename; } diff --git a/lib/types/diagnostics.nix b/lib/types/diagnostics.nix deleted file mode 100644 index 758eae30..00000000 --- a/lib/types/diagnostics.nix +++ /dev/null @@ -1,11 +0,0 @@ -{lib}: let - inherit (lib.options) mkEnableOption; - - mkDiagnosticsPresetEnableOption = option: display: - mkEnableOption '' - the ${display} Diagnostics Provider. - Use {option}`vim.diagnostics.nvim-lint.linters.${option}` for customization - ''; -in { - inherit mkDiagnosticsPresetEnableOption; -} diff --git a/lib/types/languages.nix b/lib/types/languages.nix index dbfa9a1b..6960ecb3 100644 --- a/lib/types/languages.nix +++ b/lib/types/languages.nix @@ -1,5 +1,32 @@ {lib}: let - inherit (lib.options) mkPackageOption; + inherit (lib.options) mkOption mkPackageOption; + inherit (lib.attrsets) attrNames; + inherit (lib.types) listOf either enum submodule package; + + diagnosticSubmodule = _: { + options = { + type = mkOption { + description = "Type of diagnostic to enable"; + type = attrNames diagnostics; + }; + + package = mkOption { + type = package; + description = "Diagnostics package"; + }; + }; + }; + + diagnostics = { + langDesc, + diagnosticsProviders, + defaultDiagnosticsProvider, + }: + mkOption { + type = listOf (either (enum (attrNames diagnosticsProviders)) (submodule diagnosticSubmodule)); + default = defaultDiagnosticsProvider; + description = "List of ${langDesc} diagnostics to enable"; + }; mkGrammarOption = pkgs: grammar: mkPackageOption pkgs ["${grammar} treesitter"] { @@ -18,5 +45,5 @@ nullable = true; }; in { - inherit mkGrammarOption mkTreesitterGrammarOption; + inherit diagnostics diagnosticSubmodule mkGrammarOption mkTreesitterGrammarOption; } diff --git a/modules/extra/deprecations.nix b/modules/extra/deprecations.nix index 4ef31779..8ec5a3ef 100644 --- a/modules/extra/deprecations.nix +++ b/modules/extra/deprecations.nix @@ -388,13 +388,5 @@ in { nvim-tree.lua removed system_open and now uses Neovim's vim.ui.open(). '') ] - - # 2026-06-12 - [ - (mkRemovedOptionModule ["vim" "languages" "sql" "dialect"] '' - This option interfered with project level configurations. - Linters can still be customized via `vim.diagnostics.nvim-lint..args` - '') - ] ]; } diff --git a/modules/plugins/diagnostics/default.nix b/modules/plugins/diagnostics/default.nix index 8715f150..3789640d 100644 --- a/modules/plugins/diagnostics/default.nix +++ b/modules/plugins/diagnostics/default.nix @@ -1,6 +1,3 @@ { - imports = [ - ./nvim-lint - ./presets - ]; + imports = [./nvim-lint]; } diff --git a/modules/plugins/diagnostics/presets/biomejs.nix b/modules/plugins/diagnostics/presets/biomejs.nix deleted file mode 100644 index e20155a0..00000000 --- a/modules/plugins/diagnostics/presets/biomejs.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - inherit (lib.meta) getExe; - inherit (lib.modules) mkIf; - inherit (lib.nvim.types) mkDiagnosticsPresetEnableOption; - - cfg = config.vim.diagnostics.presets.biomejs; -in { - options.vim.diagnostics.presets.biomejs = { - enable = mkDiagnosticsPresetEnableOption "biomejs" "Biome"; - }; - - config = mkIf cfg.enable { - vim.diagnostics.nvim-lint.linters.biomejs.cmd = getExe pkgs.biome; - }; -} diff --git a/modules/plugins/diagnostics/presets/checkmake.nix b/modules/plugins/diagnostics/presets/checkmake.nix deleted file mode 100644 index 31ac4e2a..00000000 --- a/modules/plugins/diagnostics/presets/checkmake.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - inherit (lib.meta) getExe; - inherit (lib.modules) mkIf; - inherit (lib.nvim.types) mkDiagnosticsPresetEnableOption; - - cfg = config.vim.diagnostics.presets.checkmake; -in { - options.vim.diagnostics.presets.checkmake = { - enable = mkDiagnosticsPresetEnableOption "checkmake" "Checkmake"; - }; - - config = mkIf cfg.enable { - vim.diagnostics.nvim-lint.linters.checkmake.cmd = getExe pkgs.checkmake; - }; -} diff --git a/modules/plugins/diagnostics/presets/cpplint.nix b/modules/plugins/diagnostics/presets/cpplint.nix deleted file mode 100644 index 153a53b7..00000000 --- a/modules/plugins/diagnostics/presets/cpplint.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - inherit (lib.meta) getExe; - inherit (lib.modules) mkIf; - inherit (lib.nvim.types) mkDiagnosticsPresetEnableOption; - - cfg = config.vim.diagnostics.presets.cpplint; -in { - options.vim.diagnostics.presets.cpplint = { - enable = mkDiagnosticsPresetEnableOption "cpplint" "cpplint"; - }; - - config = mkIf cfg.enable { - vim.diagnostics.nvim-lint.linters.cpplint.cmd = getExe pkgs.cpplint; - }; -} diff --git a/modules/plugins/diagnostics/presets/deadnix.nix b/modules/plugins/diagnostics/presets/deadnix.nix deleted file mode 100644 index 4bad04cb..00000000 --- a/modules/plugins/diagnostics/presets/deadnix.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - inherit (lib.meta) getExe; - inherit (lib.modules) mkIf; - inherit (lib.nvim.types) mkDiagnosticsPresetEnableOption; - - cfg = config.vim.diagnostics.presets.deadnix; -in { - options.vim.diagnostics.presets.deadnix = { - enable = mkDiagnosticsPresetEnableOption "deadnix" "Deadnix"; - }; - - config = mkIf cfg.enable { - vim.diagnostics.nvim-lint.linters.deadnix.cmd = getExe pkgs.deadnix; - }; -} diff --git a/modules/plugins/diagnostics/presets/default.nix b/modules/plugins/diagnostics/presets/default.nix deleted file mode 100644 index e350f4b2..00000000 --- a/modules/plugins/diagnostics/presets/default.nix +++ /dev/null @@ -1,29 +0,0 @@ -{ - imports = [ - ./biomejs.nix - ./checkmake.nix - ./cpplint.nix - ./deadnix.nix - ./djlint.nix - ./dotenv-linter.nix - ./eslint_d.nix - ./golangci-lint.nix - ./hadolint.nix - ./htmlhint.nix - ./ktlint.nix - ./luacheck.nix - ./markdownlint-cli2.nix - ./mypy.nix - ./phpstan.nix - ./rubocop.nix - ./rumdl.nix - ./selene.nix - ./shellcheck.nix - ./sqlfluff.nix - ./sqruff.nix - ./statix.nix - ./stylelint.nix - ./taplo.nix - ./tombi.nix - ]; -} diff --git a/modules/plugins/diagnostics/presets/djlint.nix b/modules/plugins/diagnostics/presets/djlint.nix deleted file mode 100644 index 1386d095..00000000 --- a/modules/plugins/diagnostics/presets/djlint.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - inherit (lib.meta) getExe; - inherit (lib.modules) mkIf; - inherit (lib.nvim.types) mkDiagnosticsPresetEnableOption; - - cfg = config.vim.diagnostics.presets.djlint; -in { - options.vim.diagnostics.presets.djlint = { - enable = mkDiagnosticsPresetEnableOption "djlint" "djLint"; - }; - - config = mkIf cfg.enable { - vim.diagnostics.nvim-lint.linters.djlint.cmd = getExe pkgs.djlint; - }; -} diff --git a/modules/plugins/diagnostics/presets/dotenv-linter.nix b/modules/plugins/diagnostics/presets/dotenv-linter.nix deleted file mode 100644 index c3889e40..00000000 --- a/modules/plugins/diagnostics/presets/dotenv-linter.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - inherit (lib.meta) getExe; - inherit (lib.modules) mkIf; - inherit (lib.nvim.types) mkDiagnosticsPresetEnableOption; - - cfg = config.vim.diagnostics.presets.dotenv-linter; -in { - options.vim.diagnostics.presets.dotenv-linter = { - enable = mkDiagnosticsPresetEnableOption "dotenv-linter" "Dotenv Linter"; - }; - - config = mkIf cfg.enable { - vim.diagnostics.nvim-lint.linters.dotenv-linter.cmd = getExe pkgs.dotenv-linter; - }; -} diff --git a/modules/plugins/diagnostics/presets/eslint_d.nix b/modules/plugins/diagnostics/presets/eslint_d.nix deleted file mode 100644 index f6a1fdd9..00000000 --- a/modules/plugins/diagnostics/presets/eslint_d.nix +++ /dev/null @@ -1,30 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - inherit (lib.meta) getExe; - inherit (lib.modules) mkIf; - inherit (lib.nvim.types) mkDiagnosticsPresetEnableOption; - - cfg = config.vim.diagnostics.presets.eslint_d; -in { - options.vim.diagnostics.presets.eslint_d = { - enable = mkDiagnosticsPresetEnableOption "eslint_d" "Eslint Daemon"; - }; - - config = mkIf cfg.enable { - vim.diagnostics.nvim-lint.linters.eslint_d = { - cmd = getExe pkgs.eslint_d; - required_files = [ - "eslint.config.js" - "eslint.config.mjs" - ".eslintrc" - ".eslintrc.json" - ".eslintrc.js" - ".eslintrc.yml" - ]; - }; - }; -} diff --git a/modules/plugins/diagnostics/presets/golangci-lint.nix b/modules/plugins/diagnostics/presets/golangci-lint.nix deleted file mode 100644 index d8e44040..00000000 --- a/modules/plugins/diagnostics/presets/golangci-lint.nix +++ /dev/null @@ -1,114 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - inherit (lib.meta) getExe; - inherit (lib.modules) mkIf; - inherit (lib.generators) mkLuaInline; - inherit (lib.nvim.types) mkDiagnosticsPresetEnableOption; - - cfg = config.vim.diagnostics.presets.golangci-lint; -in { - options.vim.diagnostics.presets.golangci-lint = { - enable = mkDiagnosticsPresetEnableOption "golangci-lint" "GolangCI Lint"; - }; - - config = mkIf cfg.enable { - vim.diagnostics.nvim-lint.linters.golangci-lint = { - cmd = getExe pkgs.golangci-lint; - args = [ - "run" - "--output.json.path=stdout" - "--issues-exit-code=0" - "--show-stats=false" - "--fix=false" - "--path-mode=abs" - # Overwrite values that could be configured and result in unwanted writes - "--output.text.path=" - "--output.tab.path=" - "--output.html.path=" - "--output.checkstyle.path=" - "--output.code-climate.path=" - "--output.junit-xml.path=" - "--output.teamcity.path=" - "--output.sarif.path=" - (mkLuaInline '' - -- Run on current file only if go.mod is missing - function() - local fnmod = ":p"; - local cmd = {"${getExe pkgs.go}", "env", "GOMOD"}; - local ok, gomod = pcall(vim.fn.system, cmd); - gomod = gomod:gsub("%s+", "") - if ok and gomod ~= "" and gomod ~= "/dev/null" then - fnmod = ":h"; - end - return vim.fn.fnamemodify(vim.api.nvim_buf_get_name(0), fnmod) - end - '') - ]; - append_fname = false; - parser = mkLuaInline '' - function(output, bufnr) - local SOURCE = "golangci-lint"; - - local function display_tool_error(msg) - return{ - { - bufnr = bufnr, - lnum = 0, - col = 0, - message = string.format("[%s] %s", SOURCE, msg), - severity = vim.diagnostic.severity.ERROR, - source = SOURCE, - }, - } - end - - if output == "" then - return display_tool_error("no output provided") - end - - local ok, decoded = pcall(vim.json.decode, output) - if not ok then - return display_tool_error("failed to parse JSON output") - end - - if not decoded or not decoded.Issues then - return display_tool_error("unexpected output format") - end - - local severity_map = { - error = vim.diagnostic.severity.ERROR, - warning = vim.diagnostic.severity.WARN, - info = vim.diagnostic.severity.INFO, - hint = vim.diagnostic.severity.HINT, - } - local diagnostics = {} - for _, issue in ipairs(decoded.Issues) do - local sev = vim.diagnostic.severity.ERROR - if issue.Severity and issue.Severity ~= "" then - local normalized = issue.Severity:lower() - sev = severity_map[normalized] or vim.diagnostic.severity.ERROR - end - - local buffer = vim.fn.fnamemodify(vim.api.nvim_buf_get_name(bufnr), ":p") - if vim.fs.normalize(buffer) == vim.fs.normalize(issue.Pos.Filename) then - table.insert(diagnostics, { - bufnr = bufnr, - lnum = issue.Pos.Line - 1, - col = issue.Pos.Column - 1, - message = issue.Text, - code = issue.FromLinter, - severity = sev, - source = SOURCE, - }) - end - end - return diagnostics - end - ''; - }; - }; -} diff --git a/modules/plugins/diagnostics/presets/hadolint.nix b/modules/plugins/diagnostics/presets/hadolint.nix deleted file mode 100644 index 41f5d11b..00000000 --- a/modules/plugins/diagnostics/presets/hadolint.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - inherit (lib.meta) getExe; - inherit (lib.modules) mkIf; - inherit (lib.nvim.types) mkDiagnosticsPresetEnableOption; - - cfg = config.vim.diagnostics.presets.hadolint; -in { - options.vim.diagnostics.presets.hadolint = { - enable = mkDiagnosticsPresetEnableOption "hadolint" "Hadolint"; - }; - - config = mkIf cfg.enable { - vim.diagnostics.nvim-lint.linters.hadolint.cmd = getExe pkgs.hadolint; - }; -} diff --git a/modules/plugins/diagnostics/presets/htmlhint.nix b/modules/plugins/diagnostics/presets/htmlhint.nix deleted file mode 100644 index ca0f727f..00000000 --- a/modules/plugins/diagnostics/presets/htmlhint.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - inherit (lib.meta) getExe; - inherit (lib.modules) mkIf; - inherit (lib.nvim.types) mkDiagnosticsPresetEnableOption; - - cfg = config.vim.diagnostics.presets.htmlhint; -in { - options.vim.diagnostics.presets.htmlhint = { - enable = mkDiagnosticsPresetEnableOption "htmlhint" "HTMLHint"; - }; - - config = mkIf cfg.enable { - vim.diagnostics.nvim-lint.linters.htmlhint.cmd = getExe pkgs.htmlhint; - }; -} diff --git a/modules/plugins/diagnostics/presets/ktlint.nix b/modules/plugins/diagnostics/presets/ktlint.nix deleted file mode 100644 index 7ba139fd..00000000 --- a/modules/plugins/diagnostics/presets/ktlint.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - inherit (lib.meta) getExe; - inherit (lib.modules) mkIf; - inherit (lib.nvim.types) mkDiagnosticsPresetEnableOption; - - cfg = config.vim.diagnostics.presets.ktlint; -in { - options.vim.diagnostics.presets.ktlint = { - enable = mkDiagnosticsPresetEnableOption "ktlint" "ktlint"; - }; - - config = mkIf cfg.enable { - vim.diagnostics.nvim-lint.linters.ktlint.cmd = getExe pkgs.ktlint; - }; -} diff --git a/modules/plugins/diagnostics/presets/luacheck.nix b/modules/plugins/diagnostics/presets/luacheck.nix deleted file mode 100644 index 48731fb9..00000000 --- a/modules/plugins/diagnostics/presets/luacheck.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - inherit (lib.meta) getExe; - inherit (lib.modules) mkIf; - inherit (lib.nvim.types) mkDiagnosticsPresetEnableOption; - - cfg = config.vim.diagnostics.presets.luacheck; -in { - options.vim.diagnostics.presets.luacheck = { - enable = mkDiagnosticsPresetEnableOption "luacheck" "Luacheck"; - }; - - config = mkIf cfg.enable { - vim.diagnostics.nvim-lint.linters.luacheck.cmd = getExe pkgs.luajitPackages.luacheck; - }; -} diff --git a/modules/plugins/diagnostics/presets/markdownlint-cli2.nix b/modules/plugins/diagnostics/presets/markdownlint-cli2.nix deleted file mode 100644 index 88b5d809..00000000 --- a/modules/plugins/diagnostics/presets/markdownlint-cli2.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - inherit (lib.meta) getExe; - inherit (lib.modules) mkIf; - inherit (lib.nvim.types) mkDiagnosticsPresetEnableOption; - - cfg = config.vim.diagnostics.presets.markdownlint-cli2; -in { - options.vim.diagnostics.presets.markdownlint-cli2 = { - enable = mkDiagnosticsPresetEnableOption "markdownlint-cli2" "Markdownlint CLI 2"; - }; - - config = mkIf cfg.enable { - vim.diagnostics.nvim-lint.linters.markdownlint-cli2.cmd = getExe pkgs.markdownlint-cli2; - }; -} diff --git a/modules/plugins/diagnostics/presets/mypy.nix b/modules/plugins/diagnostics/presets/mypy.nix deleted file mode 100644 index 24bfd282..00000000 --- a/modules/plugins/diagnostics/presets/mypy.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - inherit (lib.meta) getExe'; - inherit (lib.modules) mkIf; - inherit (lib.nvim.types) mkDiagnosticsPresetEnableOption; - - cfg = config.vim.diagnostics.presets.mypy; -in { - options.vim.diagnostics.presets.mypy = { - enable = mkDiagnosticsPresetEnableOption "mypy" "Mypy"; - }; - - config = mkIf cfg.enable { - vim.diagnostics.nvim-lint.linters.mypy.cmd = getExe' pkgs.mypy "mypy"; - }; -} diff --git a/modules/plugins/diagnostics/presets/phpstan.nix b/modules/plugins/diagnostics/presets/phpstan.nix deleted file mode 100644 index 3d92b382..00000000 --- a/modules/plugins/diagnostics/presets/phpstan.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - inherit (lib.meta) getExe; - inherit (lib.modules) mkIf; - inherit (lib.nvim.types) mkDiagnosticsPresetEnableOption; - - cfg = config.vim.diagnostics.presets.phpstan; -in { - options.vim.diagnostics.presets.phpstan = { - enable = mkDiagnosticsPresetEnableOption "phpstan" "PHPStan"; - }; - - config = mkIf cfg.enable { - vim.diagnostics.nvim-lint.linters.phpstan.cmd = getExe pkgs.phpstan; - }; -} diff --git a/modules/plugins/diagnostics/presets/rubocop.nix b/modules/plugins/diagnostics/presets/rubocop.nix deleted file mode 100644 index 9135eeee..00000000 --- a/modules/plugins/diagnostics/presets/rubocop.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - inherit (lib.meta) getExe; - inherit (lib.modules) mkIf; - inherit (lib.nvim.types) mkDiagnosticsPresetEnableOption; - - cfg = config.vim.diagnostics.presets.rubocop; -in { - options.vim.diagnostics.presets.rubocop = { - enable = mkDiagnosticsPresetEnableOption "rubocop" "RuboCop"; - }; - - config = mkIf cfg.enable { - vim.diagnostics.nvim-lint.linters.rubocop.cmd = getExe pkgs.rubyPackages.rubocop; - }; -} diff --git a/modules/plugins/diagnostics/presets/rumdl.nix b/modules/plugins/diagnostics/presets/rumdl.nix deleted file mode 100644 index 0039a083..00000000 --- a/modules/plugins/diagnostics/presets/rumdl.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - inherit (lib.meta) getExe; - inherit (lib.modules) mkIf; - inherit (lib.nvim.types) mkDiagnosticsPresetEnableOption; - - cfg = config.vim.diagnostics.presets.rumdl; -in { - options.vim.diagnostics.presets.rumdl = { - enable = mkDiagnosticsPresetEnableOption "rumdl" "Rumdl"; - }; - - config = mkIf cfg.enable { - vim.diagnostics.nvim-lint.linters.rumdl.cmd = getExe pkgs.rumdl; - }; -} diff --git a/modules/plugins/diagnostics/presets/selene.nix b/modules/plugins/diagnostics/presets/selene.nix deleted file mode 100644 index d81e5069..00000000 --- a/modules/plugins/diagnostics/presets/selene.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - inherit (lib.meta) getExe; - inherit (lib.modules) mkIf; - inherit (lib.nvim.types) mkDiagnosticsPresetEnableOption; - - cfg = config.vim.diagnostics.presets.selene; -in { - options.vim.diagnostics.presets.selene = { - enable = mkDiagnosticsPresetEnableOption "selene" "Selene"; - }; - - config = mkIf cfg.enable { - vim.diagnostics.nvim-lint.linters.selene.cmd = getExe pkgs.selene; - }; -} diff --git a/modules/plugins/diagnostics/presets/shellcheck.nix b/modules/plugins/diagnostics/presets/shellcheck.nix deleted file mode 100644 index 7d273403..00000000 --- a/modules/plugins/diagnostics/presets/shellcheck.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - inherit (lib.meta) getExe; - inherit (lib.modules) mkIf; - inherit (lib.nvim.types) mkDiagnosticsPresetEnableOption; - - cfg = config.vim.diagnostics.presets.shellcheck; -in { - options.vim.diagnostics.presets.shellcheck = { - enable = mkDiagnosticsPresetEnableOption "shellcheck" "Shellcheck"; - }; - - config = mkIf cfg.enable { - vim.diagnostics.nvim-lint.linters.shellcheck.cmd = getExe pkgs.shellcheck; - }; -} diff --git a/modules/plugins/diagnostics/presets/sqlfluff.nix b/modules/plugins/diagnostics/presets/sqlfluff.nix deleted file mode 100644 index 3bb4e8a1..00000000 --- a/modules/plugins/diagnostics/presets/sqlfluff.nix +++ /dev/null @@ -1,23 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - inherit (lib.meta) getExe; - inherit (lib.modules) mkIf; - inherit (lib.nvim.types) mkDiagnosticsPresetEnableOption; - - cfg = config.vim.diagnostics.presets.sqlfluff; -in { - options.vim.diagnostics.presets.sqlfluff = { - enable = mkDiagnosticsPresetEnableOption "sqlfluff" "SQLFluff"; - }; - - config = mkIf cfg.enable { - vim.diagnostics.nvim-lint.linters.sqlfluff = { - cmd = getExe pkgs.sqlfluff; - args = ["lint" "--format=json"]; - }; - }; -} diff --git a/modules/plugins/diagnostics/presets/sqruff.nix b/modules/plugins/diagnostics/presets/sqruff.nix deleted file mode 100644 index d6d05241..00000000 --- a/modules/plugins/diagnostics/presets/sqruff.nix +++ /dev/null @@ -1,23 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - inherit (lib.meta) getExe; - inherit (lib.modules) mkIf; - inherit (lib.nvim.types) mkDiagnosticsPresetEnableOption; - - cfg = config.vim.diagnostics.presets.sqruff; -in { - options.vim.diagnostics.presets.sqruff = { - enable = mkDiagnosticsPresetEnableOption "sqruff" "Sqruff"; - }; - - config = mkIf cfg.enable { - vim.diagnostics.nvim-lint.linters.sqruff = { - cmd = getExe pkgs.sqruff; - args = ["lint" "--format=json" "-"]; - }; - }; -} diff --git a/modules/plugins/diagnostics/presets/statix.nix b/modules/plugins/diagnostics/presets/statix.nix deleted file mode 100644 index 67939f19..00000000 --- a/modules/plugins/diagnostics/presets/statix.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - inherit (lib.meta) getExe; - inherit (lib.modules) mkIf; - inherit (lib.nvim.types) mkDiagnosticsPresetEnableOption; - - cfg = config.vim.diagnostics.presets.statix; -in { - options.vim.diagnostics.presets.statix = { - enable = mkDiagnosticsPresetEnableOption "statix" "Statix"; - }; - - config = mkIf cfg.enable { - vim.diagnostics.nvim-lint.linters.statix.cmd = getExe pkgs.statix; - }; -} diff --git a/modules/plugins/diagnostics/presets/stylelint.nix b/modules/plugins/diagnostics/presets/stylelint.nix deleted file mode 100644 index e7eeda07..00000000 --- a/modules/plugins/diagnostics/presets/stylelint.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - inherit (lib.meta) getExe; - inherit (lib.modules) mkIf; - inherit (lib.nvim.types) mkDiagnosticsPresetEnableOption; - - cfg = config.vim.diagnostics.presets.stylelint; -in { - options.vim.diagnostics.presets.stylelint = { - enable = mkDiagnosticsPresetEnableOption "stylelint" "Stylelint"; - }; - - config = mkIf cfg.enable { - vim.diagnostics.nvim-lint.linters.stylelint.cmd = getExe pkgs.stylelint; - }; -} diff --git a/modules/plugins/diagnostics/presets/taplo.nix b/modules/plugins/diagnostics/presets/taplo.nix deleted file mode 100644 index e9bd8811..00000000 --- a/modules/plugins/diagnostics/presets/taplo.nix +++ /dev/null @@ -1,23 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - inherit (lib.meta) getExe; - inherit (lib.modules) mkIf; - inherit (lib.nvim.types) mkDiagnosticsPresetEnableOption; - - cfg = config.vim.diagnostics.presets.taplo; -in { - options.vim.diagnostics.presets.taplo = { - enable = mkDiagnosticsPresetEnableOption "taplo" "Taplo"; - }; - - config = mkIf cfg.enable { - vim.diagnostics.nvim-lint.linters.taplo = { - cmd = getExe pkgs.taplo; - args = ["lint"]; - }; - }; -} diff --git a/modules/plugins/diagnostics/presets/tombi.nix b/modules/plugins/diagnostics/presets/tombi.nix deleted file mode 100644 index d9d405ac..00000000 --- a/modules/plugins/diagnostics/presets/tombi.nix +++ /dev/null @@ -1,23 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - inherit (lib.meta) getExe; - inherit (lib.modules) mkIf; - inherit (lib.nvim.types) mkDiagnosticsPresetEnableOption; - - cfg = config.vim.diagnostics.presets.tombi; -in { - options.vim.diagnostics.presets.tombi = { - enable = mkDiagnosticsPresetEnableOption "tombi" "Tombi"; - }; - - config = mkIf cfg.enable { - vim.diagnostics.nvim-lint.linters.tombi = { - cmd = getExe pkgs.tombi; - args = ["lint"]; - }; - }; -} diff --git a/modules/plugins/languages/astro.nix b/modules/plugins/languages/astro.nix index 437e3d65..a14471fe 100644 --- a/modules/plugins/languages/astro.nix +++ b/modules/plugins/languages/astro.nix @@ -11,7 +11,7 @@ inherit (lib.meta) getExe; inherit (lib.types) enum coercedTo listOf; inherit (lib.nvim.attrsets) mapListToAttrs; - inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf enumWithRename; + inherit (lib.nvim.types) mkGrammarOption diagnostics deprecatedSingleOrListOf enumWithRename; inherit (lib) genAttrs; cfg = config.vim.languages.astro; @@ -35,7 +35,24 @@ }; defaultDiagnosticsProvider = ["eslint_d"]; - diagnosticsProviders = ["eslint_d"]; + diagnosticsProviders = { + eslint_d = let + pkg = pkgs.eslint_d; + in { + package = pkg; + config = { + cmd = getExe pkg; + required_files = [ + "eslint.config.js" + "eslint.config.mjs" + ".eslintrc" + ".eslintrc.json" + ".eslintrc.js" + ".eslintrc.yml" + ]; + }; + }; + }; formatType = deprecatedSingleOrListOf @@ -96,16 +113,16 @@ in { extraDiagnostics = { enable = - mkEnableOption "extra Astro diagnostics via nvim-lint" + mkEnableOption "extra Astro diagnostics" // { default = config.vim.languages.enableExtraDiagnostics; defaultText = literalExpression "config.vim.languages.enableExtraDiagnostics"; }; - types = mkOption { - type = listOf (enum diagnosticsProviders); - default = defaultDiagnosticsProvider; - description = "extra Astro diagnostics providers"; + types = diagnostics { + langDesc = "Astro"; + inherit diagnosticsProviders; + inherit defaultDiagnosticsProvider; }; }; }; @@ -141,12 +158,12 @@ in { }) (mkIf cfg.extraDiagnostics.enable { - vim.diagnostics = { - presets = genAttrs cfg.extraDiagnostics.types (_: {enable = true;}); - nvim-lint = { - enable = true; - linters_by_ft.astro = cfg.extraDiagnostics.types; - }; + vim.diagnostics.nvim-lint = { + enable = true; + linters_by_ft.astro = cfg.extraDiagnostics.types; + linters = + mkMerge (map (name: {${name} = diagnosticsProviders.${name}.config;}) + cfg.extraDiagnostics.types); }; }) ]); diff --git a/modules/plugins/languages/bash.nix b/modules/plugins/languages/bash.nix index cf7277d1..6ae23d73 100644 --- a/modules/plugins/languages/bash.nix +++ b/modules/plugins/languages/bash.nix @@ -10,7 +10,7 @@ inherit (lib.modules) mkIf mkMerge; inherit (lib.types) enum bool listOf; inherit (lib) genAttrs; - inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf enumWithRename; + inherit (lib.nvim.types) diagnostics mkGrammarOption deprecatedSingleOrListOf enumWithRename; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.bash; @@ -26,7 +26,11 @@ }; defaultDiagnosticsProvider = ["shellcheck"]; - diagnosticsProviders = ["shellcheck"]; + diagnosticsProviders = { + shellcheck = { + package = pkgs.shellcheck; + }; + }; in { options.vim.languages.bash = { enable = mkEnableOption "Bash language support"; @@ -76,16 +80,15 @@ in { extraDiagnostics = { enable = - mkEnableOption "extra Shell diagnostics via nvim-lint" + mkEnableOption "extra Bash diagnostics" // { default = config.vim.languages.enableExtraDiagnostics; defaultText = literalExpression "config.vim.languages.enableExtraDiagnostics"; }; - - types = mkOption { - type = listOf (enum diagnosticsProviders); - default = defaultDiagnosticsProvider; - description = "extra Shell diagnostics providers"; + types = diagnostics { + langDesc = "Bash"; + inherit diagnosticsProviders; + inherit defaultDiagnosticsProvider; }; }; }; @@ -125,16 +128,13 @@ in { }) (mkIf cfg.extraDiagnostics.enable { - vim.diagnostics = { - presets = genAttrs cfg.extraDiagnostics.types (_: {enable = true;}); - nvim-lint = { - enable = true; - linters_by_ft = { - sh = cfg.extraDiagnostics.types; - bash = cfg.extraDiagnostics.types; - zsh = cfg.extraDiagnostics.types; - }; - }; + vim.diagnostics.nvim-lint = { + enable = true; + linters_by_ft.sh = cfg.extraDiagnostics.types; + linters = mkMerge (map (name: { + ${name}.cmd = getExe diagnosticsProviders.${name}.package; + }) + cfg.extraDiagnostics.types); }; }) ]); diff --git a/modules/plugins/languages/clang.nix b/modules/plugins/languages/clang.nix index 7698e424..7e30b1f6 100644 --- a/modules/plugins/languages/clang.nix +++ b/modules/plugins/languages/clang.nix @@ -96,9 +96,6 @@ }; clang-format.command = getExe' pkgs.clang-tools "clang-format"; }; - - defaultDiagnosticsProvider = ["cpplint"]; - diagnosticsProviders = ["cpplint"]; in { options.vim.languages.clang = { enable = mkEnableOption "C/C++ language support"; @@ -171,21 +168,6 @@ in { description = "C formatter to use"; }; }; - - extraDiagnostics = { - enable = - mkEnableOption "extra C/C++ diagnostics via nvim-lint" - // { - default = config.vim.languages.enableExtraDiagnostics; - defaultText = literalExpression "config.vim.languages.enableExtraDiagnostics"; - }; - - types = mkOption { - type = listOf (enum diagnosticsProviders); - default = defaultDiagnosticsProvider; - description = "extra C/C++ diagnostics providers"; - }; - }; }; config = mkIf cfg.enable (mkMerge [ @@ -229,18 +211,5 @@ in { }; }; }) - - (mkIf cfg.extraDiagnostics.enable { - vim.diagnostics = { - presets = genAttrs cfg.extraDiagnostics.types (_: {enable = true;}); - nvim-lint = { - enable = true; - linters_by_ft = { - c = cfg.extraDiagnostics.types; - cpp = cfg.extraDiagnostics.types; - }; - }; - }; - }) ]); } diff --git a/modules/plugins/languages/docker.nix b/modules/plugins/languages/docker.nix index 8d7f3494..88537e4d 100644 --- a/modules/plugins/languages/docker.nix +++ b/modules/plugins/languages/docker.nix @@ -4,12 +4,13 @@ lib, ... }: let - inherit (lib.attrsets) attrNames genAttrs; + inherit (builtins) attrNames; + inherit (lib) genAttrs; inherit (lib.meta) getExe; inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.modules) mkIf mkMerge; inherit (lib.types) enum listOf; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.types) mkGrammarOption diagnostics; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.docker; @@ -25,7 +26,17 @@ }; defaultDiagnosticsProvider = ["hadolint"]; - diagnosticsProviders = ["hadolint"]; + diagnosticsProviders = { + hadolint = { + config.cmd = getExe ( + pkgs.writeShellApplication { + name = "hadolint"; + runtimeInputs = [pkgs.hadolint]; + text = "hadolint -"; + } + ); + }; + }; in { options.vim.languages.docker = { enable = mkEnableOption "Docker language support"; @@ -70,16 +81,15 @@ in { extraDiagnostics = { enable = - mkEnableOption "extra Docker diagnostics via nvim-lint" + mkEnableOption "extra Dockerfile diagnostics" // { default = config.vim.languages.enableExtraDiagnostics; - defaultText = literalExpression "config.vim.languages.enableExtraDiagnostic"; }; - types = mkOption { - type = listOf (enum diagnosticsProviders); - default = defaultDiagnosticsProvider; - description = "extra Docker diagnostics providers"; + types = diagnostics { + langDesc = "Dockerfile"; + inherit diagnosticsProviders; + inherit defaultDiagnosticsProvider; }; }; }; @@ -141,12 +151,15 @@ in { }) (mkIf cfg.extraDiagnostics.enable { - vim.diagnostics = { - presets = genAttrs cfg.extraDiagnostics.types (_: {enable = true;}); - nvim-lint = { - enable = true; - linters_by_ft.dockerfile = cfg.extraDiagnostics.types; - }; + vim.diagnostics.nvim-lint = { + enable = true; + linters_by_ft.dockerfile = cfg.extraDiagnostics.types; + linters = mkMerge ( + map (name: { + ${name} = diagnosticsProviders.${name}.config; + }) + cfg.extraDiagnostics.types + ); }; }) ]); diff --git a/modules/plugins/languages/env.nix b/modules/plugins/languages/env.nix index e3b38348..1209b005 100644 --- a/modules/plugins/languages/env.nix +++ b/modules/plugins/languages/env.nix @@ -1,33 +1,42 @@ { config, + pkgs, lib, ... }: let - inherit (lib.options) mkEnableOption literalExpression mkOption; + inherit (lib.options) mkEnableOption literalExpression; + inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; - inherit (lib.attrsets) genAttrs; - inherit (lib.types) enum listOf; + inherit (lib.nvim.types) diagnostics; cfg = config.vim.languages.env; defaultDiagnosticsProvider = ["dotenv-linter"]; - diagnosticsProviders = ["dotenv-linter"]; + diagnosticsProviders = { + dotenv-linter = let + pkg = pkgs.dotenv-linter; + in { + package = pkg; + config = { + cmd = getExe pkg; + }; + }; + }; in { options.vim.languages.env = { enable = mkEnableOption "Env language support"; extraDiagnostics = { enable = - mkEnableOption "extra Env diagnostics via nvim-lint" + mkEnableOption "extra Env diagnostics" // { default = config.vim.languages.enableExtraDiagnostics; - defaultText = literalExpression "config.vim.languages.enableExtraDiagnostic"; + defaultText = literalExpression "config.vim.languages.enableExtraDiagnostics"; }; - - types = mkOption { - type = listOf (enum diagnosticsProviders); - default = defaultDiagnosticsProvider; - description = "extra Env diagnostics providers"; + types = diagnostics { + langDesc = "Env"; + inherit diagnosticsProviders; + inherit defaultDiagnosticsProvider; }; }; }; @@ -49,12 +58,12 @@ in { } (mkIf cfg.extraDiagnostics.enable { - vim.diagnostics = { - presets = genAttrs cfg.extraDiagnostics.types (_: {enable = true;}); - nvim-lint = { - enable = true; - linters_by_ft.env = cfg.extraDiagnostics.types; - }; + vim.diagnostics.nvim-lint = { + enable = true; + linters_by_ft.env = cfg.extraDiagnostics.types; + linters = + mkMerge (map (name: {${name} = diagnosticsProviders.${name}.config;}) + cfg.extraDiagnostics.types); }; }) ]); diff --git a/modules/plugins/languages/go.nix b/modules/plugins/languages/go.nix index a3422f35..48df8f03 100644 --- a/modules/plugins/languages/go.nix +++ b/modules/plugins/languages/go.nix @@ -10,8 +10,9 @@ inherit (lib.modules) mkIf mkMerge; inherit (lib.meta) getExe; inherit (lib) genAttrs; + inherit (lib.generators) mkLuaInline; inherit (lib.types) enum package str listOf; - inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf mkPluginSetupOption; + inherit (lib.nvim.types) mkGrammarOption diagnostics deprecatedSingleOrListOf mkPluginSetupOption; inherit (lib.nvim.dag) entryAfter; inherit (lib.nvim.attrsets) mapListToAttrs; @@ -43,7 +44,107 @@ }; defaultDiagnosticsProvider = ["golangci-lint"]; - diagnosticsProviders = ["golangci-lint"]; + diagnosticsProviders = { + golangci-lint = let + pkg = pkgs.golangci-lint; + in { + package = pkg; + config = { + cmd = getExe pkg; + args = [ + "run" + "--output.json.path=stdout" + "--issues-exit-code=0" + "--show-stats=false" + "--fix=false" + "--path-mode=abs" + # Overwrite values that could be configured and result in unwanted writes + "--output.text.path=" + "--output.tab.path=" + "--output.html.path=" + "--output.checkstyle.path=" + "--output.code-climate.path=" + "--output.junit-xml.path=" + "--output.teamcity.path=" + "--output.sarif.path=" + (mkLuaInline '' + -- Run on current file only if go.mod is missing + function() + local fnmod = ":p"; + local cmd = {"${getExe pkgs.go}", "env", "GOMOD"}; + local ok, gomod = pcall(vim.fn.system, cmd); + gomod = gomod:gsub("%s+", "") + if ok and gomod ~= "" and gomod ~= "/dev/null" then + fnmod = ":h"; + end + return vim.fn.fnamemodify(vim.api.nvim_buf_get_name(0), fnmod) + end + '') + ]; + append_fname = false; + parser = mkLuaInline '' + function(output, bufnr) + local SOURCE = "golangci-lint"; + + local function display_tool_error(msg) + return{ + { + bufnr = bufnr, + lnum = 0, + col = 0, + message = string.format("[%s] %s", SOURCE, msg), + severity = vim.diagnostic.severity.ERROR, + source = SOURCE, + }, + } + end + + if output == "" then + return display_tool_error("no output provided") + end + + local ok, decoded = pcall(vim.json.decode, output) + if not ok then + return display_tool_error("failed to parse JSON output") + end + + if not decoded or not decoded.Issues then + return display_tool_error("unexpected output format") + end + + local severity_map = { + error = vim.diagnostic.severity.ERROR, + warning = vim.diagnostic.severity.WARN, + info = vim.diagnostic.severity.INFO, + hint = vim.diagnostic.severity.HINT, + } + local diagnostics = {} + for _, issue in ipairs(decoded.Issues) do + local sev = vim.diagnostic.severity.ERROR + if issue.Severity and issue.Severity ~= "" then + local normalized = issue.Severity:lower() + sev = severity_map[normalized] or vim.diagnostic.severity.ERROR + end + + local buffer = vim.fn.fnamemodify(vim.api.nvim_buf_get_name(bufnr), ":p") + if vim.fs.normalize(buffer) == vim.fs.normalize(issue.Pos.Filename) then + table.insert(diagnostics, { + bufnr = bufnr, + lnum = issue.Pos.Line - 1, + col = issue.Pos.Column - 1, + message = issue.Text, + code = issue.FromLinter, + severity = sev, + source = SOURCE, + }) + end + end + return diagnostics + end + ''; + }; + }; + }; in { options.vim.languages.go = { enable = mkEnableOption "Go language support"; @@ -125,16 +226,16 @@ in { extraDiagnostics = { enable = - mkEnableOption "extra Go diagnostics via nvim-lint" + mkEnableOption "extra Go diagnostics" // { default = config.vim.languages.enableExtraDiagnostics; defaultText = literalExpression "config.vim.languages.enableExtraDiagnostic"; }; - types = mkOption { - type = listOf (enum diagnosticsProviders); - default = defaultDiagnosticsProvider; - description = "extra Go diagnostics providers"; + types = diagnostics { + langDesc = "Go"; + inherit diagnosticsProviders; + inherit defaultDiagnosticsProvider; }; }; @@ -256,12 +357,12 @@ in { }) (mkIf cfg.extraDiagnostics.enable { - vim.diagnostics = { - presets = genAttrs cfg.extraDiagnostics.types (_: {enable = true;}); - nvim-lint = { - enable = true; - linters_by_ft.go = cfg.extraDiagnostics.types; - }; + vim.diagnostics.nvim-lint = { + enable = true; + linters_by_ft.go = cfg.extraDiagnostics.types; + linters = + mkMerge (map (name: {${name} = diagnosticsProviders.${name}.config;}) + cfg.extraDiagnostics.types); }; }) diff --git a/modules/plugins/languages/html.nix b/modules/plugins/languages/html.nix index 2436b3a3..b398b982 100644 --- a/modules/plugins/languages/html.nix +++ b/modules/plugins/languages/html.nix @@ -5,12 +5,13 @@ ... }: let inherit (builtins) attrNames; + inherit (lib.meta) getExe; inherit (lib.options) literalExpression mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; inherit (lib.types) bool enum listOf; inherit (lib) genAttrs; inherit (lib.lists) optional; - inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; + inherit (lib.nvim.types) mkGrammarOption diagnostics deprecatedSingleOrListOf; inherit (lib.nvim.dag) entryAnywhere; inherit (lib.nvim.attrsets) mapListToAttrs; @@ -28,7 +29,11 @@ }; defaultDiagnosticsProvider = ["htmlhint"]; - diagnosticsProviders = ["htmlhint"]; + diagnosticsProviders = { + htmlhint = { + config.cmd = getExe pkgs.htmlhint; + }; + }; in { options.vim.languages.html = { enable = mkEnableOption "HTML language support"; @@ -78,16 +83,16 @@ in { extraDiagnostics = { enable = - mkEnableOption "extra HTML diagnostics via nvim-lint" + mkEnableOption "extra HTML diagnostics" // { default = config.vim.languages.enableExtraDiagnostics; defaultText = literalExpression "config.vim.languages.enableExtraDiagnostics"; }; - types = mkOption { - type = listOf (enum diagnosticsProviders); - default = defaultDiagnosticsProvider; - description = "extra HTML diagnostics providers"; + types = diagnostics { + langDesc = "HTML"; + inherit diagnosticsProviders; + inherit defaultDiagnosticsProvider; }; }; }; @@ -133,12 +138,13 @@ in { }) (mkIf cfg.extraDiagnostics.enable { - vim.diagnostics = { - presets = genAttrs cfg.extraDiagnostics.types (_: {enable = true;}); - nvim-lint = { - enable = true; - linters_by_ft.html = cfg.extraDiagnostics.types; - }; + vim.diagnostics.nvim-lint = { + enable = true; + linters_by_ft.html = cfg.extraDiagnostics.types; + linters = mkMerge (map (name: { + ${name} = diagnosticsProviders.${name}.config; + }) + cfg.extraDiagnostics.types); }; }) ]); diff --git a/modules/plugins/languages/kotlin.nix b/modules/plugins/languages/kotlin.nix index 2aa0d6be..27b9a14b 100644 --- a/modules/plugins/languages/kotlin.nix +++ b/modules/plugins/languages/kotlin.nix @@ -6,9 +6,11 @@ }: let inherit (lib.options) literalExpression mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; + inherit (lib.meta) getExe; inherit (lib) genAttrs; inherit (lib.types) enum listOf; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.types) mkGrammarOption diagnostics; + inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.kotlin; @@ -16,7 +18,11 @@ servers = ["kotlin-language-server"]; defaultDiagnosticsProvider = ["ktlint"]; - diagnosticsProviders = ["ktlint"]; + diagnosticsProviders = { + ktlint = { + package = pkgs.ktlint; + }; + }; in { options.vim.languages.kotlin = { enable = mkEnableOption "Kotlin/HCL support"; @@ -47,16 +53,16 @@ in { extraDiagnostics = { enable = - mkEnableOption "extra Kotlin diagnostics via nvim-lint" + mkEnableOption "extra Kotlin diagnostics" // { default = config.vim.languages.enableExtraDiagnostics; defaultText = literalExpression "config.vim.languages.enableExtraDiagnostics"; }; - types = mkOption { - type = listOf (enum diagnosticsProviders); - default = defaultDiagnosticsProvider; - description = "extra Kotlin diagnostics providers"; + types = diagnostics { + langDesc = "Kotlin"; + inherit diagnosticsProviders; + inherit defaultDiagnosticsProvider; }; }; }; @@ -67,12 +73,13 @@ in { }) (mkIf cfg.extraDiagnostics.enable { - vim.diagnostics = { - presets = genAttrs cfg.extraDiagnostics.types (_: {enable = true;}); - nvim-lint = { - enable = true; - linters_by_ft.kotlin = cfg.extraDiagnostics.types; - }; + vim.diagnostics.nvim-lint = { + enable = true; + linters_by_ft.kotlin = cfg.extraDiagnostics.types; + linters = mkMerge (map (name: { + ${name}.cmd = getExe diagnosticsProviders.${name}.package; + }) + cfg.extraDiagnostics.types); }; }) diff --git a/modules/plugins/languages/lua.nix b/modules/plugins/languages/lua.nix index bc575580..1228db7a 100644 --- a/modules/plugins/languages/lua.nix +++ b/modules/plugins/languages/lua.nix @@ -10,7 +10,7 @@ inherit (lib.meta) getExe; inherit (lib) genAttrs; inherit (lib.types) bool enum listOf; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.types) diagnostics mkGrammarOption; inherit (lib.nvim.dag) entryBefore; inherit (lib.nvim.attrsets) mapListToAttrs; @@ -27,7 +27,14 @@ }; defaultDiagnosticsProvider = ["luacheck"]; - diagnosticsProviders = ["luacheck" "selene"]; + diagnosticsProviders = { + luacheck = { + package = pkgs.luajitPackages.luacheck; + }; + selene = { + package = pkgs.selene; + }; + }; in { imports = [ (lib.mkRemovedOptionModule ["vim" "languages" "lua" "lsp" "neodev"] '' @@ -79,15 +86,15 @@ in { extraDiagnostics = { enable = - mkEnableOption "extra Lua diagnostics via nvim-lint" + mkEnableOption "extra Lua diagnostics" // { default = config.vim.languages.enableExtraDiagnostics; defaultText = literalExpression "config.vim.languages.enableExtraDiagnostics"; }; - types = mkOption { - type = listOf (enum diagnosticsProviders); - default = defaultDiagnosticsProvider; - description = "extra Lua diagnostics providers"; + types = diagnostics { + langDesc = "Lua"; + inherit diagnosticsProviders; + inherit defaultDiagnosticsProvider; }; }; }; @@ -136,12 +143,13 @@ in { }) (mkIf cfg.extraDiagnostics.enable { - vim.diagnostics = { - presets = genAttrs cfg.extraDiagnostics.types (_: {enable = true;}); - nvim-lint = { - enable = true; - linters_by_ft.lua = cfg.extraDiagnostics.types; - }; + vim.diagnostics.nvim-lint = { + enable = true; + linters_by_ft.lua = cfg.extraDiagnostics.types; + linters = mkMerge (map (name: { + ${name}.cmd = getExe diagnosticsProviders.${name}.package; + }) + cfg.extraDiagnostics.types); }; }) ])) diff --git a/modules/plugins/languages/make.nix b/modules/plugins/languages/make.nix index c5795a70..25cbb885 100644 --- a/modules/plugins/languages/make.nix +++ b/modules/plugins/languages/make.nix @@ -6,10 +6,10 @@ }: let inherit (builtins) attrNames; inherit (lib.options) literalExpression mkEnableOption mkOption; + inherit (lib.meta) getExe; inherit (lib.types) listOf enum; - inherit (lib) genAttrs; inherit (lib.modules) mkIf mkMerge; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.types) mkGrammarOption diagnostics; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.make; @@ -22,7 +22,13 @@ }; defaultDiagnosticsProvider = ["checkmake"]; - diagnosticsProviders = ["checkmake"]; + diagnosticsProviders = { + checkmake = { + config = { + cmd = getExe pkgs.checkmake; + }; + }; + }; in { options.vim.languages.make = { enable = mkEnableOption "Make support"; @@ -53,15 +59,15 @@ in { extraDiagnostics = { enable = - mkEnableOption "extra Make diagnostics via nvim-lint" + mkEnableOption "extra Make diagnostics" // { default = config.vim.languages.enableExtraDiagnostics; defaultText = literalExpression "config.vim.languages.enableExtraDiagnostics"; }; - types = mkOption { - type = listOf (enum diagnosticsProviders); - default = defaultDiagnosticsProvider; - description = "extra Make diagnostics providers"; + types = diagnostics { + langDesc = "Make"; + inherit diagnosticsProviders; + inherit defaultDiagnosticsProvider; }; }; }; @@ -90,12 +96,12 @@ in { }) (mkIf cfg.extraDiagnostics.enable { - vim.diagnostics = { - presets = genAttrs cfg.extraDiagnostics.types (_: {enable = true;}); - nvim-lint = { - enable = true; - linters_by_ft.make = cfg.extraDiagnostics.types; - }; + vim.diagnostics.nvim-lint = { + enable = true; + linters_by_ft.make = cfg.extraDiagnostics.types; + linters = + mkMerge (map (name: {${name} = diagnosticsProviders.${name}.config;}) + cfg.extraDiagnostics.types); }; }) ]); diff --git a/modules/plugins/languages/markdown.nix b/modules/plugins/languages/markdown.nix index bb2bb5bb..71773c8a 100644 --- a/modules/plugins/languages/markdown.nix +++ b/modules/plugins/languages/markdown.nix @@ -11,7 +11,7 @@ inherit (lib.options) literalExpression mkEnableOption mkOption; inherit (lib.types) bool enum listOf str nullOr; inherit (lib.nvim.lua) toLuaObject; - inherit (lib.nvim.types) mkGrammarOption mkPluginSetupOption deprecatedSingleOrListOf; + inherit (lib.nvim.types) diagnostics mkGrammarOption mkPluginSetupOption deprecatedSingleOrListOf; inherit (lib.nvim.dag) entryAnywhere; inherit (lib.nvim.attrsets) mapListToAttrs; inherit (lib.trivial) warn; @@ -46,7 +46,14 @@ }; }; defaultDiagnosticsProvider = ["markdownlint-cli2"]; - diagnosticsProviders = ["markdownlint-cli2" "rumdl"]; + diagnosticsProviders = { + markdownlint-cli2 = { + package = pkgs.markdownlint-cli2; + }; + rumdl = { + package = pkgs.rumdl; + }; + }; in { options.vim.languages.markdown = { enable = mkEnableOption "Markdown markup language support"; @@ -139,15 +146,15 @@ in { extraDiagnostics = { enable = - mkEnableOption "extra Markdown diagnostics via nvim-lint" + mkEnableOption "extra Markdown diagnostics" // { default = config.vim.languages.enableExtraDiagnostics; defaultText = literalExpression "config.vim.languages.enableExtraDiagnostics"; }; - types = mkOption { - type = listOf (enum diagnosticsProviders); - default = defaultDiagnosticsProvider; - description = "extra Markdown diagnostics providers"; + types = diagnostics { + langDesc = "Markdown"; + inherit diagnosticsProviders; + inherit defaultDiagnosticsProvider; }; }; }; @@ -207,12 +214,13 @@ in { }) (mkIf cfg.extraDiagnostics.enable { - vim.diagnostics = { - presets = genAttrs cfg.extraDiagnostics.types (_: {enable = true;}); - nvim-lint = { - enable = true; - linters_by_ft.markdown = cfg.extraDiagnostics.types; - }; + vim.diagnostics.nvim-lint = { + enable = true; + linters_by_ft.markdown = cfg.extraDiagnostics.types; + linters = mkMerge (map (name: { + ${name}.cmd = getExe diagnosticsProviders.${name}.package; + }) + cfg.extraDiagnostics.types); }; }) ]); diff --git a/modules/plugins/languages/nix.nix b/modules/plugins/languages/nix.nix index 06767a3c..3a992bb2 100644 --- a/modules/plugins/languages/nix.nix +++ b/modules/plugins/languages/nix.nix @@ -10,7 +10,7 @@ inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.modules) mkIf mkMerge; inherit (lib.types) enum listOf; - inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; + inherit (lib.nvim.types) mkGrammarOption diagnostics deprecatedSingleOrListOf; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.nix; @@ -30,7 +30,31 @@ }; defaultDiagnosticsProvider = ["statix" "deadnix"]; - diagnosticsProviders = ["statix" "deadnix"]; + diagnosticsProviders = { + statix = { + package = pkgs.statix; + nullConfig = pkg: '' + table.insert( + ls_sources, + null_ls.builtins.diagnostics.statix.with({ + command = "${pkg}/bin/statix", + }) + ) + ''; + }; + + deadnix = { + package = pkgs.deadnix; + nullConfig = pkg: '' + table.insert( + ls_sources, + null_ls.builtins.diagnostics.deadnix.with({ + command = "${pkg}/bin/deadnix", + }) + ) + ''; + }; + }; in { options.vim.languages.nix = { enable = mkEnableOption "Nix language support"; @@ -76,16 +100,16 @@ in { extraDiagnostics = { enable = - mkEnableOption "extra Nix diagnostics via nvim-lint" + mkEnableOption "extra Nix diagnostics" // { default = config.vim.languages.enableExtraDiagnostics; defaultText = literalExpression "config.vim.languages.enableExtraDiagnostics"; }; - types = mkOption { - type = listOf (enum diagnosticsProviders); - default = defaultDiagnosticsProvider; - description = "extra Nix diagnostics providers"; + types = diagnostics { + langDesc = "Nix"; + inherit diagnosticsProviders; + inherit defaultDiagnosticsProvider; }; }; }; @@ -196,12 +220,13 @@ in { }) (mkIf cfg.extraDiagnostics.enable { - vim.diagnostics = { - presets = genAttrs cfg.extraDiagnostics.types (_: {enable = true;}); - nvim-lint = { - enable = true; - linters_by_ft.nix = cfg.extraDiagnostics.types; - }; + vim.diagnostics.nvim-lint = { + enable = true; + linters_by_ft.nix = cfg.extraDiagnostics.types; + linters = mkMerge (map (name: { + ${name}.cmd = getExe diagnosticsProviders.${name}.package; + }) + cfg.extraDiagnostics.types); }; }) ]); diff --git a/modules/plugins/languages/php.nix b/modules/plugins/languages/php.nix index a9afa090..d06d047e 100644 --- a/modules/plugins/languages/php.nix +++ b/modules/plugins/languages/php.nix @@ -4,14 +4,14 @@ lib, ... }: let - inherit (builtins) attrNames; + inherit (builtins) attrNames toString; inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib) genAttrs; inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; inherit (lib.types) enum int attrs listOf; inherit (lib.nvim.lua) toLuaObject; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.types) mkGrammarOption diagnostics; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.php; @@ -35,7 +35,12 @@ }; defaultDiagnosticsProvider = ["phpstan"]; - diagnosticsProviders = ["phpstan"]; + + diagnosticsProviders = { + phpstan = { + config.cmd = getExe pkgs.phpstan; + }; + }; in { options.vim.languages.php = { enable = mkEnableOption "PHP language support"; @@ -109,15 +114,16 @@ in { extraDiagnostics = { enable = - mkEnableOption "extra PHP diagnostics via nvim-lint" + mkEnableOption "extra PHP diagnostics" // { default = config.vim.languages.enableExtraDiagnostics; - defaultText = literalExpression "config.vim.languages.enableExtraDiagnostics"; + defaultText = literalExpression "config.vim.languages.enableExtraDiagnostic"; }; - types = mkOption { - type = listOf (enum diagnosticsProviders); - default = defaultDiagnosticsProvider; - description = "extra PHP diagnostics providers"; + + types = diagnostics { + langDesc = "PHP"; + inherit diagnosticsProviders; + inherit defaultDiagnosticsProvider; }; }; }; @@ -173,12 +179,12 @@ in { }) (mkIf cfg.extraDiagnostics.enable { - vim.diagnostics = { - presets = genAttrs cfg.extraDiagnostics.types (_: {enable = true;}); - nvim-lint = { - enable = true; - linters_by_ft.php = cfg.extraDiagnostics.types; - }; + vim.diagnostics.nvim-lint = { + enable = true; + linters_by_ft.php = cfg.extraDiagnostics.types; + linters = + mkMerge (map (name: {${name} = diagnosticsProviders.${name}.config;}) + cfg.extraDiagnostics.types); }; }) ]); diff --git a/modules/plugins/languages/python.nix b/modules/plugins/languages/python.nix index a5030cbf..5e1eaa7b 100644 --- a/modules/plugins/languages/python.nix +++ b/modules/plugins/languages/python.nix @@ -8,11 +8,11 @@ inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.lists) flatten; inherit (lib) genAttrs; - inherit (lib.meta) getExe; + inherit (lib.meta) getExe getExe'; inherit (lib.modules) mkIf mkMerge; inherit (lib.types) enum package bool listOf; inherit (lib.nvim.attrsets) mapListToAttrs; - inherit (lib.nvim.types) deprecatedSingleOrListOf; + inherit (lib.nvim.types) deprecatedSingleOrListOf diagnostics; inherit (lib.trivial) warn; cfg = config.vim.languages.python; @@ -112,7 +112,13 @@ }; }; defaultDiagnosticsProvider = ["mypy"]; - diagnosticsProviders = ["mypy"]; + diagnosticsProviders = { + mypy = { + config = { + cmd = getExe' pkgs.mypy "mypy"; + }; + }; + }; in { options.vim.languages.python = { enable = mkEnableOption "Python language support"; @@ -189,15 +195,15 @@ in { extraDiagnostics = { enable = - mkEnableOption "extra Python diagnostics via nvim-lint" + mkEnableOption "extra Python diagnostics" // { default = config.vim.languages.enableExtraDiagnostics; defaultText = literalExpression "config.vim.languages.enableExtraDiagnostics"; }; - types = mkOption { - type = listOf (enum diagnosticsProviders); - default = defaultDiagnosticsProvider; - description = "extra Python diagnostics providers"; + types = diagnostics { + langDesc = "Python"; + inherit diagnosticsProviders; + inherit defaultDiagnosticsProvider; }; }; }; @@ -255,12 +261,12 @@ in { }) (mkIf cfg.extraDiagnostics.enable { - vim.diagnostics = { - presets = genAttrs cfg.extraDiagnostics.types (_: {enable = true;}); - nvim-lint = { - enable = true; - linters_by_ft.python = cfg.extraDiagnostics.types; - }; + vim.diagnostics.nvim-lint = { + enable = true; + linters_by_ft.python = cfg.extraDiagnostics.types; + linters = + mkMerge (map (name: {${name} = diagnosticsProviders.${name}.config;}) + cfg.extraDiagnostics.types); }; }) ]); diff --git a/modules/plugins/languages/ruby.nix b/modules/plugins/languages/ruby.nix index 618698d3..4c8415d8 100644 --- a/modules/plugins/languages/ruby.nix +++ b/modules/plugins/languages/ruby.nix @@ -9,7 +9,7 @@ inherit (lib) genAttrs; inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; - inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf enumWithRename; + inherit (lib.nvim.types) mkGrammarOption diagnostics deprecatedSingleOrListOf enumWithRename; inherit (lib.types) enum listOf; inherit (lib.nvim.attrsets) mapListToAttrs; @@ -28,7 +28,11 @@ }; defaultDiagnosticsProvider = ["rubocop"]; - diagnosticsProviders = ["rubocop"]; + diagnosticsProviders = { + rubocop = { + package = pkgs.rubyPackages.rubocop; + }; + }; in { options.vim.languages.ruby = { enable = mkEnableOption "Ruby language support"; @@ -75,13 +79,13 @@ in { extraDiagnostics = { enable = - mkEnableOption "Ruby extra diagnostics via nvim-lint" + mkEnableOption "Ruby extra diagnostics support" // {default = config.vim.languages.enableExtraDiagnostics;}; - types = mkOption { - type = listOf (enum diagnosticsProviders); - default = defaultDiagnosticsProvider; - description = "extra Ruby diagnostics providers"; + types = diagnostics { + langDesc = "Ruby"; + inherit diagnosticsProviders; + inherit defaultDiagnosticsProvider; }; }; }; @@ -117,15 +121,13 @@ in { }) (mkIf cfg.extraDiagnostics.enable { - vim.diagnostics = { - presets = genAttrs cfg.extraDiagnostics.types (_: {enable = true;}); - nvim-lint = { - enable = true; - linters_by_ft = { - ruby = cfg.extraDiagnostics.types; - eruby = cfg.extraDiagnostics.types; - }; - }; + vim.diagnostics.nvim-lint = { + enable = true; + linters_by_ft.ruby = cfg.extraDiagnostics.types; + linters = mkMerge (map (name: { + ${name}.cmd = getExe diagnosticsProviders.${name}.package; + }) + cfg.extraDiagnostics.types); }; }) ]); diff --git a/modules/plugins/languages/scss.nix b/modules/plugins/languages/scss.nix index 40fe5986..81439f7a 100644 --- a/modules/plugins/languages/scss.nix +++ b/modules/plugins/languages/scss.nix @@ -10,7 +10,7 @@ inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; inherit (lib.types) enum listOf; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.types) mkGrammarOption diagnostics; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.scss; @@ -30,7 +30,13 @@ }; defaultDiagnosticsProvider = ["stylelint"]; - diagnosticsProviders = ["stylelint"]; + diagnosticsProviders = { + stylelint = { + config = { + cmd = getExe pkgs.stylelint; + }; + }; + }; in { options.vim.languages.scss = { enable = mkEnableOption "SCSS/SASS language support"; @@ -76,15 +82,15 @@ in { extraDiagnostics = { enable = - mkEnableOption "extra SCSS/SASS diagnostics via nvim-lint" + mkEnableOption "extra SCSS/SASS diagnostics" // { default = config.vim.languages.enableExtraDiagnostics; defaultText = literalExpression "config.vim.languages.enableExtraDiagnostics"; }; - types = mkOption { - type = listOf (enum diagnosticsProviders); - default = defaultDiagnosticsProvider; - description = "extra SCSS/SASS diagnostics providers"; + types = diagnostics { + langDesc = "SCSS"; + inherit diagnosticsProviders; + inherit defaultDiagnosticsProvider; }; }; }; @@ -124,15 +130,13 @@ in { }) (mkIf cfg.extraDiagnostics.enable { - vim.diagnostics = { - presets = genAttrs cfg.extraDiagnostics.types (_: {enable = true;}); - nvim-lint = { - enable = true; - linters_by_ft = { - scss = cfg.extraDiagnostics.types; - sass = cfg.extraDiagnostics.types; - }; - }; + vim.diagnostics.nvim-lint = { + enable = true; + linters_by_ft.scss = cfg.extraDiagnostics.types; + linters_by_ft.sass = cfg.extraDiagnostics.types; + linters = + mkMerge (map (name: {${name} = diagnosticsProviders.${name}.config;}) + cfg.extraDiagnostics.types); }; }) ]); diff --git a/modules/plugins/languages/sql.nix b/modules/plugins/languages/sql.nix index acc9293f..61ed04b4 100644 --- a/modules/plugins/languages/sql.nix +++ b/modules/plugins/languages/sql.nix @@ -9,8 +9,8 @@ inherit (lib) genAttrs; inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) enum package listOf; - inherit (lib.nvim.types) deprecatedSingleOrListOf; + inherit (lib.types) enum package str listOf; + inherit (lib.nvim.types) diagnostics deprecatedSingleOrListOf; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.sql; @@ -24,18 +24,41 @@ formats = { sqlfluff = { command = getExe sqlfluffDefault; + append_args = ["--dialect=${cfg.dialect}"]; }; sqruff = { command = getExe sqruffDefault; + append_args = ["--dialect=${cfg.dialect}"]; }; }; defaultDiagnosticsProvider = ["sqlfluff"]; - diagnosticsProviders = ["sqlfluff" "sqruff"]; + diagnosticsProviders = { + sqlfluff = { + package = sqlfluffDefault; + config = { + cmd = getExe sqlfluffDefault; + args = ["lint" "--format=json" "--dialect=${cfg.dialect}"]; + }; + }; + sqruff = { + package = sqruffDefault; + config = { + cmd = getExe sqruffDefault; + args = ["lint" "--format=json" "--dialect=${cfg.dialect}" "-"]; + }; + }; + }; in { options.vim.languages.sql = { enable = mkEnableOption "SQL language support"; + dialect = mkOption { + type = str; + default = "ansi"; + description = "SQL dialect for formatters and diagnostics (if used)"; + }; + treesitter = { enable = mkEnableOption "SQL treesitter" @@ -83,16 +106,16 @@ in { extraDiagnostics = { enable = - mkEnableOption "extra SQL diagnostics via nvim-lint" + mkEnableOption "extra SQL diagnostics" // { default = config.vim.languages.enableExtraDiagnostics; defaultText = literalExpression "config.vim.languages.enableExtraDiagnostics"; }; - types = mkOption { - type = listOf (enum diagnosticsProviders); - default = defaultDiagnosticsProvider; - description = "extra SQL diagnostics providers"; + types = diagnostics { + langDesc = "SQL"; + inherit diagnosticsProviders; + inherit defaultDiagnosticsProvider; }; }; }; @@ -130,14 +153,12 @@ in { }) (mkIf cfg.extraDiagnostics.enable { - vim.diagnostics = { - presets = genAttrs cfg.extraDiagnostics.types (_: { - enable = true; - }); - nvim-lint = { - enable = true; - linters_by_ft.sql = cfg.extraDiagnostics.types; - }; + vim.diagnostics.nvim-lint = { + enable = true; + linters_by_ft.sql = cfg.extraDiagnostics.types; + linters = + mkMerge (map (name: {${name} = diagnosticsProviders.${name}.config;}) + cfg.extraDiagnostics.types); }; }) ]); diff --git a/modules/plugins/languages/svelte.nix b/modules/plugins/languages/svelte.nix index a70f9c60..d21586a1 100644 --- a/modules/plugins/languages/svelte.nix +++ b/modules/plugins/languages/svelte.nix @@ -11,7 +11,7 @@ inherit (lib) genAttrs; inherit (lib.meta) getExe; inherit (lib.types) enum coercedTo listOf; - inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; + inherit (lib.nvim.types) mkGrammarOption diagnostics deprecatedSingleOrListOf; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.svelte; @@ -35,8 +35,26 @@ }; }; + # TODO: specify packages defaultDiagnosticsProvider = ["eslint_d"]; - diagnosticsProviders = ["eslint_d"]; + diagnosticsProviders = { + eslint_d = let + pkg = pkgs.eslint_d; + in { + package = pkg; + config = { + cmd = getExe pkg; + required_files = [ + "eslint.config.js" + "eslint.config.mjs" + ".eslintrc" + ".eslintrc.json" + ".eslintrc.js" + ".eslintrc.yml" + ]; + }; + }; + }; formatType = deprecatedSingleOrListOf @@ -93,16 +111,16 @@ in { extraDiagnostics = { enable = - mkEnableOption "extra Svelte diagnostics via nvim-lint" + mkEnableOption "extra Svelte diagnostics" // { default = config.vim.languages.enableExtraDiagnostics; defaultText = literalExpression "config.vim.languages.enableExtraDiagnostics"; }; - types = mkOption { - type = listOf (enum diagnosticsProviders); - default = defaultDiagnosticsProvider; - description = "extra Svelte diagnostics providers"; + types = diagnostics { + langDesc = "Svelte"; + inherit diagnosticsProviders; + inherit defaultDiagnosticsProvider; }; }; }; @@ -138,12 +156,12 @@ in { }) (mkIf cfg.extraDiagnostics.enable { - vim.diagnostics = { - presets = genAttrs cfg.extraDiagnostics.types (_: {enable = true;}); - nvim-lint = { - enable = true; - linters_by_ft.svelte = cfg.extraDiagnostics.types; - }; + vim.diagnostics.nvim-lint = { + enable = true; + linters_by_ft.svelte = cfg.extraDiagnostics.types; + linters = + mkMerge (map (name: {${name} = diagnosticsProviders.${name}.config;}) + cfg.extraDiagnostics.types); }; }) ]); diff --git a/modules/plugins/languages/toml.nix b/modules/plugins/languages/toml.nix index 3949b3fc..fc7fd930 100644 --- a/modules/plugins/languages/toml.nix +++ b/modules/plugins/languages/toml.nix @@ -10,7 +10,7 @@ inherit (lib.modules) mkIf mkMerge; inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.types) enum listOf; - inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; + inherit (lib.nvim.types) diagnostics mkGrammarOption deprecatedSingleOrListOf; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.toml; @@ -39,7 +39,12 @@ }; }; defaultDiagnosticsProvider = ["tombi"]; - diagnosticsProviders = ["tombi" "taplo"]; + diagnosticsProviders = { + tombi = { + package = pkgs.tombi; + args = ["lint"]; + }; + }; in { options.vim.languages.toml = { enable = mkEnableOption "TOML configuration language support"; @@ -86,15 +91,15 @@ in { extraDiagnostics = { enable = - mkEnableOption "extra TOML diagnostics via nvim-lint" + mkEnableOption "extra TOML diagnostics" // { default = config.vim.languages.enableExtraDiagnostics; defaultText = literalExpression "config.vim.languages.enableExtraDiagnostics"; }; - types = mkOption { - type = listOf (enum diagnosticsProviders); - default = defaultDiagnosticsProvider; - description = "extra TOML diagnostics providers"; + types = diagnostics { + langDesc = "TOML"; + inherit diagnosticsProviders; + inherit defaultDiagnosticsProvider; }; }; }; @@ -132,12 +137,15 @@ in { }) (mkIf cfg.extraDiagnostics.enable { - vim.diagnostics = { - presets = genAttrs cfg.extraDiagnostics.types (_: {enable = true;}); - nvim-lint = { - enable = true; - linters_by_ft.toml = cfg.extraDiagnostics.types; - }; + vim.diagnostics.nvim-lint = { + enable = true; + linters_by_ft.toml = cfg.extraDiagnostics.types; + linters = mkMerge ( + map (name: { + ${name}.cmd = getExe diagnosticsProviders.${name}.package; + }) + cfg.extraDiagnostics.types + ); }; }) ]); diff --git a/modules/plugins/languages/tsx.nix b/modules/plugins/languages/tsx.nix index c85fca9a..eb954513 100644 --- a/modules/plugins/languages/tsx.nix +++ b/modules/plugins/languages/tsx.nix @@ -10,7 +10,7 @@ inherit (lib.attrsets) attrNames genAttrs; inherit (lib.meta) getExe; inherit (lib.nvim.attrsets) mapListToAttrs; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.types) mkGrammarOption diagnostics; cfg = config.vim.languages.tsx; @@ -41,7 +41,16 @@ }; defaultDiagnosticsProvider = ["biomejs"]; - diagnosticsProviders = ["biomejs"]; + diagnosticsProviders = { + biomejs = let + pkg = pkgs.biome; + in { + package = pkg; + config = { + cmd = getExe pkg; + }; + }; + }; in { options.vim.languages.tsx = { enable = mkEnableOption "Typescript XML (TSX) language support"; @@ -86,12 +95,12 @@ in { }; extraDiagnostics = { - enable = mkEnableOption "extra Typescript XML (TSX) diagnostics via nvim-lint" // {default = config.vim.languages.enableExtraDiagnostics;}; + enable = mkEnableOption "extra Typescript XML (TSX) diagnostics" // {default = config.vim.languages.enableExtraDiagnostics;}; - types = mkOption { - type = listOf (enum diagnosticsProviders); - default = defaultDiagnosticsProvider; - description = "extra Typescript XML (TSX) diagnostics providers"; + types = diagnostics { + langDesc = "Typescript XML (TSX)"; + inherit diagnosticsProviders; + inherit defaultDiagnosticsProvider; }; }; }; @@ -135,15 +144,15 @@ in { }) (mkIf cfg.extraDiagnostics.enable { - vim.diagnostics = { - presets = genAttrs cfg.extraDiagnostics.types (_: {enable = true;}); - nvim-lint = { - enable = true; - linters_by_ft = { - typescriptreact = cfg.extraDiagnostics.types; - javascriptreact = cfg.extraDiagnostics.types; - }; + vim.diagnostics.nvim-lint = { + enable = true; + linters_by_ft = { + typescriptreact = cfg.extraDiagnostics.types; + javascriptreact = cfg.extraDiagnostics.types; }; + linters = + mkMerge (map (name: {${name} = diagnosticsProviders.${name}.config;}) + cfg.extraDiagnostics.types); }; }) ]); diff --git a/modules/plugins/languages/twig.nix b/modules/plugins/languages/twig.nix index 12a19dec..59b5d56a 100644 --- a/modules/plugins/languages/twig.nix +++ b/modules/plugins/languages/twig.nix @@ -10,7 +10,7 @@ inherit (lib) genAttrs; inherit (lib.meta) getExe; inherit (lib.types) listOf enum; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.types) mkGrammarOption diagnostics; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.twig; @@ -26,8 +26,14 @@ # TODO: if twig-cs-fixer gets packaged for nix, add it and default to it. }; defaultDiagnosticsProvider = ["djlint"]; - # TODO: if curlylint gets packaged for nix, add it. - diagnosticsProviders = ["djlint"]; + diagnosticsProviders = { + djlint = { + config = { + cmd = getExe pkgs.djlint; + }; + }; + # TODO: if curlylint gets packaged for nix, add it. + }; in { options.vim.languages.twig = { enable = mkEnableOption "Twig templating language support"; @@ -72,15 +78,15 @@ in { extraDiagnostics = { enable = - mkEnableOption "extra Twig diagnostics via nvim-lint" + mkEnableOption "extra Twig diagnostics" // { default = config.vim.languages.enableExtraDiagnostics; defaultText = literalExpression "config.vim.languages.enableExtraDiagnostics"; }; - types = mkOption { - type = listOf (enum diagnosticsProviders); - default = defaultDiagnosticsProvider; - description = "extra Twig diagnostics providers"; + types = diagnostics { + langDesc = "Twig"; + inherit diagnosticsProviders; + inherit defaultDiagnosticsProvider; }; }; }; @@ -116,12 +122,12 @@ in { }) (mkIf cfg.extraDiagnostics.enable { - vim.diagnostics = { - presets = genAttrs cfg.extraDiagnostics.types (_: {enable = true;}); - nvim-lint = { - enable = true; - linters_by_ft.twig = cfg.extraDiagnostics.types; - }; + vim.diagnostics.nvim-lint = { + enable = true; + linters_by_ft.twig = cfg.extraDiagnostics.types; + linters = + mkMerge (map (name: {${name} = diagnosticsProviders.${name}.config;}) + cfg.extraDiagnostics.types); }; }) ]); diff --git a/modules/plugins/languages/typescript.nix b/modules/plugins/languages/typescript.nix index 1ab161e9..b0d72e89 100644 --- a/modules/plugins/languages/typescript.nix +++ b/modules/plugins/languages/typescript.nix @@ -12,7 +12,7 @@ inherit (lib.types) enum bool listOf; inherit (lib.nvim.attrsets) mapListToAttrs; inherit (lib.nvim.lua) toLuaObject; - inherit (lib.nvim.types) mkGrammarOption mkPluginSetupOption enumWithRename; + inherit (lib.nvim.types) mkGrammarOption diagnostics mkPluginSetupOption enumWithRename; inherit (lib.nvim.dag) entryAnywhere; cfg = config.vim.languages.typescript; @@ -44,8 +44,35 @@ }; }; + # TODO: specify packages defaultDiagnosticsProvider = ["eslint_d"]; - diagnosticsProviders = ["eslint_d" "biomejs"]; + diagnosticsProviders = { + eslint_d = let + pkg = pkgs.eslint_d; + in { + package = pkg; + config = { + cmd = getExe pkg; + required_files = [ + "eslint.config.js" + "eslint.config.mjs" + ".eslintrc" + ".eslintrc.cjs" + ".eslintrc.json" + ".eslintrc.js" + ".eslintrc.yml" + ]; + }; + }; + biomejs = let + pkg = pkgs.biome; + in { + package = pkg; + config = { + cmd = getExe pkg; + }; + }; + }; in { options.vim.languages.typescript = { enable = mkEnableOption "Typescript/Javascript language support"; @@ -101,10 +128,10 @@ in { extraDiagnostics = { enable = mkEnableOption "extra Typescript/Javascript diagnostics" // {default = config.vim.languages.enableExtraDiagnostics;}; - types = mkOption { - type = listOf (enum diagnosticsProviders); - default = defaultDiagnosticsProvider; - description = "extra Typescript/Javascript diagnostics providers"; + types = diagnostics { + langDesc = "Typescript/Javascript"; + inherit diagnosticsProviders; + inherit defaultDiagnosticsProvider; }; }; @@ -170,14 +197,12 @@ in { }) (mkIf cfg.extraDiagnostics.enable { - vim.diagnostics = { - presets = genAttrs cfg.extraDiagnostics.types (_: {enable = true;}); - nvim-lint = { - enable = true; - linters_by_ft = { - typescript = cfg.extraDiagnostics.types; - }; - }; + vim.diagnostics.nvim-lint = { + enable = true; + linters_by_ft.typescript = cfg.extraDiagnostics.types; + linters = + mkMerge (map (name: {${name} = diagnosticsProviders.${name}.config;}) + cfg.extraDiagnostics.types); }; }) diff --git a/modules/plugins/languages/vue.nix b/modules/plugins/languages/vue.nix index 08e5df84..fa468c83 100644 --- a/modules/plugins/languages/vue.nix +++ b/modules/plugins/languages/vue.nix @@ -10,7 +10,7 @@ inherit (lib) genAttrs; inherit (lib.meta) getExe; inherit (lib.types) enum listOf; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.types) mkGrammarOption diagnostics; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.vue; @@ -34,7 +34,16 @@ }; defaultDiagnosticsProvider = ["biomejs"]; - diagnosticsProviders = ["biomejs"]; + diagnosticsProviders = { + biomejs = let + pkg = pkgs.biome; + in { + package = pkg; + config = { + cmd = getExe pkg; + }; + }; + }; in { options.vim.languages.vue = { enable = mkEnableOption "Vue.js language support"; @@ -82,16 +91,16 @@ in { extraDiagnostics = { enable = - mkEnableOption "extra Vue.js diagnostics via nvim-lint" + mkEnableOption "extra Vue.js diagnostics" // { default = config.vim.languages.enableExtraDiagnostics; defaultText = literalExpression "config.vim.languages.enableExtraDiagnostics"; }; - types = mkOption { - type = listOf (enum diagnosticsProviders); - default = defaultDiagnosticsProvider; - description = "extra Vue.js diagnostics providers"; + types = diagnostics { + langDesc = "Vue.js"; + inherit diagnosticsProviders; + inherit defaultDiagnosticsProvider; }; }; }; @@ -127,12 +136,15 @@ in { }) (mkIf cfg.extraDiagnostics.enable { - vim.diagnostics = { - presets = genAttrs cfg.extraDiagnostics.types (_: {enable = true;}); - nvim-lint = { - enable = true; - linters_by_ft.vue = cfg.extraDiagnostics.types; - }; + vim.diagnostics.nvim-lint = { + enable = true; + linters_by_ft.vue = cfg.extraDiagnostics.types; + linters = mkMerge ( + map (name: { + ${name}.cmd = getExe diagnosticsProviders.${name}.package; + }) + cfg.extraDiagnostics.types + ); }; }) ]);