From d47d7c75421a452633553e6462058198fa869587 Mon Sep 17 00:00:00 2001 From: dish Date: Fri, 23 Jan 2026 19:17:31 -0500 Subject: [PATCH 01/18] languages/python: support zuban language server https://zubanls.com/ --- docs/manual/release-notes/rl-0.9.md | 3 ++- modules/plugins/languages/python.nix | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index c38d2421..20aa1f84 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -132,7 +132,8 @@ - Added [sqruff](https://github.com/quarylabs/sqruff) support to `languages.sql` -- Added [Pyrefly](https://pyrefly.org/) support to `languages.python` +- Added [Pyrefly](https://pyrefly.org/) and [zuban](https://zubanls.com/) + support to `languages.python` - Added TOML support via {option}`languages.toml` and the [Tombi](https://tombi-toml.github.io/tombi/) language server, linter, and diff --git a/modules/plugins/languages/python.nix b/modules/plugins/languages/python.nix index 0fffbbcc..04d2554f 100644 --- a/modules/plugins/languages/python.nix +++ b/modules/plugins/languages/python.nix @@ -169,6 +169,22 @@ ".git" ]; }; + + zuban = { + enable = true; + cmd = [(getExe pkgs.zuban) "server"]; + filetypes = ["python"]; + root_markers = [ + "pyproject.toml" + "setup.py" + "setup.cfg" + "requirements.txt" + "Pipfile" + ".git" + "mypy.ini" + ".mypy.ini" + ]; + }; }; defaultFormat = ["black"]; From 1f8d994e07b669f5bf0a57b58668a66a2c0a6eef Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 24 Jan 2026 09:48:45 +0100 Subject: [PATCH 02/18] language/lua: add `selene` for more diagnostics --- docs/manual/release-notes/rl-0.9.md | 5 +++++ modules/plugins/languages/lua.nix | 7 +++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index c38d2421..085a2b47 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -144,3 +144,8 @@ [Machshev](https://github.com/machshev): - Added `ruff` and `ty` LSP support for Python under `programs.python`. + +[Snoweuph](https://github.com/snoweuph) + +- Added [Selenen](https://github.com/kampfkarren/selene) for more diagnostics in + `languages.lua`. diff --git a/modules/plugins/languages/lua.nix b/modules/plugins/languages/lua.nix index 276c9a6a..564fcece 100644 --- a/modules/plugins/languages/lua.nix +++ b/modules/plugins/languages/lua.nix @@ -9,7 +9,7 @@ inherit (lib.modules) mkIf mkMerge; inherit (lib.meta) getExe; inherit (lib.types) bool enum listOf; - inherit (lib.nvim.types) diagnostics mkGrammarOption deprecatedSingleOrListOf; + inherit (lib.nvim.types) diagnostics mkGrammarOption; inherit (lib.nvim.dag) entryBefore; inherit (lib.nvim.attrsets) mapListToAttrs; @@ -46,6 +46,9 @@ luacheck = { package = pkgs.luajitPackages.luacheck; }; + selene = { + package = pkgs.selene; + }; }; in { imports = [ @@ -79,7 +82,7 @@ in { description = "Enable Lua formatting"; }; type = mkOption { - type = deprecatedSingleOrListOf "vim.language.lua.format.type" (enum (attrNames formats)); + type = listOf (enum (attrNames formats)); default = defaultFormat; description = "Lua formatter to use"; }; From 95f6a5d7ecf1960231f19bb204116b40e23b2190 Mon Sep 17 00:00:00 2001 From: Ching Pei Yang Date: Mon, 26 Jan 2026 01:04:09 +0100 Subject: [PATCH 03/18] editorconfig: remove rule conflicting with deno fmt --- .editorconfig | 1 - 1 file changed, 1 deletion(-) diff --git a/.editorconfig b/.editorconfig index f316f5ab..1f39b72e 100644 --- a/.editorconfig +++ b/.editorconfig @@ -13,7 +13,6 @@ trim_trailing_whitespace = true indent_style = space indent_size = 2 trim_trailing_whitespace = false -max_line_length = 80 [*.{js,json,nix,yml,yaml,toml}] indent_style = space From f278a25b2004c7f109d07c32e3416badb6269279 Mon Sep 17 00:00:00 2001 From: Ching Pei Yang Date: Mon, 26 Jan 2026 01:09:04 +0100 Subject: [PATCH 04/18] doc: add textwidth modeline in release-note --- docs/manual/release-notes/rl-0.9.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index f512540c..04a6ba17 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -150,3 +150,5 @@ - Added [Selenen](https://github.com/kampfkarren/selene) for more diagnostics in `languages.lua`. + + From 7bc9581b30df2b26cc25368c2c359d96be14c125 Mon Sep 17 00:00:00 2001 From: NotAShelf Date: Tue, 27 Jan 2026 09:56:12 +0300 Subject: [PATCH 05/18] lib/lua: fully deprecate old helper functions Signed-off-by: NotAShelf Change-Id: Ibed08522c3a9472556a74b6e3290e1916a6a6964 --- lib/lua.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/lua.nix b/lib/lua.nix index bf879031..01c73612 100644 --- a/lib/lua.nix +++ b/lib/lua.nix @@ -49,4 +49,4 @@ in "expToLua" "listToLuaTable" "attrsetToLuaTable" - ] (name: lib.warn "${name} is deprecated use toLuaObject instead" toLuaObject) + ] (name: builtins.throw "${name} is deprecated use toLuaObject instead") From f66d077294acfc44ae0aa856918245fbc2e23662 Mon Sep 17 00:00:00 2001 From: NotAShelf Date: Tue, 27 Jan 2026 10:06:20 +0300 Subject: [PATCH 06/18] languages/rust: `expToLua` -> `toLuaObject` Signed-off-by: NotAShelf Change-Id: I9b40d9129f6f9bf7a4cbda97ef1c165d6a6a6964 --- modules/plugins/languages/rust.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/plugins/languages/rust.nix b/modules/plugins/languages/rust.nix index 3c49d271..015b2956 100644 --- a/modules/plugins/languages/rust.nix +++ b/modules/plugins/languages/rust.nix @@ -11,7 +11,7 @@ inherit (lib.lists) isList; inherit (lib.attrsets) attrNames; inherit (lib.types) bool package str listOf either enum int; - inherit (lib.nvim.lua) expToLua toLuaObject; + inherit (lib.nvim.lua) toLuaObject; inherit (lib.nvim.attrsets) mapListToAttrs; inherit (lib.nvim.types) mkGrammarOption mkPluginSetupOption deprecatedSingleOrListOf; inherit (lib.nvim.dag) entryAfter entryAnywhere; @@ -169,7 +169,7 @@ in { server = { cmd = ${ if isList cfg.lsp.package - then expToLua cfg.lsp.package + then toLuaObject cfg.lsp.package else ''{"${cfg.lsp.package}/bin/rust-analyzer"}'' }, default_settings = { From 3182811b8daa83db4786a5921328252a56f4d1fd Mon Sep 17 00:00:00 2001 From: NotAShelf Date: Tue, 27 Jan 2026 11:45:35 +0300 Subject: [PATCH 07/18] docs/manual: describe registring custom LSPs in the language section Signed-off-by: NotAShelf Change-Id: I776aa1283b0d89016a4eb0de2b67e2f86a6a6964 --- docs/manual/configuring/languages/lsp.md | 40 ++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/docs/manual/configuring/languages/lsp.md b/docs/manual/configuring/languages/lsp.md index 2ddc08b5..847924aa 100644 --- a/docs/manual/configuring/languages/lsp.md +++ b/docs/manual/configuring/languages/lsp.md @@ -21,3 +21,43 @@ vim.languages.java = { }; } ``` + +## Custom LSP Servers {#ch-custom-lsp-servers} + +Neovim 0.11, in an effort to improve the out-of-the-box experience of Neovim, +has introduced a new `vim.lsp` API that can be used to register custom LSP +servers with ease. In **nvf**, this translates to the custom `vim.lsp` API that +can be used to register servers that are not present in existing language +modules. + +The {option}`vim.lsp.servers` submodule can be used to modify existing LSP +definitions OR register your own custom LSPs respectively. For example, if you'd +like to avoid having NVF pull the LSP packages you may modify the start command +to use a string, which will cause the LSP API to discover LSP servers from +{env}`PATH`. For example: + +```nix +{lib, ...}: { + vim.lsp.servers = { + # Get `basedpyright-langserver` from PATH, e.g., a dev shell. + basedpyright.cmd = lib.mkForce ["basedpyright-langserver" "--stdio"]; + + # Define a custom LSP entry using `vim.lsp.servers`: + ty = { + cmd = lib.mkDefault [(lib.getExe pkgs.ty) "server"]; + filetypes = ["python"]; + root_markers = [ + ".git" + "pyproject.toml" + "setup.cfg" + "requirements.txt" + "Pipfile" + "pyrightconfig.json" + ]; + + # If your LSP accepts custom settings. See `:help lsp-config` for more details + # on available fields. This is a freeform field. + settings.ty = { /* ... */ }; + }; +} +``` From 80506176567f47eb8062e4cd658d90befab96f84 Mon Sep 17 00:00:00 2001 From: NotAShelf Date: Tue, 27 Jan 2026 11:50:45 +0300 Subject: [PATCH 08/18] docs/manual: add custom keybinds section; minor wording tweaks Co-Authored-by: horriblename Signed-off-by: NotAShelf Change-Id: Idefa75ca9a92f89d008977a88066515d6a6a6964 --- docs/manual/configuring.md | 1 + docs/manual/configuring/keybinds.md | 38 +++++++++++++++++++ docs/manual/configuring/overriding-plugins.md | 3 +- 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 docs/manual/configuring/keybinds.md diff --git a/docs/manual/configuring.md b/docs/manual/configuring.md index 9a1b71cf..ce455ea7 100644 --- a/docs/manual/configuring.md +++ b/docs/manual/configuring.md @@ -17,6 +17,7 @@ configuring/custom-package.md configuring/custom-plugins.md configuring/overriding-plugins.md configuring/languages.md +configuring/keybinds.md configuring/dags.md configuring/dag-entries.md configuring/autocmds.md diff --git a/docs/manual/configuring/keybinds.md b/docs/manual/configuring/keybinds.md new file mode 100644 index 00000000..401799c1 --- /dev/null +++ b/docs/manual/configuring/keybinds.md @@ -0,0 +1,38 @@ +# Custom keymaps {#ch-keymaps} + +Some plugin modules provide keymap options for your convenience. If a keymap is +not provided by such module options, you may easily register your own custom +keymaps via {option}`vim.keymaps`. + +```nix +{ + config.vim.keymaps = [ + { + key = "m"; + mode = "n"; + silent = true; + action = ":make"; + } + { + key = "l"; + mode = ["n" "x"]; + silent = true; + action = "cnext"; + } + { + key = "k"; + mode = ["n" "x"]; + + # While `lua` is `true`, `action` is expected to be + # a valid Lua expression. + lua = true; + action = '' + function() + require('foo').do_thing() + print('did thing') + end + ''; + } + ]; +} +``` diff --git a/docs/manual/configuring/overriding-plugins.md b/docs/manual/configuring/overriding-plugins.md index 55979ce7..ad681517 100644 --- a/docs/manual/configuring/overriding-plugins.md +++ b/docs/manual/configuring/overriding-plugins.md @@ -14,11 +14,12 @@ vim.pluginOverrides = { rev = ""; hash = ""; }; + # It's also possible to use a flake input lazydev-nvim = inputs.lazydev-nvim; # Or a local path lazydev-nvim = ./lazydev; - # Or a npins pin... etc + # Or a npins pin nvfetcher source, etc. }; ``` From 33cc70b4db47a13383606fd997579110b146c936 Mon Sep 17 00:00:00 2001 From: NotAShelf Date: Tue, 27 Jan 2026 12:07:50 +0300 Subject: [PATCH 09/18] treesitter: move autogroup definition to augroup module Signed-off-by: NotAShelf Change-Id: I1a2f5e47b4d9457a91a84802944ea06f6a6a6964 --- modules/plugins/treesitter/config.nix | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/modules/plugins/treesitter/config.nix b/modules/plugins/treesitter/config.nix index 899e7c19..ab7d2cae 100644 --- a/modules/plugins/treesitter/config.nix +++ b/modules/plugins/treesitter/config.nix @@ -21,9 +21,18 @@ in { treesitter.grammars = optionals cfg.addDefaultGrammars cfg.defaultGrammars; - pluginRC.treesitter-autocommands = entryAfter ["basic"] '' - vim.api.nvim_create_augroup("nvf_treesitter", { clear = true }) + # 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"] '' ${lib.optionalString cfg.highlight.enable '' -- Enable treesitter highlighting for all filetypes vim.api.nvim_create_autocmd("FileType", { @@ -54,6 +63,7 @@ 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 100d9e59a1a6a1ec78abba4d906e86e76ba871b5 Mon Sep 17 00:00:00 2001 From: NotAShelf Date: Tue, 27 Jan 2026 16:10:19 +0300 Subject: [PATCH 10/18] 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 11/18] 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 12/18] 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 13/18] 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 14/18] 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 15/18] 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 16/18] 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 17/18] 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 18/18] 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",