diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index 55641acb..b7df358f 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -25,6 +25,12 @@ - The `setupOpts.mappings` options were also removed. Use the built-in Neovim settings (nvf's {option}`vim.keymaps`) +[Snoweuph](https://github.com/snoweuph) + +- Fix `vim.assistant.codecompanion-nvim.setupOpts.display.diff.provider` to only + allow valid options. `default` is no longer valid. `inline` and `split` are + two new valid options. + ## Changelog {#sec-release-0-9-changelog} [taylrfnt](https://github.com/taylrfnt) @@ -164,6 +170,8 @@ - Added [tera](https://keats.github.io/tera/) language support (syntax highlighting only). +- Added [`golangci-lint`](https://golangci-lint.run/) for more diagnostics. + [vagahbond](https://github.com/vagahbond): [codewindow.nvim]: https://github.com/gorbit99/codewindow.nvim diff --git a/flake.lock b/flake.lock index 0a98f689..a7cdc255 100644 --- a/flake.lock +++ b/flake.lock @@ -38,11 +38,11 @@ }, "mnw": { "locked": { - "lastModified": 1768701608, - "narHash": "sha256-kSvWF3Xt2HW9hmV5V7i8PqeWJIBUKmuKoHhOgj3Znzs=", + "lastModified": 1769981889, + "narHash": "sha256-ndI7AxL/6auelkLHngdUGVImBiHkG8w2N2fOTKZKn4k=", "owner": "Gerg-L", "repo": "mnw", - "rev": "20d63a8a1ae400557c770052a46a9840e768926b", + "rev": "332fed8f43b77149c582f1782683d6aeee1f07cf", "type": "github" }, "original": { diff --git a/modules/plugins/assistant/codecompanion/codecompanion-nvim.nix b/modules/plugins/assistant/codecompanion/codecompanion-nvim.nix index 8e5ed4cc..27603ad7 100644 --- a/modules/plugins/assistant/codecompanion/codecompanion-nvim.nix +++ b/modules/plugins/assistant/codecompanion/codecompanion-nvim.nix @@ -59,8 +59,8 @@ in { }; provider = mkOption { - type = enum ["default" "mini_diff"]; - default = "default"; + type = enum ["inline" "split" "mini_diff"]; + default = "inline"; description = "The preferred kind of provider."; }; }; diff --git a/modules/plugins/languages/go.nix b/modules/plugins/languages/go.nix index c51077f9..bfaafd0d 100644 --- a/modules/plugins/languages/go.nix +++ b/modules/plugins/languages/go.nix @@ -10,7 +10,7 @@ inherit (lib.meta) getExe; inherit (lib.generators) mkLuaInline; inherit (lib.types) bool enum package; - inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; + inherit (lib.nvim.types) mkGrammarOption diagnostics deprecatedSingleOrListOf; inherit (lib.nvim.dag) entryAfter; inherit (lib.nvim.attrsets) mapListToAttrs; @@ -78,6 +78,91 @@ package = pkgs.delve; }; }; + + defaultDiagnosticsProvider = ["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=" + ]; + 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 + 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 + return diagnostics + end + ''; + }; + }; + }; in { options.vim.languages.go = { enable = mkEnableOption "Go language support"; @@ -134,6 +219,14 @@ in { default = debuggers.${cfg.dap.debugger}.package; }; }; + extraDiagnostics = { + enable = mkEnableOption "extra Go diagnostics" // {default = config.vim.languages.enableExtraDiagnostics;}; + types = diagnostics { + langDesc = "Go"; + inherit diagnosticsProviders; + inherit defaultDiagnosticsProvider; + }; + }; }; config = mkIf cfg.enable (mkMerge [ @@ -179,5 +272,15 @@ in { debugger.nvim-dap.enable = true; }; }) + + (mkIf cfg.extraDiagnostics.enable { + 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/wrapper/build/config.nix b/modules/wrapper/build/config.nix index 907983ed..72af1071 100644 --- a/modules/wrapper/build/config.nix +++ b/modules/wrapper/build/config.nix @@ -9,7 +9,7 @@ inherit (lib.trivial) flip; inherit (builtins) filter isString hasAttr getAttr; - getPin = flip getAttr (pkgs.callPackages ../../../npins/sources.nix {}); + getPin = flip getAttr (inputs.mnw.lib.npinsToPluginsAttrs pkgs ../../../npins/sources.json); # Build a Vim plugin with the given name and arguments. buildPlug = attrs: let diff --git a/npins/sources.nix b/npins/sources.nix deleted file mode 100644 index 0b09e232..00000000 --- a/npins/sources.nix +++ /dev/null @@ -1,115 +0,0 @@ -{ - lib, - fetchurl, - fetchgit, - fetchzip, -}: -builtins.mapAttrs -( - name: spec: let - mayOverride = name: path: let - envVarName = "NPINS_OVERRIDE_${saneName}"; - saneName = builtins.concatStringsSep "_" ( - builtins.concatLists ( - builtins.filter (x: builtins.isList x && x != [""]) (builtins.split "([a-zA-Z0-9]*)" name) - ) - ); - ersatz = builtins.getEnv envVarName; - in - if ersatz == "" - then path - else - # this turns the string into an actual Nix path (for both absolute and - # relative paths) - builtins.trace "Overriding path of \"${name}\" with \"${ersatz}\" due to set \"${envVarName}\"" ( - if builtins.substring 0 1 ersatz == "/" - then /. + ersatz - else /. + builtins.getEnv "PWD" + "/${ersatz}" - ); - - path = - rec { - GitRelease = Git; - Channel = Tarball; - - Git = - if spec.url != null && !spec.submodules - then Tarball - else - fetchgit ( - let - repo = spec.repository; - url = - { - Git = repo.url; - GitHub = "https://github.com/${repo.owner}/${repo.repo}.git"; - GitLab = "${repo.server}/${repo.repo_path}.git"; - Forgejo = "${repo.server}/${repo.owner}/${repo.repo}.git"; - } - .${ - repo.type - } or (throw "Unrecognized repository type ${repo.type}"); - in { - name = let - matched = builtins.match "^.*/([^/]*)(\\.git)?$" url; - appendShort = - if (builtins.match "[a-f0-9]*" spec.revision) != null - then "-${builtins.substring 0 7 spec.revision}" - else ""; - in "${ - if matched == null - then "source" - else builtins.head matched - }${appendShort}"; - inherit url; - - rev = spec.revision; - inherit (spec) hash; - fetchSubmodules = spec.submodules; - } - ); - - PyPi = fetchurl { - inherit (spec) url hash; - }; - - Tarball = fetchzip { - inherit (spec) url hash; - extension = "tar"; - }; - } - .${ - spec.type - } or (builtins.throw "Unknown source type ${spec.type}"); - - version = - if spec ? revision - then builtins.substring 0 8 spec.revision - else "0"; - in - spec - // { - name = "${name}-${version}"; - pname = name; - inherit version; - outPath = - ( - # Override logic won't do anything if we're in pure eval - if builtins ? currentSystem - then mayOverride name path - else path - ).overrideAttrs - { - pname = name; - name = "${name}-${version}"; - inherit version; - }; - } -) -( - let - json = lib.importJSON ./sources.json; - in - assert lib.assertMsg (json.version == 7) "Unsupported format version ${toString json.version} in sources.json. Try running `npins upgrade`"; - json.pins -)