From 100d9e59a1a6a1ec78abba4d906e86e76ba871b5 Mon Sep 17 00:00:00 2001 From: NotAShelf Date: Tue, 27 Jan 2026 16:10:19 +0300 Subject: [PATCH 01/10] Revert "treesitter: move autogroup definition to augroup module" This reverts commit 33cc70b4db47a13383606fd997579110b146c936. Signed-off-by: NotAShelf Change-Id: Ida7d935c48909fdfa9978b6e199f222a6a6a6964 --- modules/plugins/treesitter/config.nix | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/modules/plugins/treesitter/config.nix b/modules/plugins/treesitter/config.nix index ab7d2cae..899e7c19 100644 --- a/modules/plugins/treesitter/config.nix +++ b/modules/plugins/treesitter/config.nix @@ -21,18 +21,9 @@ in { treesitter.grammars = optionals cfg.addDefaultGrammars cfg.defaultGrammars; - # Define the autogroup for treesitter here rather than in the Lua snippet - # to allow overriding more easily. Should be highly unlikely that a user - # wants to override, but not impossible. - augroups = [ - { - enable = true; - name = "nvf_treesitter"; - clear = true; - } - ]; - pluginRC.treesitter-autocommands = entryAfter ["basic"] '' + vim.api.nvim_create_augroup("nvf_treesitter", { clear = true }) + ${lib.optionalString cfg.highlight.enable '' -- Enable treesitter highlighting for all filetypes vim.api.nvim_create_autocmd("FileType", { @@ -63,7 +54,6 @@ in { callback = function() vim.wo[0][0].foldmethod = "expr" vim.wo[0][0].foldexpr = "v:lua.vim.treesitter.foldexpr()" - -- This is optional, but is set rather as a sane default. -- If unset, opened files will be folded by automatically as -- the files are opened From dacc7270a5a6db3dd2bdc5ae1713f1fe975ecbd8 Mon Sep 17 00:00:00 2001 From: Vagahbond Date: Wed, 28 Jan 2026 12:06:26 +1300 Subject: [PATCH 02/10] codewindow: allow opening on setup (#1259) * codewindow: allow opening on setup codewindow: allow opening on setup * release notes: add line codewindow: allow opening on setup * codewindow: clean * buildfix: fix rafs wrong code suggestion --------- Co-authored-by: Soliprem <73885403+Soliprem@users.noreply.github.com> Co-authored-by: raf Co-authored-by: Ching Pei Yang <59727193+horriblename@users.noreply.github.com> --- docs/manual/release-notes/rl-0.9.md | 6 ++++++ modules/plugins/minimap/codewindow/codewindow.nix | 3 +++ modules/plugins/minimap/codewindow/config.nix | 5 ++--- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index 04a6ba17..7585c3b5 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -151,4 +151,10 @@ - Added [Selenen](https://github.com/kampfkarren/selene) for more diagnostics in `languages.lua`. +[vagahbond](https://github.com/vagahbond): [codewindow.nvim]: +https://github.com/gorbit99/codewindow.nvim + +- Add [codewindow.nvim] plugin in `vim.assistant.codewindow` with `enable` and + `setupOpts` + diff --git a/modules/plugins/minimap/codewindow/codewindow.nix b/modules/plugins/minimap/codewindow/codewindow.nix index 381e3102..9ad48c9f 100644 --- a/modules/plugins/minimap/codewindow/codewindow.nix +++ b/modules/plugins/minimap/codewindow/codewindow.nix @@ -1,6 +1,7 @@ {lib, ...}: let inherit (lib.options) mkEnableOption; inherit (lib.nvim.binds) mkMappingOption; + inherit (lib.nvim.types) mkPluginSetupOption; in { options.vim.minimap.codewindow = { enable = mkEnableOption "codewindow plugin for minimap view"; @@ -11,5 +12,7 @@ in { toggle = mkMappingOption "Toggle minimap [codewindow]" "mm"; toggleFocus = mkMappingOption "Toggle minimap focus [codewindow]" "mf"; }; + + setupOpts = mkPluginSetupOption "codewindow" {}; }; } diff --git a/modules/plugins/minimap/codewindow/config.nix b/modules/plugins/minimap/codewindow/config.nix index 8a62ee04..020eab7d 100644 --- a/modules/plugins/minimap/codewindow/config.nix +++ b/modules/plugins/minimap/codewindow/config.nix @@ -6,6 +6,7 @@ }: let inherit (lib.modules) mkIf mkMerge; inherit (lib.nvim.dag) entryAnywhere; + inherit (lib.nvim.lua) toLuaObject; inherit (lib.nvim.binds) addDescriptionsToMappings mkSetLuaBinding pushDownDefault; cfg = config.vim.minimap.codewindow; @@ -32,9 +33,7 @@ in { pluginRC.codewindow = entryAnywhere '' local codewindow = require('codewindow') - codewindow.setup({ - exclude_filetypes = { 'NvimTree', 'orgagenda', 'Alpha'}, - }) + codewindow.setup(${toLuaObject cfg.setupOpts}) ''; }; }; From 1481131ee9d4098b2981879c6dc92a3a6c984883 Mon Sep 17 00:00:00 2001 From: NotAShelf Date: Wed, 28 Jan 2026 13:21:40 +0300 Subject: [PATCH 03/10] nix: bump nixpkgs; follow `nixos-unstable` Signed-off-by: NotAShelf Change-Id: I8ba24ece650300380001797216cb44476a6a6964 --- flake.lock | 8 ++++---- flake.nix | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/flake.lock b/flake.lock index 1081a12c..0a98f689 100644 --- a/flake.lock +++ b/flake.lock @@ -74,16 +74,16 @@ }, "nixpkgs": { "locked": { - "lastModified": 1768875095, - "narHash": "sha256-dYP3DjiL7oIiiq3H65tGIXXIT1Waiadmv93JS0sS+8A=", + "lastModified": 1769461804, + "narHash": "sha256-msG8SU5WsBUfVVa/9RPLaymvi5bI8edTavbIq3vRlhI=", "owner": "nixos", "repo": "nixpkgs", - "rev": "ed142ab1b3a092c4d149245d0c4126a5d7ea00b0", + "rev": "bfc1b8a4574108ceef22f02bafcf6611380c100d", "type": "github" }, "original": { "owner": "nixos", - "ref": "nixpkgs-unstable", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } diff --git a/flake.nix b/flake.nix index 4a35cf91..ba817494 100644 --- a/flake.nix +++ b/flake.nix @@ -122,7 +122,7 @@ systems.url = "github:nix-systems/default"; ## Basic Inputs - nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; + nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable"; flake-parts = { url = "github:hercules-ci/flake-parts"; From 82c5119a8a9cf89949cde04310770e98077251cd Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 24 Jan 2026 00:51:05 +0100 Subject: [PATCH 04/10] language/xml: syntax highlighting, formatting, lsp --- configuration.nix | 1 + docs/manual/release-notes/rl-0.9.md | 2 + modules/plugins/languages/default.nix | 1 + modules/plugins/languages/xml.nix | 62 +++++++++++++++++++++++++++ 4 files changed, 66 insertions(+) create mode 100644 modules/plugins/languages/xml.nix diff --git a/configuration.nix b/configuration.nix index b9e3b8ec..040a076e 100644 --- a/configuration.nix +++ b/configuration.nix @@ -72,6 +72,7 @@ isMaximal: { extensions.crates-nvim.enable = isMaximal; }; toml.enable = isMaximal; + xml.enable = isMaximal; # Language modules that are not as common. assembly.enable = false; diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index 7585c3b5..3df92a8f 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -151,6 +151,8 @@ - Added [Selenen](https://github.com/kampfkarren/selene) for more diagnostics in `languages.lua`. +- Added XML syntax highlighting, LSP support and formatting + [vagahbond](https://github.com/vagahbond): [codewindow.nvim]: https://github.com/gorbit99/codewindow.nvim diff --git a/modules/plugins/languages/default.nix b/modules/plugins/languages/default.nix index 9b0d241b..8b550c39 100644 --- a/modules/plugins/languages/default.nix +++ b/modules/plugins/languages/default.nix @@ -50,6 +50,7 @@ in { ./yaml.nix ./ruby.nix ./just.nix + ./xml.nix # This is now a hard deprecation. (mkRenamedOptionModule ["vim" "languages" "enableLSP"] ["vim" "lsp" "enable"]) diff --git a/modules/plugins/languages/xml.nix b/modules/plugins/languages/xml.nix new file mode 100644 index 00000000..351232a9 --- /dev/null +++ b/modules/plugins/languages/xml.nix @@ -0,0 +1,62 @@ +{ + config, + pkgs, + lib, + ... +}: let + inherit (builtins) attrNames; + inherit (lib.options) mkOption mkEnableOption; + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf mkMerge; + inherit (lib.types) enum listOf; + inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.attrsets) mapListToAttrs; + + cfg = config.vim.languages.xml; + + defaultServers = ["lemminx"]; + servers = { + lemminx = { + enable = true; + cmd = [ + (getExe pkgs.lemminx) + ]; + filetypes = ["xml"]; + root_markers = [".git"]; + }; + }; +in { + options.vim.languages.xml = { + enable = mkEnableOption "XML language support"; + + treesitter = { + enable = mkEnableOption "XML treesitter" // {default = config.vim.languages.enableTreesitter;}; + package = mkGrammarOption pkgs "xml"; + }; + + lsp = { + enable = mkEnableOption "XML LSP support" // {default = config.vim.lsp.enable;}; + servers = mkOption { + type = listOf (enum (attrNames servers)); + default = defaultServers; + description = "XML LSP server to use"; + }; + }; + }; + + config = mkIf cfg.enable (mkMerge [ + (mkIf cfg.treesitter.enable { + vim.treesitter.enable = true; + vim.treesitter.grammars = [cfg.treesitter.package]; + }) + + (mkIf cfg.lsp.enable { + vim.lsp.servers = + mapListToAttrs (name: { + inherit name; + value = servers.${name}; + }) + cfg.lsp.servers; + }) + ]); +} From 95f2637d1cbd757a97cd711b0bab5030e9d0db49 Mon Sep 17 00:00:00 2001 From: dish Date: Thu, 29 Jan 2026 12:56:43 -0500 Subject: [PATCH 05/10] languages/rust: lazy-load crates.nvim plugin --- docs/manual/release-notes/rl-0.9.md | 3 +++ modules/plugins/languages/rust.nix | 15 +++++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index 3df92a8f..61128366 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -132,6 +132,9 @@ - Added [sqruff](https://github.com/quarylabs/sqruff) support to `languages.sql` +- Lazy-load `crates.nvim` plugin when using + `vim.languages.rust.extensions.crates-nvim.enable` + - Added [Pyrefly](https://pyrefly.org/) and [zuban](https://zubanls.com/) support to `languages.python` diff --git a/modules/plugins/languages/rust.nix b/modules/plugins/languages/rust.nix index 015b2956..ec5a3d81 100644 --- a/modules/plugins/languages/rust.nix +++ b/modules/plugins/languages/rust.nix @@ -228,10 +228,17 @@ in { (mkIf cfg.extensions.crates-nvim.enable { vim = mkMerge [ { - startPlugins = ["crates-nvim"]; - pluginRC.rust-crates = entryAnywhere '' - require("crates").setup(${toLuaObject cfg.extensions.crates-nvim.setupOpts}) - ''; + lazy.plugins.crates-nvim = { + package = "crates-nvim"; + setupModule = "crates"; + setupOpts = cfg.extensions.crates-nvim.setupOpts; + event = [ + { + event = "BufRead"; + pattern = "Cargo.toml"; + } + ]; + }; } ]; }) From 2b7dd7ecb1a2c99e82bd82933c18be86206bd53e Mon Sep 17 00:00:00 2001 From: dish Date: Thu, 29 Jan 2026 13:36:08 -0500 Subject: [PATCH 06/10] languages/jinja: init (#1359) --- configuration.nix | 2 +- docs/manual/release-notes/rl-0.9.md | 2 + modules/plugins/languages/default.nix | 1 + modules/plugins/languages/jinja.nix | 65 +++++++++++++++++++++++++++ 4 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 modules/plugins/languages/jinja.nix diff --git a/configuration.nix b/configuration.nix index 040a076e..7be2e5cb 100644 --- a/configuration.nix +++ b/configuration.nix @@ -93,7 +93,7 @@ isMaximal: { fsharp.enable = false; just.enable = false; qml.enable = false; - + jinja.enable = false; tailwind.enable = false; svelte.enable = false; diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index 61128366..476fce1b 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -142,6 +142,8 @@ [Tombi](https://tombi-toml.github.io/tombi/) language server, linter, and formatter. +- Added Jinja support via `languages.jinja` + - Added [hlargs.nvim](https://github.com/m-demare/hlargs.nvim) support as `visuals.hlargs-nvim`. diff --git a/modules/plugins/languages/default.nix b/modules/plugins/languages/default.nix index 8b550c39..1dad1434 100644 --- a/modules/plugins/languages/default.nix +++ b/modules/plugins/languages/default.nix @@ -21,6 +21,7 @@ in { ./html.nix ./haskell.nix ./java.nix + ./jinja.nix ./json.nix ./lua.nix ./markdown.nix diff --git a/modules/plugins/languages/jinja.nix b/modules/plugins/languages/jinja.nix new file mode 100644 index 00000000..a4635f58 --- /dev/null +++ b/modules/plugins/languages/jinja.nix @@ -0,0 +1,65 @@ +{ + config, + pkgs, + lib, + ... +}: let + inherit (builtins) attrNames; + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf mkMerge; + inherit (lib.options) mkEnableOption mkOption; + inherit (lib.types) enum listOf; + inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.attrsets) mapListToAttrs; + + cfg = config.vim.languages.jinja; + defaultServers = ["jinja-lsp"]; + servers = { + jinja-lsp = { + enable = true; + cmd = [(getExe pkgs.jinja-lsp)]; + filetypes = ["jinja"]; + root_markers = [ + ".git" + ]; + }; + }; +in { + options.vim.languages.jinja = { + enable = mkEnableOption "Jinja template language support"; + + treesitter = { + enable = mkEnableOption "Jinja treesitter" // {default = config.vim.languages.enableTreesitter;}; + package = mkGrammarOption pkgs "jinja"; + inlinePackage = mkGrammarOption pkgs "jinja_inline"; + }; + + lsp = { + enable = mkEnableOption "Jinja LSP support" // {default = config.vim.lsp.enable;}; + servers = mkOption { + description = "Jinja LSP server to use"; + type = listOf (enum (attrNames servers)); + default = defaultServers; + }; + }; + }; + + config = mkIf cfg.enable (mkMerge [ + (mkIf cfg.treesitter.enable { + vim.treesitter.enable = true; + vim.treesitter.grammars = [ + cfg.treesitter.package + cfg.treesitter.inlinePackage + ]; + }) + + (mkIf cfg.lsp.enable { + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; + }) + ]); +} From 866b983c4047b87bcdca6ab3673ed7bd602f0251 Mon Sep 17 00:00:00 2001 From: dish Date: Thu, 29 Jan 2026 14:48:48 -0500 Subject: [PATCH 07/10] autopairs/nvim-autopairs: lazy-load instead of always loading (#1370) This is suggested per the plugin's readme --- docs/manual/release-notes/rl-0.9.md | 3 +++ modules/plugins/autopairs/nvim-autopairs/config.nix | 13 +++++-------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index 476fce1b..966592db 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -147,6 +147,9 @@ - Added [hlargs.nvim](https://github.com/m-demare/hlargs.nvim) support as `visuals.hlargs-nvim`. +- Lazy-load `nvim-autopairs` plugin when using + `vim.autopairs.nvim-autopairs.enable` + [Machshev](https://github.com/machshev): - Added `ruff` and `ty` LSP support for Python under `programs.python`. diff --git a/modules/plugins/autopairs/nvim-autopairs/config.nix b/modules/plugins/autopairs/nvim-autopairs/config.nix index 6566ec28..1a55273a 100644 --- a/modules/plugins/autopairs/nvim-autopairs/config.nix +++ b/modules/plugins/autopairs/nvim-autopairs/config.nix @@ -4,17 +4,14 @@ ... }: let inherit (lib.modules) mkIf; - inherit (lib.nvim.dag) entryAnywhere; - inherit (lib.nvim.lua) toLuaObject; - cfg = config.vim.autopairs.nvim-autopairs; in { config = mkIf cfg.enable { - vim = { - startPlugins = ["nvim-autopairs"]; - pluginRC.autopairs = entryAnywhere '' - require('nvim-autopairs').setup(${toLuaObject cfg.setupOpts}) - ''; + vim.lazy.plugins.nvim-autopairs = { + package = "nvim-autopairs"; + setupModule = "nvim-autopairs"; + setupOpts = cfg.setupOpts; + event = ["InsertEnter"]; }; }; } From c64645a3a13caca8429f52292157cd30698ca2c3 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 14 Dec 2025 13:17:50 +0100 Subject: [PATCH 08/10] languages/tera: add syntax highlighting support for tera templating --- configuration.nix | 1 + docs/manual/release-notes/rl-0.9.md | 3 +++ modules/plugins/languages/default.nix | 1 + modules/plugins/languages/tera.nix | 28 +++++++++++++++++++++++++++ 4 files changed, 33 insertions(+) create mode 100644 modules/plugins/languages/tera.nix diff --git a/configuration.nix b/configuration.nix index 7be2e5cb..958311b1 100644 --- a/configuration.nix +++ b/configuration.nix @@ -96,6 +96,7 @@ isMaximal: { jinja.enable = false; tailwind.enable = false; svelte.enable = false; + tera.enable = false; # Nim LSP is broken on Darwin and therefore # should be disabled by default. Users may still enable diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index 966592db..08a5cc63 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -161,6 +161,9 @@ - Added XML syntax highlighting, LSP support and formatting +- Added [tera](https://keats.github.io/tera/) language support (syntax + highlighting only). + [vagahbond](https://github.com/vagahbond): [codewindow.nvim]: https://github.com/gorbit99/codewindow.nvim diff --git a/modules/plugins/languages/default.nix b/modules/plugins/languages/default.nix index 1dad1434..7cc5bda5 100644 --- a/modules/plugins/languages/default.nix +++ b/modules/plugins/languages/default.nix @@ -19,6 +19,7 @@ in { ./helm.nix ./kotlin.nix ./html.nix + ./tera.nix ./haskell.nix ./java.nix ./jinja.nix diff --git a/modules/plugins/languages/tera.nix b/modules/plugins/languages/tera.nix new file mode 100644 index 00000000..7e1d5573 --- /dev/null +++ b/modules/plugins/languages/tera.nix @@ -0,0 +1,28 @@ +{ + config, + pkgs, + lib, + ... +}: let + inherit (lib.options) mkEnableOption; + inherit (lib.modules) mkIf mkMerge; + inherit (lib.nvim.types) mkGrammarOption; + + cfg = config.vim.languages.tera; +in { + options.vim.languages.tera = { + enable = mkEnableOption "Tera templating language support"; + + treesitter = { + enable = mkEnableOption "Tera treesitter" // {default = config.vim.languages.enableTreesitter;}; + package = mkGrammarOption pkgs "tera"; + }; + }; + + config = mkIf cfg.enable (mkMerge [ + (mkIf cfg.treesitter.enable { + vim.treesitter.enable = true; + vim.treesitter.grammars = [cfg.treesitter.package]; + }) + ]); +} From a413ce3ac52a21212cda344888d343ce26ab26a8 Mon Sep 17 00:00:00 2001 From: Arbel Arad Date: Fri, 30 Jan 2026 16:56:11 +0200 Subject: [PATCH 09/10] update markview-nvim to support experimental.fancy_comments --- npins/sources.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/npins/sources.json b/npins/sources.json index 9bbcb6ff..d9d1f9cc 100644 --- a/npins/sources.json +++ b/npins/sources.json @@ -973,9 +973,9 @@ }, "branch": "main", "submodules": false, - "revision": "de79a7626d54d7785436105ef72f37ee8fe8fa16", - "url": "https://github.com/OXY2DEV/markview.nvim/archive/de79a7626d54d7785436105ef72f37ee8fe8fa16.tar.gz", - "hash": "sha256-kGhohG4Aw9wMceLiX+s2HCWIyWuJYHoa9D80elM1UQw=" + "revision": "c81ce9ed129387fc5fdec91abe9818a1b0e6fcac", + "url": "https://github.com/OXY2DEV/markview.nvim/archive/c81ce9ed129387fc5fdec91abe9818a1b0e6fcac.tar.gz", + "hash": "sha256-CoPfVkPWh5neyIT1rVEHMLo7532lWvbv0Gg/27D0PHw=" }, "mellow": { "type": "Git", From 8aae70026da3769bf16530aa513ffedeb95dd84c Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 1 Feb 2026 04:11:10 +0100 Subject: [PATCH 10/10] language/go: add `golangci-lint` for extra diagnostics (#1376) --- docs/manual/release-notes/rl-0.9.md | 2 + modules/plugins/languages/go.nix | 105 +++++++++++++++++++++++++++- 2 files changed, 106 insertions(+), 1 deletion(-) diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index 08a5cc63..e31a07e8 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -164,6 +164,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/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); + }; + }) ]); }