From 0c12df5c2957256a8513f35bcf87b310a3fe7301 Mon Sep 17 00:00:00 2001 From: Matthias Putz Date: Mon, 13 Apr 2026 13:52:34 +0200 Subject: [PATCH 001/130] smart-splits: update to v2.1.0 --- npins/sources.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/npins/sources.json b/npins/sources.json index a3c12951..b57b797e 100644 --- a/npins/sources.json +++ b/npins/sources.json @@ -2553,10 +2553,10 @@ "version_upper_bound": null, "release_prefix": null, "submodules": false, - "version": "v2.0.5", - "revision": "0b5eb952e7bb07569bd19818bb1a9c1ed7d822e3", - "url": "https://api.github.com/repos/mrjones2014/smart-splits.nvim/tarball/refs/tags/v2.0.5", - "hash": "sha256-EqnSGTyADvIpHxN3jZxwetENdqv/XUossUzrEvLHHMk=" + "version": "v2.1.0", + "revision": "8a59571f637df2a4d927da9a03539ed4406662d3", + "url": "https://api.github.com/repos/mrjones2014/smart-splits.nvim/tarball/refs/tags/v2.1.0", + "hash": "sha256-IuJNQT0bN68K5lnw0ixyU/heG8V1+zUwlvm0mNvvHOw=" }, "smartcolumn-nvim": { "type": "Git", From fae3be6c27f107efbaf70d671f22f746b0cef980 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 12:23:53 +0200 Subject: [PATCH 002/130] lsp/presets: init --- docs/manual/release-notes/rl-0.9.md | 3 +++ modules/plugins/lsp/default.nix | 2 ++ modules/plugins/lsp/presets/default.nix | 3 +++ 3 files changed, 8 insertions(+) create mode 100644 modules/plugins/lsp/presets/default.nix diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index a6e5dfd6..85c56e03 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -229,6 +229,9 @@ [Snoweuph](https://github.com/snoweuph) +- Added `vim.lsp.presets.` to contain LSP configurations. This allows for + more flexibility in nvf and reuse of LSPs across languages. + - Fix `tressiter` to allow `null` in grammar options, so they can be filtered out. diff --git a/modules/plugins/lsp/default.nix b/modules/plugins/lsp/default.nix index ed20685d..05731e97 100644 --- a/modules/plugins/lsp/default.nix +++ b/modules/plugins/lsp/default.nix @@ -4,6 +4,8 @@ ./config.nix ./module.nix + ./presets + ./lspconfig ./lspsaga ./null-ls diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix new file mode 100644 index 00000000..70dec767 --- /dev/null +++ b/modules/plugins/lsp/presets/default.nix @@ -0,0 +1,3 @@ +{ + imports = []; +} From f6da4534bd95deaccd7e98ffda81c9b1de763004 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 12:31:21 +0200 Subject: [PATCH 003/130] lsp/presets/harper: move to new lsp/presets namespace --- configuration.nix | 2 +- docs/manual/release-notes/rl-0.9.md | 2 + modules/plugins/lsp/default.nix | 1 - modules/plugins/lsp/harper-ls/config.nix | 57 --------------------- modules/plugins/lsp/harper-ls/default.nix | 6 --- modules/plugins/lsp/harper-ls/harper-ls.nix | 35 ------------- modules/plugins/lsp/presets/default.nix | 4 +- modules/plugins/lsp/presets/harper.nix | 53 +++++++++++++++++++ 8 files changed, 59 insertions(+), 101 deletions(-) delete mode 100644 modules/plugins/lsp/harper-ls/config.nix delete mode 100644 modules/plugins/lsp/harper-ls/default.nix delete mode 100644 modules/plugins/lsp/harper-ls/harper-ls.nix create mode 100644 modules/plugins/lsp/presets/harper.nix diff --git a/configuration.nix b/configuration.nix index 2c687794..08c4b1c1 100644 --- a/configuration.nix +++ b/configuration.nix @@ -34,7 +34,7 @@ isMaximal: { lspSignature.enable = !isMaximal; # conflicts with blink in maximal otter-nvim.enable = isMaximal; nvim-docs-view.enable = isMaximal; - harper-ls.enable = isMaximal; + presets.harper.enable = isMaximal; }; debugger = { diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index 85c56e03..1ef7fe8e 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -63,6 +63,8 @@ - Added `json5` into `languages.json`. Some options where renamed. +- Moved `vim.lsp.harper-ls` to `vim.lsp.presets.haper`. + ## Changelog {#sec-release-0-9-changelog} [SecBear](https://github.com/SecBear): diff --git a/modules/plugins/lsp/default.nix b/modules/plugins/lsp/default.nix index 05731e97..6f135858 100644 --- a/modules/plugins/lsp/default.nix +++ b/modules/plugins/lsp/default.nix @@ -9,7 +9,6 @@ ./lspconfig ./lspsaga ./null-ls - ./harper-ls # lsp plugins ./lspsaga diff --git a/modules/plugins/lsp/harper-ls/config.nix b/modules/plugins/lsp/harper-ls/config.nix deleted file mode 100644 index 41a51c62..00000000 --- a/modules/plugins/lsp/harper-ls/config.nix +++ /dev/null @@ -1,57 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: let - inherit (lib.modules) mkIf; - inherit (lib.meta) getExe; - - cfg = config.vim.lsp; -in { - config = mkIf (cfg.enable && cfg.harper-ls.enable) { - vim.lsp.servers.harper-ls = { - root_markers = [".git" ".harper-dictionary.txt"]; - cmd = [(getExe pkgs.harper) "--stdio"]; - settings = {harper-ls = cfg.harper-ls.settings;}; - filetypes = - # - [ - "asciidoc" - "c" - "clojure" - "cmake" - "cpp" - "cs" - "daml" - "dart" - "gitcommit" - "go" - "haskell" - "html" - "ink" - "java" - "javascript" - "javascriptreact" - "kotlin" - "lhaskell" - "lua" - "mail" - "markdown" - "nix" - "php" - "python" - "ruby" - "rust" - "scala" - "sh" - "swift" - "text" - "toml" - "typescript" - "typescriptreact" - "typst" - ]; - }; - }; -} diff --git a/modules/plugins/lsp/harper-ls/default.nix b/modules/plugins/lsp/harper-ls/default.nix deleted file mode 100644 index 9b4b3ec7..00000000 --- a/modules/plugins/lsp/harper-ls/default.nix +++ /dev/null @@ -1,6 +0,0 @@ -{ - imports = [ - ./harper-ls.nix - ./config.nix - ]; -} diff --git a/modules/plugins/lsp/harper-ls/harper-ls.nix b/modules/plugins/lsp/harper-ls/harper-ls.nix deleted file mode 100644 index 9fab45fe..00000000 --- a/modules/plugins/lsp/harper-ls/harper-ls.nix +++ /dev/null @@ -1,35 +0,0 @@ -{lib, ...}: let - inherit (lib.options) mkOption mkEnableOption; - inherit (lib.types) anything attrsOf; -in { - options.vim.lsp.harper-ls = { - enable = mkEnableOption "Harper grammar checking LSP"; - settings = mkOption { - type = attrsOf anything; - default = {}; - example = { - userDictPath = ""; - workspaceDictPath = ""; - fileDictPath = ""; - linters = { - BoringWords = true; - PossessiveNoun = true; - SentenceCapitalization = false; - SpellCheck = false; - }; - codeActions = { - ForceStable = false; - }; - markdown = { - IgnoreLinkTitle = false; - }; - diagnosticSeverity = "hint"; - isolateEnglish = false; - dialect = "American"; - maxFileLength = 120000; - ignoredLintsPath = {}; - }; - description = "Settings to pass to harper-ls"; - }; - }; -} diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 70dec767..f203f801 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -1,3 +1,5 @@ { - imports = []; + imports = [ + ./harper.nix + ]; } diff --git a/modules/plugins/lsp/presets/harper.nix b/modules/plugins/lsp/presets/harper.nix new file mode 100644 index 00000000..3739e937 --- /dev/null +++ b/modules/plugins/lsp/presets/harper.nix @@ -0,0 +1,53 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.harper; +in { + options.vim.lsp.presets.harper = { + enable = mkEnableOption "the Harper grammar checking LSP"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.harper = { + enable = true; + cmd = [(getExe pkgs.harper) "--stdio"]; + root_markers = [".git" ".harper-dictionary.txt"]; + filetypes = [ + # + "asciidoc" + "c" + "clojure" + "cmake" + "cpp" + "cs" + "daml" + "dart" + "gitcommit" + "go" + "haskell" + "html" + "ink" + "java" + "javascript" + "javascriptreact" + "kotlin" + "lhaskell" + "lua" + "mail" + "markdown" + "nix" + "php" + "python" + "ruby" + "rust" + ]; + }; + }; +} From cd73e9dead18f147e593e43ae350d17754cc408c Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 12:32:33 +0200 Subject: [PATCH 004/130] lsp/presets/deno: init --- docs/manual/release-notes/rl-0.9.md | 2 + modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/deno.nix | 111 ++++++++++++++++++++++++ 3 files changed, 114 insertions(+) create mode 100644 modules/plugins/lsp/presets/deno.nix diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index 1ef7fe8e..d4707e67 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -65,6 +65,8 @@ - Moved `vim.lsp.harper-ls` to `vim.lsp.presets.haper`. +- Renamed `denols` to `deno`. + ## Changelog {#sec-release-0-9-changelog} [SecBear](https://github.com/SecBear): diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index f203f801..af1d06d3 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -1,5 +1,6 @@ { imports = [ + ./deno.nix ./harper.nix ]; } diff --git a/modules/plugins/lsp/presets/deno.nix b/modules/plugins/lsp/presets/deno.nix new file mode 100644 index 00000000..92aa16b6 --- /dev/null +++ b/modules/plugins/lsp/presets/deno.nix @@ -0,0 +1,111 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + inherit (lib.generators) mkLuaInline; + + cfg = config.vim.lsp.presets.deno; +in { + options.vim.lsp.presets.deno = { + enable = mkEnableOption "the Deno Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.deno = { + enable = true; + cmd = [(getExe pkgs.deno) "lsp"]; + cmd_env = {NO_COLOR = true;}; + root_markers = ["deno.json" "deno.jsonc" ".git"]; + settings = { + deno = { + enable = true; + suggest = { + imports = { + hosts = { + "https://deno.land" = true; + }; + }; + }; + }; + }; + handlers = let + handler = mkLuaInline '' + function(err, result, ctx, config) + + local function nvf_denols_virtual_text_document_handler(uri, res, client) + if not res then + return nil + end + + local lines = vim.split(res.result, '\n') + local bufnr = vim.uri_to_bufnr(uri) + + local current_buf = vim.api.nvim_buf_get_lines(bufnr, 0, -1, false) + if #current_buf ~= 0 then + return nil + end + + vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, lines) + vim.api.nvim_set_option_value('readonly', true, { buf = bufnr }) + vim.api.nvim_set_option_value('modified', false, { buf = bufnr }) + vim.api.nvim_set_option_value('modifiable', false, { buf = bufnr }) + vim.lsp.buf_attach_client(bufnr, client.id) + end + + local function nvf_denols_virtual_text_document(uri, client) + local params = { + textDocument = { + uri = uri, + }, + } + local result = client.request_sync('deno/virtualTextDocument', params) + nvf_denols_virtual_text_document_handler(uri, result, client) + end + + if not result or vim.tbl_isempty(result) then + return nil + end + + local client = vim.lsp.get_client_by_id(ctx.client_id) + for _, res in pairs(result) do + local uri = res.uri or res.targetUri + if uri:match '^deno:' then + nvf_denols_virtual_text_document(uri, client) + res['uri'] = uri + res['targetUri'] = uri + end + end + + vim.lsp.handlers[ctx.method](err, result, ctx, config) + end + ''; + in { + "textDocument/definition" = handler; + "textDocument/typeDefinition" = handler; + "textDocument/references" = handler; + }; + on_attach = mkLuaInline '' + function(client, bufnr) + vim.api.nvim_buf_create_user_command(0, 'LspDenolsCache', function() + client:exec_cmd({ + command = 'deno.cache', + arguments = { {}, vim.uri_from_bufnr(bufnr) }, + }, { bufnr = bufnr }, function(err, _result, ctx) + if err then + local uri = ctx.params.arguments[2] + vim.api.nvim_err_writeln('cache command failed for ' .. vim.uri_to_fname(uri)) + end + end) + end, { + desc = 'Cache a module and all of its dependencies.', + }) + end + ''; + }; + }; +} From 69ea4a81bd1be43a492c0c6161cc7fe38a0d9f89 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 12:32:55 +0200 Subject: [PATCH 005/130] lsp/presets/lemminx: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/lemminx.nix | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 modules/plugins/lsp/presets/lemminx.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index af1d06d3..ec7b0acc 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -2,5 +2,6 @@ imports = [ ./deno.nix ./harper.nix + ./lemminx.nix ]; } diff --git a/modules/plugins/lsp/presets/lemminx.nix b/modules/plugins/lsp/presets/lemminx.nix new file mode 100644 index 00000000..4d6e9e68 --- /dev/null +++ b/modules/plugins/lsp/presets/lemminx.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.lemminx; +in { + options.vim.lsp.presets.lemminx = { + enable = mkEnableOption "Lemminx Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.lemminx = { + enable = true; + cmd = [(getExe pkgs.lemminx)]; + root_markers = [".git"]; + }; + }; +} From bcfb416372f75462cde0dc90b5d3ac387ea88808 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 12:33:16 +0200 Subject: [PATCH 006/130] lsp/presets/tinymist: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/tinymist.nix | 76 ++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 modules/plugins/lsp/presets/tinymist.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index ec7b0acc..02dca443 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -3,5 +3,6 @@ ./deno.nix ./harper.nix ./lemminx.nix + ./tinymist.nix ]; } diff --git a/modules/plugins/lsp/presets/tinymist.nix b/modules/plugins/lsp/presets/tinymist.nix new file mode 100644 index 00000000..e261cd32 --- /dev/null +++ b/modules/plugins/lsp/presets/tinymist.nix @@ -0,0 +1,76 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + inherit (lib.generators) mkLuaInline; + + cfg = config.vim.lsp.presets.tinymist; +in { + options.vim.lsp.presets.tinymist = { + enable = mkEnableOption "Tinymist Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.tinymist = { + enable = true; + cmd = [(getExe pkgs.tinymist)]; + root_markers = [".git"]; + on_attach = mkLuaInline '' + function(client, bufnr) + local function create_tinymist_command(command_name, client, bufnr) + local export_type = command_name:match 'tinymist%.export(%w+)' + local info_type = command_name:match 'tinymist%.(%w+)' + if info_type and info_type:match '^get' then + info_type = info_type:gsub('^get', 'Get') + end + local cmd_display = export_type or info_type + local function run_tinymist_command() + local arguments = { vim.api.nvim_buf_get_name(bufnr) } + local title_str = export_type and ('Export ' .. cmd_display) or cmd_display + local function handler(err, res) + if err then + return vim.notify(err.code .. ': ' .. err.message, vim.log.levels.ERROR) + end + vim.notify(export_type and res or vim.inspect(res), vim.log.levels.INFO) + end + if vim.fn.has 'nvim-0.11' == 1 then + return client:exec_cmd({ + title = title_str, + command = command_name, + arguments = arguments, + }, { bufnr = bufnr }, handler) + else + return vim.notify('Tinymist commands require Neovim 0.11+', vim.log.levels.WARN) + end + end + local cmd_name = export_type and ('LspTinymistExport' .. cmd_display) or ('LspTinymist' .. cmd_display) + local cmd_desc = export_type and ('Export to ' .. cmd_display) or ('Get ' .. cmd_display) + return run_tinymist_command, cmd_name, cmd_desc + end + + for _, command in ipairs { + 'tinymist.exportSvg', + 'tinymist.exportPng', + 'tinymist.exportPdf', + 'tinymist.exportMarkdown', + 'tinymist.exportText', + 'tinymist.exportQuery', + 'tinymist.exportAnsiHighlight', + 'tinymist.getServerInfo', + 'tinymist.getDocumentTrace', + 'tinymist.getWorkspaceLabels', + 'tinymist.getDocumentMetrics', + } do + local cmd_func, cmd_name, cmd_desc = create_tinymist_command(command, client, bufnr) + vim.api.nvim_buf_create_user_command(bufnr, cmd_name, cmd_func, { nargs = 0, desc = cmd_desc }) + end + end + ''; + }; + }; +} From a14dc9d01271777b05b2d093efe68c86d258adeb Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 12:33:35 +0200 Subject: [PATCH 007/130] lsp/presets/twig-language-server: init --- modules/plugins/lsp/presets/default.nix | 1 + .../lsp/presets/twig-language-server.nix | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 modules/plugins/lsp/presets/twig-language-server.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 02dca443..b7551ae3 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -4,5 +4,6 @@ ./harper.nix ./lemminx.nix ./tinymist.nix + ./twig-language-server.nix ]; } diff --git a/modules/plugins/lsp/presets/twig-language-server.nix b/modules/plugins/lsp/presets/twig-language-server.nix new file mode 100644 index 00000000..6a2c71d3 --- /dev/null +++ b/modules/plugins/lsp/presets/twig-language-server.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.twig-language-server; +in { + options.vim.lsp.presets.twig-language-server = { + enable = mkEnableOption "Twig Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.twig-language-server = { + enable = true; + cmd = [(getExe pkgs.twig-language-server) "--stdio"]; + root_markers = [".git"]; + }; + }; +} From 3f117480078d5f4e1faae7580542280f3eb81496 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 12:34:09 +0200 Subject: [PATCH 008/130] lsp/presets/typescript-go: init --- docs/manual/release-notes/rl-0.9.md | 2 ++ modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/typescript-go.nix | 24 +++++++++++++++++++ 3 files changed, 27 insertions(+) create mode 100644 modules/plugins/lsp/presets/typescript-go.nix diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index d4707e67..ce9af830 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -67,6 +67,8 @@ - Renamed `denols` to `deno`. +- Renamed `tsgo` to `typescript-go`. + ## Changelog {#sec-release-0-9-changelog} [SecBear](https://github.com/SecBear): diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index b7551ae3..5a403992 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -5,5 +5,6 @@ ./lemminx.nix ./tinymist.nix ./twig-language-server.nix + ./typescript-go.nix ]; } diff --git a/modules/plugins/lsp/presets/typescript-go.nix b/modules/plugins/lsp/presets/typescript-go.nix new file mode 100644 index 00000000..9be995f8 --- /dev/null +++ b/modules/plugins/lsp/presets/typescript-go.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.typescript-go; +in { + options.vim.lsp.presets.typescript-go = { + enable = mkEnableOption "the experimental Typescript Go Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.typescript-go = { + enable = true; + cmd = [(getExe pkgs.typescript-go) "--lsp" "--stdio"]; + root_markers = [".git" "package.json"]; + }; + }; +} From 32ba93fe34c839f37305da2a5b3d357714faf4ae Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 12:34:33 +0200 Subject: [PATCH 009/130] lsp/presets/typescript-language-server: init --- docs/manual/release-notes/rl-0.9.md | 2 + modules/plugins/lsp/presets/default.nix | 1 + .../presets/typescript-language-server.nix | 60 +++++++++++++++++++ 3 files changed, 63 insertions(+) create mode 100644 modules/plugins/lsp/presets/typescript-language-server.nix diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index ce9af830..a283160b 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -65,6 +65,8 @@ - Moved `vim.lsp.harper-ls` to `vim.lsp.presets.haper`. +- Renamed `ts_ls` to `typescript-language-server`. + - Renamed `denols` to `deno`. - Renamed `tsgo` to `typescript-go`. diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 5a403992..b529a57a 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -6,5 +6,6 @@ ./tinymist.nix ./twig-language-server.nix ./typescript-go.nix + ./typescript-language-server.nix ]; } diff --git a/modules/plugins/lsp/presets/typescript-language-server.nix b/modules/plugins/lsp/presets/typescript-language-server.nix new file mode 100644 index 00000000..bf1dc1f4 --- /dev/null +++ b/modules/plugins/lsp/presets/typescript-language-server.nix @@ -0,0 +1,60 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + inherit (lib.generators) mkLuaInline; + + cfg = config.vim.lsp.presets.typescript-language-server; +in { + options.vim.lsp.presets.typescript-language-server = { + enable = mkEnableOption "the Typescript Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.typescript-language-server = { + enable = true; + cmd = [(getExe pkgs.typescript-language-server) "--stdio"]; + root_markers = [".git" "package.json"]; + init_options = {hostInfo = "neovim";}; + handlers = { + # handle rename request for certain code actions like extracting functions / types + "_typescript.rename" = mkLuaInline '' + function(_, result, ctx) + local client = assert(vim.lsp.get_client_by_id(ctx.client_id)) + vim.lsp.util.show_document({ + uri = result.textDocument.uri, + range = { + start = result.position, + ['end'] = result.position, + }, + }, client.offset_encoding) + vim.lsp.buf.rename() + return vim.NIL + end + ''; + }; + on_attach = mkLuaInline '' + function(client, bufnr) + -- ts_ls provides `source.*` code actions that apply to the whole file. These only appear in + -- `vim.lsp.buf.code_action()` if specified in `context.only`. + vim.api.nvim_buf_create_user_command(0, 'LspTypescriptSourceAction', function() + local source_actions = vim.tbl_filter(function(action) + return vim.startswith(action, 'source.') + end, client.server_capabilities.codeActionProvider.codeActionKinds) + + vim.lsp.buf.code_action({ + context = { + only = source_actions, + }, + }) + end, {}) + end + ''; + }; + }; +} From 78eac1d1c2ef608b050299fadb6a7f7cdcb0efe9 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 12:35:11 +0200 Subject: [PATCH 010/130] lsp/presets/vala-language-server: init --- docs/manual/release-notes/rl-0.9.md | 5 +++ modules/plugins/lsp/presets/default.nix | 1 + .../lsp/presets/vala-language-server.nix | 35 +++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 modules/plugins/lsp/presets/vala-language-server.nix diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index a283160b..a4153e89 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -71,6 +71,8 @@ - Renamed `tsgo` to `typescript-go`. +- Renamed `vala_ls` to `vala-language-server`. + ## Changelog {#sec-release-0-9-changelog} [SecBear](https://github.com/SecBear): @@ -240,6 +242,9 @@ - Added `vim.lsp.presets.` to contain LSP configurations. This allows for more flexibility in nvf and reuse of LSPs across languages. +- Fix `vim.lsp.presets.vala-language-server` to be wrapped correctly with + `uncrustify`. + - Fix `tressiter` to allow `null` in grammar options, so they can be filtered out. diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index b529a57a..06b7ab57 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -7,5 +7,6 @@ ./twig-language-server.nix ./typescript-go.nix ./typescript-language-server.nix + ./vala-language-server.nix ]; } diff --git a/modules/plugins/lsp/presets/vala-language-server.nix b/modules/plugins/lsp/presets/vala-language-server.nix new file mode 100644 index 00000000..0fe5b96e --- /dev/null +++ b/modules/plugins/lsp/presets/vala-language-server.nix @@ -0,0 +1,35 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.vala-language-server; +in { + options.vim.lsp.presets.vala-language-server = { + enable = mkEnableOption "the Vala Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.vala-language-server = { + enable = true; + # We are wrapping the LSP with uncrustify in the path, + # because it is an optional dependency to support formatting + # + cmd = [ + (getExe (pkgs.symlinkJoin { + name = "vala-language-server-wrapper"; + paths = [pkgs.vala-language-server]; + meta.mainProgram = "vala-language-server"; + buildInputs = [pkgs.makeBinaryWrapper]; + postBuild = "wrapProgram $out/bin/vala-language-server --prefix PATH : ${pkgs.uncrustify}/bin"; + })) + ]; + root_markers = [".git"]; + }; + }; +} From c2baadb73c8c9d09e432ba42b8221f243f6a8f1a Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 12:35:32 +0200 Subject: [PATCH 011/130] lsp/presets/wgsl-analyzer: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/wgsl-analyzer.nix | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 modules/plugins/lsp/presets/wgsl-analyzer.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 06b7ab57..a740a1e4 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -8,5 +8,6 @@ ./typescript-go.nix ./typescript-language-server.nix ./vala-language-server.nix + ./wgsl-analyzer.nix ]; } diff --git a/modules/plugins/lsp/presets/wgsl-analyzer.nix b/modules/plugins/lsp/presets/wgsl-analyzer.nix new file mode 100644 index 00000000..53a3017e --- /dev/null +++ b/modules/plugins/lsp/presets/wgsl-analyzer.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.wgsl-analyzer; +in { + options.vim.lsp.presets.wgsl-analyzer = { + enable = mkEnableOption "the WGSL-Analyzer Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.wgsl-analyzer = { + enable = true; + cmd = [(getExe pkgs.wgsl-analyzer)]; + root_markers = [".git"]; + }; + }; +} From 19d6e9f53c4fbf4040b36b0a1ee1748cb0020406 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 12:36:13 +0200 Subject: [PATCH 012/130] lsp/presets/yaml-language-server: init --- modules/plugins/lsp/presets/default.nix | 1 + .../lsp/presets/yaml-language-server.nix | 32 +++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 modules/plugins/lsp/presets/yaml-language-server.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index a740a1e4..36044453 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -9,5 +9,6 @@ ./typescript-language-server.nix ./vala-language-server.nix ./wgsl-analyzer.nix + ./yaml-language-server.nix ]; } diff --git a/modules/plugins/lsp/presets/yaml-language-server.nix b/modules/plugins/lsp/presets/yaml-language-server.nix new file mode 100644 index 00000000..4ec64603 --- /dev/null +++ b/modules/plugins/lsp/presets/yaml-language-server.nix @@ -0,0 +1,32 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.yaml-language-server; +in { + options.vim.lsp.presets.yaml-language-server = { + enable = mkEnableOption "the YAML Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.yaml-language-server = { + enable = true; + cmd = [(getExe pkgs.yaml-language-server) "--stdio"]; + root_markers = [".git"]; + settings = { + # https://github.com/redhat-developer/vscode-redhat-telemetry#how-to-disable-telemetry-reporting + redhat = { + telemetry = { + enabled = false; + }; + }; + }; + }; + }; +} From 84f925e9c255373fb21d92bfff5aa7b526417d10 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 12:36:34 +0200 Subject: [PATCH 013/130] lsp/presets/zls: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/zls.nix | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 modules/plugins/lsp/presets/zls.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 36044453..1e2b6e09 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -10,5 +10,6 @@ ./vala-language-server.nix ./wgsl-analyzer.nix ./yaml-language-server.nix + ./zls.nix ]; } diff --git a/modules/plugins/lsp/presets/zls.nix b/modules/plugins/lsp/presets/zls.nix new file mode 100644 index 00000000..9d540928 --- /dev/null +++ b/modules/plugins/lsp/presets/zls.nix @@ -0,0 +1,25 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.zls; +in { + options.vim.lsp.presets.zls = { + enable = mkEnableOption "the Zig Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.zls = { + enable = true; + cmd = [(getExe pkgs.zls)]; + root_markers = [".git" "zls.json"]; + workspace_required = false; + }; + }; +} From 79e6aff838dddaa99692239eba9bb4e9a90abf02 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 12:37:57 +0200 Subject: [PATCH 014/130] languages/ts: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/ts.nix | 223 +++++-------------------------- 1 file changed, 32 insertions(+), 191 deletions(-) diff --git a/modules/plugins/languages/ts.nix b/modules/plugins/languages/ts.nix index c3e162e0..7a91d78e 100644 --- a/modules/plugins/languages/ts.nix +++ b/modules/plugins/languages/ts.nix @@ -7,183 +7,18 @@ inherit (builtins) attrNames elem; inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.modules) mkIf mkMerge; + inherit (lib) genAttrs; inherit (lib.meta) getExe; - inherit (lib.types) enum package bool; - inherit (lib.generators) mkLuaInline; + inherit (lib.types) enum bool listOf; inherit (lib.nvim.attrsets) mapListToAttrs; inherit (lib.nvim.lua) toLuaObject; inherit (lib.nvim.types) mkGrammarOption diagnostics mkPluginSetupOption deprecatedSingleOrListOf; - inherit (lib.nvim.dag) entryAnywhere entryBefore; + inherit (lib.nvim.dag) entryAnywhere; cfg = config.vim.languages.ts; - defaultServers = ["ts_ls"]; - servers = let - ts_ls = { - cmd = [(getExe pkgs.typescript-language-server) "--stdio"]; - init_options = {hostInfo = "neovim";}; - filetypes = [ - "javascript" - "javascriptreact" - "javascript.jsx" - "typescript" - "typescriptreact" - "typescript.tsx" - ]; - root_markers = ["tsconfig.json" "jsconfig.json" "package.json" ".git"]; - handlers = { - # handle rename request for certain code actions like extracting functions / types - "_typescript.rename" = mkLuaInline '' - function(_, result, ctx) - local client = assert(vim.lsp.get_client_by_id(ctx.client_id)) - vim.lsp.util.show_document({ - uri = result.textDocument.uri, - range = { - start = result.position, - ['end'] = result.position, - }, - }, client.offset_encoding) - vim.lsp.buf.rename() - return vim.NIL - end - ''; - }; - on_attach = mkLuaInline '' - function(client, bufnr) - -- ts_ls provides `source.*` code actions that apply to the whole file. These only appear in - -- `vim.lsp.buf.code_action()` if specified in `context.only`. - vim.api.nvim_buf_create_user_command(0, 'LspTypescriptSourceAction', function() - local source_actions = vim.tbl_filter(function(action) - return vim.startswith(action, 'source.') - end, client.server_capabilities.codeActionProvider.codeActionKinds) - - vim.lsp.buf.code_action({ - context = { - only = source_actions, - }, - }) - end, {}) - end - ''; - }; - in { - inherit ts_ls; - # Here for backwards compatibility. Still consider tsserver a valid - # configuration in the enum, but assert if it's set to *properly* - # redirect the user to the correct server. - tsserver = ts_ls; - - denols = { - cmd = [(getExe pkgs.deno) "lsp"]; - cmd_env = {NO_COLOR = true;}; - filetypes = [ - "javascript" - "javascriptreact" - "javascript.jsx" - "typescript" - "typescriptreact" - "typescript.tsx" - ]; - root_markers = ["deno.json" "deno.jsonc" ".git"]; - settings = { - deno = { - enable = true; - suggest = { - imports = { - hosts = { - "https://deno.land" = true; - }; - }; - }; - }; - }; - handlers = { - "textDocument/definition" = mkLuaInline "nvf_denols_handler"; - "textDocument/typeDefinition" = mkLuaInline "nvf_denols_handler"; - "textDocument/references" = mkLuaInline "nvf_denols_handler"; - }; - on_attach = mkLuaInline '' - function(client, bufnr) - vim.api.nvim_buf_create_user_command(0, 'LspDenolsCache', function() - client:exec_cmd({ - command = 'deno.cache', - arguments = { {}, vim.uri_from_bufnr(bufnr) }, - }, { bufnr = bufnr }, function(err, _result, ctx) - if err then - local uri = ctx.params.arguments[2] - vim.api.nvim_err_writeln('cache command failed for ' .. vim.uri_to_fname(uri)) - end - end) - end, { - desc = 'Cache a module and all of its dependencies.', - }) - end - ''; - }; - - tsgo = { - cmd = [(getExe pkgs.typescript-go) "--lsp" "--stdio"]; - filetypes = [ - "javascript" - "javascriptreact" - "javascript.jsx" - "typescript" - "typescriptreact" - "typescript.tsx" - ]; - root_markers = ["tsconfig.json" "jsconfig.json" "package.json" ".git"]; - }; - }; - - denols_handlers = '' - local function nvf_denols_virtual_text_document_handler(uri, res, client) - if not res then - return nil - end - - local lines = vim.split(res.result, '\n') - local bufnr = vim.uri_to_bufnr(uri) - - local current_buf = vim.api.nvim_buf_get_lines(bufnr, 0, -1, false) - if #current_buf ~= 0 then - return nil - end - - vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, lines) - vim.api.nvim_set_option_value('readonly', true, { buf = bufnr }) - vim.api.nvim_set_option_value('modified', false, { buf = bufnr }) - vim.api.nvim_set_option_value('modifiable', false, { buf = bufnr }) - vim.lsp.buf_attach_client(bufnr, client.id) - end - - local function nvf_denols_virtual_text_document(uri, client) - local params = { - textDocument = { - uri = uri, - }, - } - local result = client.request_sync('deno/virtualTextDocument', params) - nvf_denols_virtual_text_document_handler(uri, result, client) - end - - local function nvf_denols_handler(err, result, ctx, config) - if not result or vim.tbl_isempty(result) then - return nil - end - - local client = vim.lsp.get_client_by_id(ctx.client_id) - for _, res in pairs(result) do - local uri = res.uri or res.targetUri - if uri:match '^deno:' then - nvf_denols_virtual_text_document(uri, client) - res['uri'] = uri - res['targetUri'] = uri - end - end - - vim.lsp.handlers[ctx.method](err, result, ctx, config) - end - ''; + defaultServers = ["typescript-language-server"]; + servers = ["typescript-language-server" "deno" "typescript-go"]; # TODO: specify packages defaultFormat = ["prettier"]; @@ -264,7 +99,7 @@ in { }; servers = mkOption { - type = deprecatedSingleOrListOf "vim.language.ts.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "Typescript/Javascript LSP server to use"; }; @@ -317,6 +152,8 @@ in { }; config = mkIf cfg.enable (mkMerge [ + {vim.globals.markdown_fenced_languages = ["ts=typescript"];} + (mkIf cfg.treesitter.enable { vim.treesitter.enable = true; vim.treesitter.grammars = [ @@ -327,17 +164,22 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (name: { - inherit name; - value = servers.${name}; - }) - cfg.lsp.servers; - }) - - (mkIf (cfg.lsp.enable && elem "denols" cfg.lsp.servers) { - vim.globals.markdown_fenced_languages = ["ts=typescript"]; - vim.luaConfigRC.denols_handlers = entryBefore ["lsp-servers"] denols_handlers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + root_markers = ["tsconfig.json"]; + filetypes = [ + "typescript" + # TODO: move to a React module + "typescriptreact" + "typescript.tsx" + "javascriptreact" + "javascript.jsx" + # TODO: move to a JavaScript module + "javascript" + ]; + }); + }; }) (mkIf cfg.format.enable { @@ -380,21 +222,20 @@ in { ''; }) - # Warn the user if they have set the default server name to tsserver to match upstream (us) - # The name "tsserver" has been deprecated in lspconfig, and now should be called ts_ls. This - # is a purely cosmetic change, but emits a warning if not accounted for. + # Warn the user if they have set the default server name to "tsserver" to match upstream (us) + # The name "tsserver" has been deprecated, and now should be called "typescript-language-server". { assertions = [ { assertion = cfg.lsp.enable -> !(elem "tsserver" cfg.lsp.servers); message = '' - As of a recent lspconfig update, the `tsserver` configuration has been renamed - to `ts_ls` to match upstream behaviour of `lspconfig`, and the name `tsserver` - is no longer considered valid by nvf. Please set `vim.languages.ts.lsp.server` - to `"ts_ls"` instead of to `${cfg.lsp.server}` + The name `tsserver` has been deprecated, and now should be called `typescript-language-server`. + Please set `vim.languages.ts.lsp.server` to `["typescript-language-server" ...]` instead of to `["tsserver" ...]` - Please see for more details - about this change. + Please see: + - + - + for more details about this change. ''; } ]; From 4bc447e792b29584ac256049e839cb50d1071b8b Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 12:38:18 +0200 Subject: [PATCH 015/130] languages/typst: refactor lsp.servers to use lsp/presets/ --- docs/manual/release-notes/rl-0.9.md | 4 ++ modules/plugins/languages/typst.nix | 91 ++++------------------------- 2 files changed, 14 insertions(+), 81 deletions(-) diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index a4153e89..7bda239a 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -65,6 +65,10 @@ - Moved `vim.lsp.harper-ls` to `vim.lsp.presets.haper`. +- Removed `typst_lsp` from `languages.typst.lsp.servers`, because it is + deprecated and thus was pulled from nixpkgs. + + - Renamed `ts_ls` to `typescript-language-server`. - Renamed `denols` to `deno`. diff --git a/modules/plugins/languages/typst.nix b/modules/plugins/languages/typst.nix index 7cada25b..e6b08373 100644 --- a/modules/plugins/languages/typst.nix +++ b/modules/plugins/languages/typst.nix @@ -6,92 +6,21 @@ }: let inherit (lib.options) mkOption mkEnableOption literalExpression; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) nullOr enum attrsOf listOf package str bool int; + inherit (lib.types) nullOr enum attrsOf listOf str bool int; inherit (lib.attrsets) attrNames; + inherit (lib) genAttrs; inherit (lib.meta) getExe; inherit (lib.nvim.types) mkGrammarOption mkPluginSetupOption deprecatedSingleOrListOf; inherit (lib.nvim.dag) entryAnywhere; inherit (lib.nvim.lua) toLuaObject; inherit (lib.nvim.attrsets) mapListToAttrs; inherit (lib.nvim.binds) mkKeymap; - inherit (lib.generators) mkLuaInline; inherit (config.vim.lib) mkMappingOption; cfg = config.vim.languages.typst; defaultServers = ["tinymist"]; - servers = { - typst_lsp = { - enable = true; - cmd = [(getExe pkgs.typst-lsp)]; - filetypes = ["typst"]; - root_markers = [".git"]; - on_attach = mkLuaInline '' - function(client, bufnr) - -- Disable semantic tokens as a workaround for a semantic token error when using non-english characters - client.server_capabilities.semanticTokensProvider = nil - end - ''; - }; - - tinymist = { - enable = true; - cmd = [(getExe pkgs.tinymist)]; - filetypes = ["typst"]; - root_markers = [".git"]; - on_attach = mkLuaInline '' - function(client, bufnr) - local function create_tinymist_command(command_name, client, bufnr) - local export_type = command_name:match 'tinymist%.export(%w+)' - local info_type = command_name:match 'tinymist%.(%w+)' - if info_type and info_type:match '^get' then - info_type = info_type:gsub('^get', 'Get') - end - local cmd_display = export_type or info_type - local function run_tinymist_command() - local arguments = { vim.api.nvim_buf_get_name(bufnr) } - local title_str = export_type and ('Export ' .. cmd_display) or cmd_display - local function handler(err, res) - if err then - return vim.notify(err.code .. ': ' .. err.message, vim.log.levels.ERROR) - end - vim.notify(export_type and res or vim.inspect(res), vim.log.levels.INFO) - end - if vim.fn.has 'nvim-0.11' == 1 then - return client:exec_cmd({ - title = title_str, - command = command_name, - arguments = arguments, - }, { bufnr = bufnr }, handler) - else - return vim.notify('Tinymist commands require Neovim 0.11+', vim.log.levels.WARN) - end - end - local cmd_name = export_type and ('LspTinymistExport' .. cmd_display) or ('LspTinymist' .. cmd_display) - local cmd_desc = export_type and ('Export to ' .. cmd_display) or ('Get ' .. cmd_display) - return run_tinymist_command, cmd_name, cmd_desc - end - - for _, command in ipairs { - 'tinymist.exportSvg', - 'tinymist.exportPng', - 'tinymist.exportPdf', - 'tinymist.exportMarkdown', - 'tinymist.exportText', - 'tinymist.exportQuery', - 'tinymist.exportAnsiHighlight', - 'tinymist.getServerInfo', - 'tinymist.getDocumentTrace', - 'tinymist.getWorkspaceLabels', - 'tinymist.getDocumentMetrics', - } do - local cmd_func, cmd_name, cmd_desc = create_tinymist_command(command, client, bufnr) - vim.api.nvim_buf_create_user_command(bufnr, cmd_name, cmd_func, { nargs = 0, desc = cmd_desc }) - end - end - ''; - }; - }; + servers = ["tinymist"]; defaultFormat = ["typstyle"]; formats = { @@ -123,7 +52,7 @@ in { }; servers = mkOption { - type = deprecatedSingleOrListOf "vim.language.typst.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "Typst LSP server to use"; }; @@ -261,12 +190,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["typst"]; + }); + }; }) # Extensions From 648a5b8505fc8f9d0ac9fd57dd4a25fb7d15e876 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 12:39:13 +0200 Subject: [PATCH 016/130] languages/twig: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/twig.nix | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/modules/plugins/languages/twig.nix b/modules/plugins/languages/twig.nix index 36e64838..b6a3c530 100644 --- a/modules/plugins/languages/twig.nix +++ b/modules/plugins/languages/twig.nix @@ -7,6 +7,7 @@ inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.modules) mkIf mkMerge; + inherit (lib) genAttrs; inherit (lib.meta) getExe; inherit (lib.types) listOf enum; inherit (lib.nvim.types) mkGrammarOption diagnostics; @@ -15,14 +16,7 @@ cfg = config.vim.languages.twig; defaultServers = ["twig-language-server"]; - servers = { - twig-language-server = { - enable = true; - cmd = [(getExe pkgs.twig-language-server) "--stdio"]; - filetypes = ["twig"]; - root_markers = [".git"]; - }; - }; + servers = ["twig-language-server"]; defaultFormat = ["djlint"]; formats = { @@ -62,7 +56,7 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "Twig LSP server to use"; }; @@ -104,12 +98,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["twig"]; + }); + }; }) (mkIf cfg.format.enable { From 4376e5f49b90723366e42ff00640d475bf36827a Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 12:39:29 +0200 Subject: [PATCH 017/130] languages/vala: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/vala.nix | 72 +++++------------------------- 1 file changed, 12 insertions(+), 60 deletions(-) diff --git a/modules/plugins/languages/vala.nix b/modules/plugins/languages/vala.nix index b3376daf..4e3eca3d 100644 --- a/modules/plugins/languages/vala.nix +++ b/modules/plugins/languages/vala.nix @@ -4,64 +4,16 @@ lib, ... }: let - inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.modules) mkIf mkMerge; - inherit (lib.meta) getExe; - inherit (lib.types) enum; - inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; - inherit (lib.nvim.attrsets) mapListToAttrs; - inherit (lib.generators) mkLuaInline; + inherit (lib) genAttrs; + inherit (lib.types) enum listOf; + inherit (lib.nvim.types) mkGrammarOption; cfg = config.vim.languages.vala; - defaultServers = ["vala_ls"]; - servers = { - vala_ls = { - enable = true; - cmd = [ - (getExe (pkgs.symlinkJoin { - name = "vala-language-server-wrapper"; - paths = [pkgs.vala-language-server]; - meta.mainProgram = "vala-language-server-wrapper"; - buildInputs = [pkgs.makeBinaryWrapper]; - postBuild = '' - wrapProgram $out/bin/vala-language-server \ - --prefix PATH : ${pkgs.uncrustify}/bin - ''; - })) - ]; - filetypes = ["vala" "genie"]; - root_dir = mkLuaInline '' - function(bufnr, on_dir) - local meson_matcher = function(path) - local pattern = 'meson.build' - local f = vim.fn.glob(table.concat({ path, pattern }, '/')) - if f == ''' then - return nil - end - for line in io.lines(f) do - -- skip meson comments - if not line:match '^%s*#.*' then - local str = line:gsub('%s+', ''') - if str ~= ''' then - if str:match '^project%(' then - return path - else - break - end - end - end - end - end - - local fname = vim.api.nvim_buf_get_name(bufnr) - local root = vim.iter(vim.fs.parents(fname)):find(meson_matcher) - on_dir(root or vim.fs.dirname(vim.fs.find('.git', { path = fname, upward = true })[1])) - end - ''; - }; - }; + defaultServers = ["vala-language-server"]; + servers = ["vala-language-server"]; in { options.vim.languages.vala = { enable = mkEnableOption "Vala language support"; @@ -84,7 +36,7 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = deprecatedSingleOrListOf "vim.language.vala.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "Vala LSP server to use"; }; @@ -98,12 +50,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["vala"]; + }); + }; }) ]); } From 424ea5cbcced7c7d9972d481ff117242ce0fb2ba Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 12:39:42 +0200 Subject: [PATCH 018/130] languages/wgsl: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/wgsl.nix | 32 ++++++++++-------------------- 1 file changed, 11 insertions(+), 21 deletions(-) diff --git a/modules/plugins/languages/wgsl.nix b/modules/plugins/languages/wgsl.nix index 016f6c4a..aa99022c 100644 --- a/modules/plugins/languages/wgsl.nix +++ b/modules/plugins/languages/wgsl.nix @@ -4,26 +4,16 @@ pkgs, ... }: let - inherit (builtins) attrNames; inherit (lib.modules) mkIf mkMerge; - inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; + inherit (lib.nvim.types) mkGrammarOption; inherit (lib.options) mkEnableOption mkOption literalExpression; - inherit (lib.types) enum; - inherit (lib.meta) getExe; - inherit (lib.nvim.attrsets) mapListToAttrs; + inherit (lib.types) enum listOf; + inherit (lib) genAttrs; cfg = config.vim.languages.wgsl; defaultServers = ["wgsl-analyzer"]; - servers = { - wgsl-analyzer = { - enable = true; - cmd = [(getExe pkgs.wgsl-analyzer)]; - filetypes = ["wgsl"]; - root_markers = [".git"]; - settings = {}; - }; - }; + servers = ["wgsl-analyzer"]; in { options.vim.languages.wgsl = { enable = mkEnableOption "WGSL language support"; @@ -47,7 +37,7 @@ in { }; servers = mkOption { - type = deprecatedSingleOrListOf "vim.language.wgsl.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "WGSL LSP server to use"; }; @@ -63,12 +53,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["wgsl"]; + }); + }; }) ]); } From 301e2c445c04a12229148642f8483a48b779e9b1 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 12:39:59 +0200 Subject: [PATCH 019/130] languages/xml: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/xml.nix | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/modules/plugins/languages/xml.nix b/modules/plugins/languages/xml.nix index 7eae0026..217f2949 100644 --- a/modules/plugins/languages/xml.nix +++ b/modules/plugins/languages/xml.nix @@ -4,27 +4,16 @@ lib, ... }: let - inherit (builtins) attrNames; inherit (lib.options) mkOption mkEnableOption literalExpression; - inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; inherit (lib.types) enum listOf; inherit (lib.nvim.types) mkGrammarOption; - inherit (lib.nvim.attrsets) mapListToAttrs; + inherit (lib) genAttrs; cfg = config.vim.languages.xml; defaultServers = ["lemminx"]; - servers = { - lemminx = { - enable = true; - cmd = [ - (getExe pkgs.lemminx) - ]; - filetypes = ["xml"]; - root_markers = [".git"]; - }; - }; + servers = ["lemminx"]; in { options.vim.languages.xml = { enable = mkEnableOption "XML language support"; @@ -47,7 +36,7 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "XML LSP server to use"; }; @@ -61,12 +50,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (name: { - inherit name; - value = servers.${name}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["xml"]; + }); + }; }) ]); } From a9df4724b58d9f0344b13b46339ddfc9d0debc48 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 12:40:11 +0200 Subject: [PATCH 020/130] languages/yaml: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/yaml.nix | 54 ++++++------------------------ 1 file changed, 11 insertions(+), 43 deletions(-) diff --git a/modules/plugins/languages/yaml.nix b/modules/plugins/languages/yaml.nix index 097b98c5..bba0eba3 100644 --- a/modules/plugins/languages/yaml.nix +++ b/modules/plugins/languages/yaml.nix @@ -4,48 +4,16 @@ lib, ... }: let - inherit (builtins) attrNames; - inherit (lib.generators) mkLuaInline; inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.modules) mkIf mkMerge; - inherit (lib.meta) getExe; - inherit (lib.types) enum; - inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; - inherit (lib.nvim.attrsets) mapListToAttrs; + inherit (lib) genAttrs; + inherit (lib.types) enum listOf; + inherit (lib.nvim.types) mkGrammarOption; cfg = config.vim.languages.yaml; - on_attach = - if config.vim.languages.helm.lsp.enable && config.vim.languages.helm.enable - then - mkLuaInline '' - function(client, bufnr) - local filetype = vim.bo[bufnr].filetype - if filetype == "helm" then - client.stop() - end - end - '' - else null; - defaultServers = ["yaml-language-server"]; - servers = { - yaml-language-server = { - enable = true; - cmd = [(getExe pkgs.yaml-language-server) "--stdio"]; - filetypes = ["yaml" "yaml.docker-compose" "yaml.gitlab" "yaml.helm-values"]; - root_markers = [".git"]; - inherit on_attach; - # -- https://github.com/redhat-developer/vscode-redhat-telemetry#how-to-disable-telemetry-reporting - settings = { - redhat = { - telemetry = { - enabled = false; - }; - }; - }; - }; - }; + servers = ["yaml-language-server"]; in { options.vim.languages.yaml = { enable = mkEnableOption "YAML language support"; @@ -69,7 +37,7 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = deprecatedSingleOrListOf "vim.language.yaml.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "Yaml LSP server to use"; }; @@ -83,12 +51,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["yaml"]; + }); + }; }) ]); } From 31b017b601c5dfea546a05ff4e52bb9a30bf6295 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 12:40:20 +0200 Subject: [PATCH 021/130] languages/zig: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/zig.nix | 33 +++++++++++-------------------- 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/modules/plugins/languages/zig.nix b/modules/plugins/languages/zig.nix index 5e1db977..a9589f9c 100644 --- a/modules/plugins/languages/zig.nix +++ b/modules/plugins/languages/zig.nix @@ -7,23 +7,14 @@ inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.modules) mkIf mkMerge mkDefault; - inherit (lib.types) bool package enum; - inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; - inherit (lib.meta) getExe; - inherit (lib.nvim.attrsets) mapListToAttrs; + inherit (lib) genAttrs; + inherit (lib.types) bool package enum listOf; + inherit (lib.nvim.types) mkGrammarOption; cfg = config.vim.languages.zig; defaultServers = ["zls"]; - servers = { - zls = { - enable = true; - cmd = [(getExe pkgs.zls)]; - filetypes = ["zig" "zir"]; - root_markers = ["zls.json" "build.zig" ".git"]; - workspace_required = false; - }; - }; + servers = ["zls"]; # TODO: dap.adapter.lldb is duplicated when enabling the # vim.languages.clang.dap module. This does not cause @@ -77,7 +68,7 @@ in { }; servers = mkOption { - type = deprecatedSingleOrListOf "vim.language.zig.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "Zig LSP server to use"; }; @@ -115,13 +106,13 @@ in { (mkIf cfg.lsp.enable { vim = { - lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; - + lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + root_markers = ["build.zig"]; + filetypes = ["zig" "zir"]; + }); + }; # nvf handles autosaving already globals.zig_fmt_autosave = mkDefault 0; }; From 854184e10ee791ad46c1e405b0bdb3190bcc7038 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 13:29:38 +0200 Subject: [PATCH 022/130] lsp/presets/taplo: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/taplo.nix | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 modules/plugins/lsp/presets/taplo.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 1e2b6e09..711ea32a 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -3,6 +3,7 @@ ./deno.nix ./harper.nix ./lemminx.nix + ./taplo.nix ./tinymist.nix ./twig-language-server.nix ./typescript-go.nix diff --git a/modules/plugins/lsp/presets/taplo.nix b/modules/plugins/lsp/presets/taplo.nix new file mode 100644 index 00000000..6cd0aed3 --- /dev/null +++ b/modules/plugins/lsp/presets/taplo.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.taplo; +in { + options.vim.lsp.presets.taplo = { + enable = mkEnableOption "the Taplo Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.taplo = { + enable = true; + cmd = [(getExe pkgs.taplo) "lsp" "stdio"]; + root_markers = [".git"]; + }; + }; +} From 03f948e41ecc6a92f270bce48c367ef0e1bc6124 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 13:30:20 +0200 Subject: [PATCH 023/130] lsp/presets/tombi: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/tombi.nix | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 modules/plugins/lsp/presets/tombi.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 711ea32a..64d673e8 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -5,6 +5,7 @@ ./lemminx.nix ./taplo.nix ./tinymist.nix + ./tombi.nix ./twig-language-server.nix ./typescript-go.nix ./typescript-language-server.nix diff --git a/modules/plugins/lsp/presets/tombi.nix b/modules/plugins/lsp/presets/tombi.nix new file mode 100644 index 00000000..189ab6d6 --- /dev/null +++ b/modules/plugins/lsp/presets/tombi.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.tombi; +in { + options.vim.lsp.presets.tombi = { + enable = mkEnableOption "the Tombi Language Server (AI Slop)"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.tombi = { + enable = true; + cmd = [(getExe pkgs.tombi) "lsp"]; + root_markers = [".git" "tombi.toml"]; + }; + }; +} From eb768eb982856ba81bcc57abf11d3d58246e43f0 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 13:32:40 +0200 Subject: [PATCH 024/130] language/toml: refactor lsp usage to use lsp/presets/ --- modules/plugins/languages/toml.nix | 44 +++++++----------------------- 1 file changed, 10 insertions(+), 34 deletions(-) diff --git a/modules/plugins/languages/toml.nix b/modules/plugins/languages/toml.nix index 1ead6c7c..fc7fd930 100644 --- a/modules/plugins/languages/toml.nix +++ b/modules/plugins/languages/toml.nix @@ -5,41 +5,17 @@ ... }: let inherit (builtins) attrNames; + inherit (lib) genAttrs; inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; inherit (lib.options) mkEnableOption mkOption literalExpression; - inherit (lib.types) enum; + inherit (lib.types) enum listOf; inherit (lib.nvim.types) diagnostics mkGrammarOption deprecatedSingleOrListOf; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.toml; defaultServers = ["taplo"]; - servers = { - tombi = { - enable = true; - cmd = [ - (getExe pkgs.tombi) - "lsp" - ]; - filetypes = ["toml"]; - root_markers = [ - "tombi.toml" - ".git" - ]; - }; - taplo = { - enable = true; - cmd = [ - (getExe pkgs.taplo) - "lsp" - "stdio" - ]; - filetypes = ["toml"]; - root_markers = [ - ".git" - ]; - }; - }; + servers = ["taplo" "tombi"]; defaultFormat = ["taplo"]; formats = { @@ -93,7 +69,7 @@ in { servers = mkOption { description = "TOML LSP server to use"; - type = deprecatedSingleOrListOf "vim.language.toml.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; }; }; @@ -137,12 +113,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["toml"]; + }); + }; }) (mkIf cfg.format.enable { From 7407a3072fc801621cafb798f27e9cfcd0da12a6 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 16:00:48 +0200 Subject: [PATCH 025/130] lsp/presets/texlab: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/texlab.nix | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 modules/plugins/lsp/presets/texlab.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 64d673e8..0fbade66 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -4,6 +4,7 @@ ./harper.nix ./lemminx.nix ./taplo.nix + ./texlab.nix ./tinymist.nix ./tombi.nix ./twig-language-server.nix diff --git a/modules/plugins/lsp/presets/texlab.nix b/modules/plugins/lsp/presets/texlab.nix new file mode 100644 index 00000000..13c6ddf4 --- /dev/null +++ b/modules/plugins/lsp/presets/texlab.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.texlab; +in { + options.vim.lsp.presets.texlab = { + enable = mkEnableOption "the TeXLab Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.texlab = { + enable = true; + cmd = [(getExe pkgs.texlab) "run"]; + root_markers = [".git" ".latexmkrc" "latexmkrc" ".texlabroot" "texlabroot" ".texstudio" "Tectonic.toml"]; + }; + }; +} From ad86e75a133b6320feba7e2273b875b4cee1b96c Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 16:03:06 +0200 Subject: [PATCH 026/130] languages/tex: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/tex.nix | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/modules/plugins/languages/tex.nix b/modules/plugins/languages/tex.nix index 6c22240c..aeedd353 100644 --- a/modules/plugins/languages/tex.nix +++ b/modules/plugins/languages/tex.nix @@ -5,6 +5,7 @@ ... }: let inherit (builtins) attrNames; + inherit (lib) genAttrs; inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; inherit (lib.options) literalExpression mkEnableOption mkOption; @@ -14,14 +15,7 @@ cfg = config.vim.languages.tex; defaultServers = ["texlab"]; - servers = { - texlab = { - enable = true; - cmd = [(getExe pkgs.texlab) "run"]; - filetypes = ["plaintex" "tex" "bib"]; - root_markers = [".git" ".latexmkrc" "latexmkrc" ".texlabroot" "texlabroot" ".texstudio" "Tectonic.toml"]; - }; - }; + servers = ["texlab"]; defaultFormat = ["tex-fmt"]; formats = { @@ -57,7 +51,7 @@ in { servers = mkOption { description = "TeX LSP server to use"; - type = listOf (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; }; }; @@ -88,12 +82,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["plaintex" "tex" "bib"]; + }); + }; }) (mkIf cfg.format.enable { From e9a85c3796b68ff001fbcf2dc0386659f05ec3bb Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 16:05:47 +0200 Subject: [PATCH 027/130] lsp/presets/tofu-ls: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/tofu-ls.nix | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 modules/plugins/lsp/presets/tofu-ls.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 0fbade66..8ec13b00 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -6,6 +6,7 @@ ./taplo.nix ./texlab.nix ./tinymist.nix + ./tofu-ls.nix ./tombi.nix ./twig-language-server.nix ./typescript-go.nix diff --git a/modules/plugins/lsp/presets/tofu-ls.nix b/modules/plugins/lsp/presets/tofu-ls.nix new file mode 100644 index 00000000..0b3d25df --- /dev/null +++ b/modules/plugins/lsp/presets/tofu-ls.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.tofu-ls; +in { + options.vim.lsp.presets.tofu-ls = { + enable = mkEnableOption "the OpenTofu Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.tofu-ls = { + enable = true; + cmd = [(getExe pkgs.tofu-ls) "serve"]; + root_markers = [".git"]; + }; + }; +} From 22ec5de5370caba926b4f6978aad8b5e2bf5359f Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 16:07:30 +0200 Subject: [PATCH 028/130] lsp/presets/terraform-ls: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/terraform-ls.nix | 24 ++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 modules/plugins/lsp/presets/terraform-ls.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 8ec13b00..860081f6 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -4,6 +4,7 @@ ./harper.nix ./lemminx.nix ./taplo.nix + ./terraform-ls.nix ./texlab.nix ./tinymist.nix ./tofu-ls.nix diff --git a/modules/plugins/lsp/presets/terraform-ls.nix b/modules/plugins/lsp/presets/terraform-ls.nix new file mode 100644 index 00000000..26c4c54b --- /dev/null +++ b/modules/plugins/lsp/presets/terraform-ls.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.terraform-ls; +in { + options.vim.lsp.presets.terraform-ls = { + enable = mkEnableOption "the Terraform Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.terraform-ls = { + enable = true; + cmd = [(getExe pkgs.terraform-ls) "serve"]; + root_markers = [".git"]; + }; + }; +} From 5e483908a232d3aa5acbc7e9dccea4f3d8a39b23 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 16:11:40 +0200 Subject: [PATCH 029/130] languages/terraform: refactor lsp.servers to use lsp/presets/ --- docs/manual/release-notes/rl-0.9.md | 4 +++ modules/plugins/languages/terraform.nix | 34 ++++++++----------------- 2 files changed, 14 insertions(+), 24 deletions(-) diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index 7bda239a..81d1abe5 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -77,6 +77,10 @@ - Renamed `vala_ls` to `vala-language-server`. +- Renamed `terraformls-tf` to `terraform-ls`. + +- Renamed `tofuls-tf` to `tofu-ls`. + ## Changelog {#sec-release-0-9-changelog} [SecBear](https://github.com/SecBear): diff --git a/modules/plugins/languages/terraform.nix b/modules/plugins/languages/terraform.nix index fbcc77da..a3a22048 100644 --- a/modules/plugins/languages/terraform.nix +++ b/modules/plugins/languages/terraform.nix @@ -7,28 +7,16 @@ inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.modules) mkIf mkMerge; + inherit (lib) genAttrs; inherit (lib.meta) getExe; inherit (lib.types) enum listOf; - inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; + inherit (lib.nvim.types) mkGrammarOption; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.terraform; - defaultServers = ["tofuls-tf"]; - servers = { - terraformls-tf = { - enable = true; - cmd = [(getExe pkgs.terraform-ls) "serve"]; - filetypes = ["terraform" "terraform-vars" "tf"]; - root_markers = [".terraform" ".git"]; - }; - tofuls-tf = { - enable = true; - cmd = [(getExe pkgs.tofu-ls) "serve"]; - filetypes = ["terraform" "terraform-vars" "tf"]; - root_markers = [".terraform" ".git"]; - }; - }; + defaultServers = ["tofu-ls"]; + servers = ["terraform-ls" "tofu-ls"]; defaultFormat = ["tofu-fmt"]; formats = { @@ -65,7 +53,7 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "Terraform LSP server to use"; }; @@ -93,13 +81,11 @@ in { }) (mkIf cfg.lsp.enable { - vim = { - lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["terraform" "terraform-vars" "tf"]; + }); }; }) From 1ebef354a521c97db6e383f5513de161c2996307 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 16:14:39 +0200 Subject: [PATCH 030/130] languages/hcl: refactor lsp.servers to use lsp/presets/ --- docs/manual/release-notes/rl-0.9.md | 4 ++-- modules/plugins/languages/hcl.nix | 35 +++++++++-------------------- 2 files changed, 12 insertions(+), 27 deletions(-) diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index 81d1abe5..4c42742c 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -77,9 +77,9 @@ - Renamed `vala_ls` to `vala-language-server`. -- Renamed `terraformls-tf` to `terraform-ls`. +- Renamed `terraformls-tf` and `terraformls-hcl` to `terraform-ls`. -- Renamed `tofuls-tf` to `tofu-ls`. +- Renamed `tofuls-tf` and `tofuls-hcl` to `tofu-ls`. ## Changelog {#sec-release-0-9-changelog} diff --git a/modules/plugins/languages/hcl.nix b/modules/plugins/languages/hcl.nix index fe4a389e..60ad6f5f 100644 --- a/modules/plugins/languages/hcl.nix +++ b/modules/plugins/languages/hcl.nix @@ -6,30 +6,17 @@ }: let inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption literalExpression; + inherit (lib) genAttrs; inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; inherit (lib.types) enum listOf; - inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; + inherit (lib.nvim.types) mkGrammarOption; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.hcl; - defaultServers = ["tofuls-hcl"]; - servers = { - terraformls-hcl = { - enable = true; - cmd = [(getExe pkgs.terraform-ls) "serve"]; - filetypes = ["hcl"]; - root_markers = [".git"]; - }; - tofuls-hcl = { - enable = true; - cmd = [(getExe pkgs.tofu-ls) "serve"]; - filetypes = ["hcl"]; - root_markers = [".terraform" ".git"]; - }; - # TODO: package nomad-lsp and offer as an option here too - }; + defaultServers = ["tofu-ls"]; + servers = ["terraform-ls" "tofu-ls"]; defaultFormat = ["hclfmt"]; formats = { @@ -64,7 +51,7 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "HCL LSP server to use"; }; @@ -116,13 +103,11 @@ in { }) (mkIf cfg.lsp.enable { - vim = { - lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["hcl"]; + }); }; }) From 0bffd83d435fb873a9f133b3a61e460fd4a26d46 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 16:21:04 +0200 Subject: [PATCH 031/130] lsp/presets/tailwindcss-language-server: init --- modules/plugins/languages/tailwind.nix | 85 ---------- modules/plugins/lsp/presets/default.nix | 1 + .../presets/tailwindcss-language-server.nix | 150 ++++++++++++++++++ 3 files changed, 151 insertions(+), 85 deletions(-) create mode 100644 modules/plugins/lsp/presets/tailwindcss-language-server.nix diff --git a/modules/plugins/languages/tailwind.nix b/modules/plugins/languages/tailwind.nix index da2a514e..f166980b 100644 --- a/modules/plugins/languages/tailwind.nix +++ b/modules/plugins/languages/tailwind.nix @@ -20,91 +20,6 @@ tailwindcss = { enable = true; cmd = [(getExe pkgs.tailwindcss-language-server) "--stdio"]; - filetypes = [ - # html - "aspnetcorerazor" - "astro" - "astro-markdown" - "blade" - "clojure" - "django-html" - "htmldjango" - "edge" - "eelixir" - "elixir" - "ejs" - "erb" - "eruby" - "gohtml" - "gohtmltmpl" - "haml" - "handlebars" - "hbs" - "html" - "htmlangular" - "html-eex" - "heex" - "jade" - "leaf" - "liquid" - "markdown" - "mdx" - "mustache" - "njk" - "nunjucks" - "php" - "razor" - "slim" - "twig" - # css - "css" - "less" - "postcss" - "sass" - "scss" - "stylus" - "sugarss" - # js - "javascript" - "javascriptreact" - "reason" - "rescript" - "typescript" - "typescriptreact" - # mixed - "vue" - "svelte" - "templ" - ]; - settings = { - tailwindCSS = { - validate = true; - lint = { - cssConflict = "warning"; - invalidApply = "error"; - invalidScreen = "error"; - invalidVariant = "error"; - invalidConfigPath = "error"; - invalidTailwindDirective = "error"; - recommendedVariantOrder = "warning"; - }; - classAttributes = [ - "class" - "className" - "class:list" - "classList" - "ngClass" - ]; - includeLanguages = { - eelixir = "html-eex"; - elixir = "phoenix-heex"; - eruby = "erb"; - heex = "phoenix-heex"; - htmlangular = "html"; - templ = "html"; - }; - }; - }; before_init = mkLuaInline '' function(_, config) if not config.settings then diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 860081f6..bc87468a 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -3,6 +3,7 @@ ./deno.nix ./harper.nix ./lemminx.nix + ./tailwindcss-language-server.nix ./taplo.nix ./terraform-ls.nix ./texlab.nix diff --git a/modules/plugins/lsp/presets/tailwindcss-language-server.nix b/modules/plugins/lsp/presets/tailwindcss-language-server.nix new file mode 100644 index 00000000..e2dc37de --- /dev/null +++ b/modules/plugins/lsp/presets/tailwindcss-language-server.nix @@ -0,0 +1,150 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + inherit (lib.generators) mkLuaInline; + + cfg = config.vim.lsp.presets.tailwindcss-language-server; +in { + options.vim.lsp.presets.tailwindcss-language-server = { + enable = mkEnableOption "the Tailwind CSS Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.tailwindcss-language-server = { + enable = true; + cmd = [(getExe pkgs.tailwindcss-language-server) "--stdio"]; + root_markers = [".git"]; + filetypes = [ + # html + "aspnetcorerazor" + "astro" + "astro-markdown" + "blade" + "clojure" + "django-html" + "htmldjango" + "edge" + "eelixir" + "elixir" + "ejs" + "erb" + "eruby" + "gohtml" + "gohtmltmpl" + "haml" + "handlebars" + "hbs" + "html" + "htmlangular" + "html-eex" + "heex" + "jade" + "leaf" + "liquid" + "markdown" + "mdx" + "mustache" + "njk" + "nunjucks" + "php" + "razor" + "slim" + "twig" + # css + "css" + "less" + "postcss" + "sass" + "scss" + "stylus" + "sugarss" + # js + "javascript" + "javascriptreact" + "reason" + "rescript" + "typescript" + "typescriptreact" + # mixed + "vue" + "svelte" + "templ" + ]; + settings = { + tailwindCSS = { + validate = true; + lint = { + cssConflict = "warning"; + invalidApply = "error"; + invalidScreen = "error"; + invalidVariant = "error"; + invalidConfigPath = "error"; + invalidTailwindDirective = "error"; + recommendedVariantOrder = "warning"; + }; + classAttributes = [ + "class" + "className" + "class:list" + "classList" + "ngClass" + ]; + includeLanguages = { + eelixir = "html-eex"; + elixir = "phoenix-heex"; + eruby = "erb"; + heex = "phoenix-heex"; + htmlangular = "html"; + templ = "html"; + }; + }; + }; + workspace_required = true; + root_dir = mkLuaInline '' + function(bufnr, on_dir) + local root_files = { + -- Generic + 'tailwind.config.js', + 'tailwind.config.cjs', + 'tailwind.config.mjs', + 'tailwind.config.ts', + 'postcss.config.js', + 'postcss.config.cjs', + 'postcss.config.mjs', + 'postcss.config.ts', + -- Django + 'theme/static_src/tailwind.config.js', + 'theme/static_src/tailwind.config.cjs', + 'theme/static_src/tailwind.config.mjs', + 'theme/static_src/tailwind.config.ts', + 'theme/static_src/postcss.config.js', + } + local fname = vim.api.nvim_buf_get_name(bufnr) + root_files = util.insert_package_json(root_files, 'tailwindcss', fname) + root_files = util.root_markers_with_field(root_files, { 'mix.lock', 'Gemfile.lock' }, 'tailwind', fname) + on_dir(vim.fs.dirname(vim.fs.find(root_files, { path = fname, upward = true })[1])) + end + ''; + + before_init = mkLuaInline '' + function(_, config) + if not config.settings then + config.settings = {} + end + if not config.settings.editor then + config.settings.editor = {} + end + if not config.settings.editor.tabSize then + config.settings.editor.tabSize = vim.lsp.util.get_effective_tabstop() + end + end + ''; + }; + }; +} From f5c13c7d3900b738bb1f4a24fa19214222ffa595 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 16:25:54 +0200 Subject: [PATCH 032/130] languages/tailwind: remove module --- configuration.nix | 1 - docs/manual/configuring/languages.md | 2 - docs/manual/release-notes/rl-0.9.md | 3 + modules/extra/deprecations.nix | 3 - modules/plugins/languages/default.nix | 1 - modules/plugins/languages/tailwind.nix | 94 -------------------------- 6 files changed, 3 insertions(+), 101 deletions(-) delete mode 100644 modules/plugins/languages/tailwind.nix diff --git a/configuration.nix b/configuration.nix index 08c4b1c1..33b9f119 100644 --- a/configuration.nix +++ b/configuration.nix @@ -103,7 +103,6 @@ isMaximal: { make.enable = false; qml.enable = false; jinja.enable = false; - tailwind.enable = false; svelte.enable = false; liquid.enable = false; tera.enable = false; diff --git a/docs/manual/configuring/languages.md b/docs/manual/configuring/languages.md index f956a0e3..9a82fc1e 100644 --- a/docs/manual/configuring/languages.md +++ b/docs/manual/configuring/languages.md @@ -75,8 +75,6 @@ languages have sections under the `vim.languages` attribute. [vim.languages.scala.enable](./options.html#option-vim-languages-scala-enable) - Svelte: [vim.languages.svelte.enable](./options.html#option-vim-languages-svelte-enable) -- Tailwind: - [vim.languages.tailwind.enable](./options.html#option-vim-languages-tailwind-enable) - Terraform: [vim.languages.terraform.enable](./options.html#option-vim-languages-terraform-enable) - Typst: diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index 4c42742c..5a0f5eee 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -81,6 +81,9 @@ - Renamed `tofuls-tf` and `tofuls-hcl` to `tofu-ls`. +- Removed `languages.tailwind` which only provided an LSP. Use + `lsp.presets.tailwindcss-language-server` instead. + ## Changelog {#sec-release-0-9-changelog} [SecBear](https://github.com/SecBear): diff --git a/modules/extra/deprecations.nix b/modules/extra/deprecations.nix index 1572f249..39c4b96c 100644 --- a/modules/extra/deprecations.nix +++ b/modules/extra/deprecations.nix @@ -242,9 +242,6 @@ in { (mkRenamedLspServer "svelte") (mkRemovedLspPackage "svelte") - (mkRenamedLspServer "tailwind") - (mkRemovedLspPackage "tailwind") - (mkRemovedLspPackage "terraform") (mkRenamedLspServer "ts") diff --git a/modules/plugins/languages/default.nix b/modules/plugins/languages/default.nix index 3f779dbb..16db0aab 100644 --- a/modules/plugins/languages/default.nix +++ b/modules/plugins/languages/default.nix @@ -45,7 +45,6 @@ in { ./scala.nix ./sql.nix ./svelte.nix - ./tailwind.nix ./terraform.nix ./toml.nix ./ts.nix diff --git a/modules/plugins/languages/tailwind.nix b/modules/plugins/languages/tailwind.nix deleted file mode 100644 index f166980b..00000000 --- a/modules/plugins/languages/tailwind.nix +++ /dev/null @@ -1,94 +0,0 @@ -{ - config, - pkgs, - lib, - ... -}: let - inherit (builtins) attrNames; - inherit (lib.options) mkEnableOption mkOption literalExpression; - inherit (lib.modules) mkIf mkMerge; - inherit (lib.meta) getExe; - inherit (lib.types) enum; - inherit (lib.nvim.attrsets) mapListToAttrs; - inherit (lib.nvim.types) deprecatedSingleOrListOf; - inherit (lib.generators) mkLuaInline; - - cfg = config.vim.languages.tailwind; - - defaultServers = ["tailwindcss"]; - servers = { - tailwindcss = { - enable = true; - cmd = [(getExe pkgs.tailwindcss-language-server) "--stdio"]; - before_init = mkLuaInline '' - function(_, config) - if not config.settings then - config.settings = {} - end - if not config.settings.editor then - config.settings.editor = {} - end - if not config.settings.editor.tabSize then - config.settings.editor.tabSize = vim.lsp.util.get_effective_tabstop() - end - end - ''; - workspace_required = true; - root_dir = mkLuaInline '' - function(bufnr, on_dir) - local root_files = { - -- Generic - 'tailwind.config.js', - 'tailwind.config.cjs', - 'tailwind.config.mjs', - 'tailwind.config.ts', - 'postcss.config.js', - 'postcss.config.cjs', - 'postcss.config.mjs', - 'postcss.config.ts', - -- Django - 'theme/static_src/tailwind.config.js', - 'theme/static_src/tailwind.config.cjs', - 'theme/static_src/tailwind.config.mjs', - 'theme/static_src/tailwind.config.ts', - 'theme/static_src/postcss.config.js', - } - local fname = vim.api.nvim_buf_get_name(bufnr) - root_files = util.insert_package_json(root_files, 'tailwindcss', fname) - root_files = util.root_markers_with_field(root_files, { 'mix.lock', 'Gemfile.lock' }, 'tailwind', fname) - on_dir(vim.fs.dirname(vim.fs.find(root_files, { path = fname, upward = true })[1])) - end - ''; - }; - }; -in { - options.vim.languages.tailwind = { - enable = mkEnableOption "Tailwindcss language support"; - - lsp = { - enable = - mkEnableOption "Tailwindcss LSP support" - // { - default = config.vim.lsp.enable; - defaultText = literalExpression "config.vim.lsp.enable"; - }; - - servers = mkOption { - type = deprecatedSingleOrListOf "vim.language.tailwind.lsp.servers" (enum (attrNames servers)); - default = defaultServers; - description = "Tailwindcss LSP server to use"; - }; - }; - }; - - config = mkIf cfg.enable (mkMerge [ - (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; - }) - ]); -} From 60b3715f1633729cfa6f85a6548b806e2ff33f44 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 16:31:07 +0200 Subject: [PATCH 033/130] lsp/presets/svelte-language-server: init --- modules/plugins/lsp/presets/default.nix | 1 + .../lsp/presets/svelte-language-server.nix | 53 +++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 modules/plugins/lsp/presets/svelte-language-server.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index bc87468a..ecff3e0c 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -3,6 +3,7 @@ ./deno.nix ./harper.nix ./lemminx.nix + ./svelte-language-server.nix ./tailwindcss-language-server.nix ./taplo.nix ./terraform-ls.nix diff --git a/modules/plugins/lsp/presets/svelte-language-server.nix b/modules/plugins/lsp/presets/svelte-language-server.nix new file mode 100644 index 00000000..423378c4 --- /dev/null +++ b/modules/plugins/lsp/presets/svelte-language-server.nix @@ -0,0 +1,53 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + inherit (lib.generators) mkLuaInline; + + cfg = config.vim.lsp.presets.svelte-language-server; +in { + options.vim.lsp.presets.svelte-language-server = { + enable = mkEnableOption "the Svelete Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.svelte-language-server = { + enable = true; + cmd = [(getExe pkgs.svelte-language-server) "--stdio"]; + root_dir = mkLuaInline '' + function(bufnr, on_dir) + local root_files = { 'package.json', '.git' } + local fname = vim.api.nvim_buf_get_name(bufnr) + -- Svelte LSP only supports file:// schema. https://github.com/sveltejs/language-tools/issues/2777 + if vim.uv.fs_stat(fname) ~= nil then + on_dir(vim.fs.dirname(vim.fs.find(root_files, { path = fname, upward = true })[1])) + end + end + ''; + on_attach = mkLuaInline '' + function(client, bufnr) + vim.api.nvim_create_autocmd('BufWritePost', { + pattern = { '*.js', '*.ts' }, + group = vim.api.nvim_create_augroup('svelte_js_ts_file_watch', {}), + callback = function(ctx) + -- internal API to sync changes that have not yet been saved to the file system + client:notify('$/onDidChangeTsOrJsFile', { uri = ctx.match }) + end, + }) + + vim.api.nvim_buf_create_user_command(bufnr, 'LspMigrateToSvelte5', function() + client:exec_cmd({ + command = 'migrate_to_svelte_5', + arguments = { vim.uri_from_bufnr(bufnr) }, + }) + end, { desc = 'Migrate Component to Svelte 5 Syntax' }) + end + ''; + }; + }; +} From 7ce9d912f4f4f7df99ffe7f83db221c894c97bf9 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 16:33:00 +0200 Subject: [PATCH 034/130] languages/svelte: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/svelte.nix | 57 ++++++---------------------- 1 file changed, 11 insertions(+), 46 deletions(-) diff --git a/modules/plugins/languages/svelte.nix b/modules/plugins/languages/svelte.nix index 73ed8019..10eea320 100644 --- a/modules/plugins/languages/svelte.nix +++ b/modules/plugins/languages/svelte.nix @@ -8,51 +8,16 @@ inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.modules) mkIf mkMerge; + inherit (lib) genAttrs; inherit (lib.meta) getExe; - inherit (lib.types) enum coercedTo; + inherit (lib.types) enum coercedTo listOf; inherit (lib.nvim.types) mkGrammarOption diagnostics deprecatedSingleOrListOf; inherit (lib.nvim.attrsets) mapListToAttrs; - inherit (lib.generators) mkLuaInline; cfg = config.vim.languages.svelte; - defaultServers = ["svelte"]; - servers = { - svelte = { - enable = true; - cmd = [(getExe pkgs.svelte-language-server) "--stdio"]; - filetypes = ["svelte"]; - root_dir = mkLuaInline '' - function(bufnr, on_dir) - local root_files = { 'package.json', '.git' } - local fname = vim.api.nvim_buf_get_name(bufnr) - -- Svelte LSP only supports file:// schema. https://github.com/sveltejs/language-tools/issues/2777 - if vim.uv.fs_stat(fname) ~= nil then - on_dir(vim.fs.dirname(vim.fs.find(root_files, { path = fname, upward = true })[1])) - end - end - ''; - on_attach = mkLuaInline '' - function(client, bufnr) - vim.api.nvim_create_autocmd('BufWritePost', { - pattern = { '*.js', '*.ts' }, - group = vim.api.nvim_create_augroup('svelte_js_ts_file_watch', {}), - callback = function(ctx) - -- internal API to sync changes that have not yet been saved to the file system - client:notify('$/onDidChangeTsOrJsFile', { uri = ctx.match }) - end, - }) - - vim.api.nvim_buf_create_user_command(bufnr, 'LspMigrateToSvelte5', function() - client:exec_cmd({ - command = 'migrate_to_svelte_5', - arguments = { vim.uri_from_bufnr(bufnr) }, - }) - end, { desc = 'Migrate Component to Svelte 5 Syntax' }) - end - ''; - }; - }; + defaultServers = ["svelte-language-server"]; + servers = ["svelte-language-server"]; defaultFormat = ["prettier"]; formats = let @@ -123,7 +88,7 @@ in { }; servers = mkOption { - type = deprecatedSingleOrListOf "vim.language.svelte.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "Svelte LSP server to use"; }; @@ -167,12 +132,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["svelte"]; + }); + }; }) (mkIf cfg.format.enable { From 8d46def1af7c4f83f4fc67d62bcaffe4e36094d4 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 16:35:48 +0200 Subject: [PATCH 035/130] lsp/presets/sqls: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/sqls.nix | 34 +++++++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 modules/plugins/lsp/presets/sqls.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index ecff3e0c..04629d56 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -3,6 +3,7 @@ ./deno.nix ./harper.nix ./lemminx.nix + ./sqls.nix ./svelte-language-server.nix ./tailwindcss-language-server.nix ./taplo.nix diff --git a/modules/plugins/lsp/presets/sqls.nix b/modules/plugins/lsp/presets/sqls.nix new file mode 100644 index 00000000..02a411b9 --- /dev/null +++ b/modules/plugins/lsp/presets/sqls.nix @@ -0,0 +1,34 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + inherit (lib.generators) mkLuaInline; + + cfg = config.vim.lsp.presets.sqls; +in { + options.vim.lsp.presets.sqls = { + enable = mkEnableOption "the SQL Language Server"; + }; + + config = mkIf cfg.enable { + vim = { + startPlugins = ["sqls-nvim"]; + lsp.servers.sqls = { + enable = true; + cmd = [(getExe pkgs.sqls)]; + root_markers = ["config.yml"]; + on_attach = mkLuaInline '' + function(client, bufnr) + client.server_capabilities.execute_command = true + require'sqls'.setup{} + end + ''; + }; + }; + }; +} From 7ecf68cb297fc3a52aad702782b7ead21c866310 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 16:42:05 +0200 Subject: [PATCH 036/130] languages/sql: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/sql.nix | 36 +++++++++---------------------- 1 file changed, 10 insertions(+), 26 deletions(-) diff --git a/modules/plugins/languages/sql.nix b/modules/plugins/languages/sql.nix index 9aff0029..61ed04b4 100644 --- a/modules/plugins/languages/sql.nix +++ b/modules/plugins/languages/sql.nix @@ -6,33 +6,19 @@ }: let inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption literalExpression; + inherit (lib) genAttrs; inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) enum package str; + inherit (lib.types) enum package str listOf; inherit (lib.nvim.types) diagnostics deprecatedSingleOrListOf; inherit (lib.nvim.attrsets) mapListToAttrs; - inherit (lib.generators) mkLuaInline; cfg = config.vim.languages.sql; sqlfluffDefault = pkgs.sqlfluff; sqruffDefault = pkgs.sqruff; defaultServers = ["sqls"]; - servers = { - sqls = { - enable = true; - cmd = [(getExe pkgs.sqls)]; - filetypes = ["sql" "mysql"]; - root_markers = ["config.yml"]; - settings = {}; - on_attach = mkLuaInline '' - function(client, bufnr) - client.server_capabilities.execute_command = true - require'sqls'.setup{} - end - ''; - }; - }; + servers = ["sqls"]; defaultFormat = ["sqlfluff"]; formats = { @@ -97,7 +83,7 @@ in { }; servers = mkOption { - type = deprecatedSingleOrListOf "vim.language.sql.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "SQL LSP server to use"; }; @@ -142,14 +128,12 @@ in { (mkIf cfg.lsp.enable { vim = { - startPlugins = ["sqls-nvim"]; - - lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["sql" "mysql" "msql" "plsql"]; + }); + }; }; }) From 78edab7c5f23eae049c0952de80be5d9d8324614 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 16:55:14 +0200 Subject: [PATCH 037/130] lsp/presets/ruby-lsp: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/ruby-lsp.nix | 27 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 modules/plugins/lsp/presets/ruby-lsp.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 04629d56..d9711107 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -3,6 +3,7 @@ ./deno.nix ./harper.nix ./lemminx.nix + ./ruby-lsp.nix ./sqls.nix ./svelte-language-server.nix ./tailwindcss-language-server.nix diff --git a/modules/plugins/lsp/presets/ruby-lsp.nix b/modules/plugins/lsp/presets/ruby-lsp.nix new file mode 100644 index 00000000..2b5f633b --- /dev/null +++ b/modules/plugins/lsp/presets/ruby-lsp.nix @@ -0,0 +1,27 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.ruby-lsp; +in { + options.vim.lsp.presets.ruby-lsp = { + enable = mkEnableOption "the Ruby Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.ruby-lsp = { + enable = true; + cmd = [(getExe pkgs.ruby-lsp)]; + root_markers = [".git"]; + init_options = { + formatter = "auto"; + }; + }; + }; +} From 0ee735f2f976bb3d1381223980766b46d6bbf21b Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 16:57:45 +0200 Subject: [PATCH 038/130] lsp/presets/solargprah: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/solargraph.nix | 35 ++++++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 modules/plugins/lsp/presets/solargraph.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index d9711107..6bf89a6d 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -4,6 +4,7 @@ ./harper.nix ./lemminx.nix ./ruby-lsp.nix + ./solargraph.nix ./sqls.nix ./svelte-language-server.nix ./tailwindcss-language-server.nix diff --git a/modules/plugins/lsp/presets/solargraph.nix b/modules/plugins/lsp/presets/solargraph.nix new file mode 100644 index 00000000..fcd64e4a --- /dev/null +++ b/modules/plugins/lsp/presets/solargraph.nix @@ -0,0 +1,35 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.solargraph; +in { + options.vim.lsp.presets.solargraph = { + enable = mkEnableOption "the Ruby Solargraph Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.solargraph = { + enable = true; + cmd = [(getExe pkgs.rubyPackages.solargraph) "stdio"]; + root_markers = [".git"]; + settings = { + solargraph = { + diagnostics = true; + }; + }; + flags = { + debounce_text_changes = 150; + }; + init_options = { + formatting = true; + }; + }; + }; +} From cfed70e715c4fca1f818b4099579fe200f58fb6f Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 17:00:24 +0200 Subject: [PATCH 039/130] languages/ruby: refactor lsp.servers to use lsp/presets/ --- docs/manual/release-notes/rl-0.9.md | 2 ++ modules/plugins/languages/ruby.nix | 49 ++++++----------------------- 2 files changed, 12 insertions(+), 39 deletions(-) diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index 5a0f5eee..11d66b46 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -81,6 +81,8 @@ - Renamed `tofuls-tf` and `tofuls-hcl` to `tofu-ls`. +- Renamed `ruby_lsp` to `ruby-lsp`. + - Removed `languages.tailwind` which only provided an LSP. Use `lsp.presets.tailwindcss-language-server` instead. diff --git a/modules/plugins/languages/ruby.nix b/modules/plugins/languages/ruby.nix index 5ebcdea5..392a4bb4 100644 --- a/modules/plugins/languages/ruby.nix +++ b/modules/plugins/languages/ruby.nix @@ -6,46 +6,17 @@ }: let inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption literalExpression; + inherit (lib) genAttrs; inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; inherit (lib.nvim.types) mkGrammarOption diagnostics deprecatedSingleOrListOf; - inherit (lib.types) enum; + inherit (lib.types) enum listOf; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.ruby; defaultServers = ["solargraph"]; - servers = { - ruby_lsp = { - enable = true; - cmd = [(getExe pkgs.ruby-lsp)]; - filetypes = ["ruby" "eruby"]; - root_markers = ["Gemfile" ".git"]; - init_options = { - formatter = "auto"; - }; - }; - - solargraph = { - enable = true; - cmd = [(getExe pkgs.rubyPackages.solargraph) "stdio"]; - filetypes = ["ruby"]; - root_markers = ["Gemfile" ".git"]; - settings = { - solargraph = { - diagnostics = true; - }; - }; - - flags = { - debounce_text_changes = 150; - }; - - init_options = { - formatting = true; - }; - }; - }; + servers = ["ruby-lsp" "solargraph"]; # testing @@ -85,7 +56,7 @@ in { }; servers = mkOption { - type = deprecatedSingleOrListOf "vim.language.ruby.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "Ruby LSP server to use"; }; @@ -121,12 +92,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["ruby" "eruby"]; + }); + }; }) (mkIf cfg.format.enable { From 1a20f75b57ffcd4e7a386e316db402a726fcaa60 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 17:06:06 +0200 Subject: [PATCH 040/130] lsp/presets/r-languageserver: init --- modules/plugins/lsp/presets/default.nix | 1 + .../plugins/lsp/presets/r-languageserver.nix | 37 +++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 modules/plugins/lsp/presets/r-languageserver.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 6bf89a6d..ee705924 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -3,6 +3,7 @@ ./deno.nix ./harper.nix ./lemminx.nix + ./r-languageserver.nix ./ruby-lsp.nix ./solargraph.nix ./sqls.nix diff --git a/modules/plugins/lsp/presets/r-languageserver.nix b/modules/plugins/lsp/presets/r-languageserver.nix new file mode 100644 index 00000000..9e83eecd --- /dev/null +++ b/modules/plugins/lsp/presets/r-languageserver.nix @@ -0,0 +1,37 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + inherit (lib.generators) mkLuaInline; + + cfg = config.vim.lsp.presets.r-languageserver; +in { + options.vim.lsp.presets.r-languageserver = { + enable = mkEnableOption "the R Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.r-languageserver = { + enable = true; + cmd = [ + (getExe (pkgs.rWrapper.override { + packages = [pkgs.rPackages.languageserver]; + })) + "--no-echo" + "-e" + "languageserver::run()" + ]; + root_markers = [".git"]; + root_dir = mkLuaInline '' + function(bufnr, on_dir) + on_dir(vim.fs.root(bufnr, '.git') or vim.uv.os_homedir()) + end + ''; + }; + }; +} From 60a69abead543a15fb45cd1819a79d8fc352b533 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 17:08:47 +0200 Subject: [PATCH 041/130] languages/r: refactor lsp.servers to use lsp/presets/ --- docs/manual/release-notes/rl-0.9.md | 2 ++ modules/plugins/languages/r.nix | 38 +++++++++-------------------- 2 files changed, 13 insertions(+), 27 deletions(-) diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index 11d66b46..572dea25 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -83,6 +83,8 @@ - Renamed `ruby_lsp` to `ruby-lsp`. +- Renamed `r_language_server` to `r-languageserver`. + - Removed `languages.tailwind` which only provided an LSP. Use `lsp.presets.tailwindcss-language-server` instead. diff --git a/modules/plugins/languages/r.nix b/modules/plugins/languages/r.nix index 764e0eba..240c3334 100644 --- a/modules/plugins/languages/r.nix +++ b/modules/plugins/languages/r.nix @@ -7,18 +7,13 @@ inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) enum; - inherit (lib.meta) getExe; + inherit (lib.types) enum listOf; + inherit (lib) genAttrs; inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; inherit (lib.nvim.attrsets) mapListToAttrs; - inherit (lib.generators) mkLuaInline; cfg = config.vim.languages.r; - r-with-languageserver = pkgs.rWrapper.override { - packages = [pkgs.rPackages.languageserver]; - }; - defaultFormat = ["format_r"]; formats = { styler = { @@ -47,19 +42,8 @@ }; }; - defaultServers = ["r_language_server"]; - servers = { - r_language_server = { - enable = true; - cmd = [(getExe r-with-languageserver) "--no-echo" "-e" "languageserver::run()"]; - filetypes = ["r" "rmd" "quarto"]; - root_dir = mkLuaInline '' - function(bufnr, on_dir) - on_dir(vim.fs.root(bufnr, '.git') or vim.uv.os_homedir()) - end - ''; - }; - }; + defaultServers = ["r-languageserver"]; + servers = ["r-languageserver"]; in { options.vim.languages.r = { enable = mkEnableOption "R language support"; @@ -83,7 +67,7 @@ in { }; servers = mkOption { - type = deprecatedSingleOrListOf "vim.language.r.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "R LSP server to use"; }; @@ -127,12 +111,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["r" "rmd" "quarto"]; + }); + }; }) ]); } From b2cf69918070b72738e340873ea0b3dc579410fb Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 17:22:34 +0200 Subject: [PATCH 042/130] lsp/presets/qmlls: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/qmlls.nix | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 modules/plugins/lsp/presets/qmlls.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index ee705924..30c2bf80 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -3,6 +3,7 @@ ./deno.nix ./harper.nix ./lemminx.nix + ./qmlls.nix ./r-languageserver.nix ./ruby-lsp.nix ./solargraph.nix diff --git a/modules/plugins/lsp/presets/qmlls.nix b/modules/plugins/lsp/presets/qmlls.nix new file mode 100644 index 00000000..7a3af64f --- /dev/null +++ b/modules/plugins/lsp/presets/qmlls.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe'; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.qmlls; +in { + options.vim.lsp.presets.qmlls = { + enable = mkEnableOption "the QML Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.qmlls = { + enable = true; + cmd = [(getExe' pkgs.kdePackages.qtdeclarative "qmlls")]; + root_markers = [".git"]; + }; + }; +} From c59a614a3ae3b1fe36cfc44fdb2de69fa404abd0 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 17:24:43 +0200 Subject: [PATCH 043/130] languages/qml: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/qml.nix | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/modules/plugins/languages/qml.nix b/modules/plugins/languages/qml.nix index 73d40575..fbba602a 100644 --- a/modules/plugins/languages/qml.nix +++ b/modules/plugins/languages/qml.nix @@ -5,10 +5,10 @@ ... }: let inherit (builtins) attrNames; - inherit (lib.meta) getExe'; inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) enum; + inherit (lib) genAttrs; + inherit (lib.types) enum listOf; inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; inherit (lib.nvim.attrsets) mapListToAttrs; @@ -17,13 +17,7 @@ qmlPackage = pkgs.kdePackages.qtdeclarative; defaultServers = ["qmlls"]; - servers = { - qmlls = { - cmd = [(getExe' qmlPackage "qmlls")]; - filetypes = ["qml" "qmljs"]; - rootmarkers = [".git"]; - }; - }; + servers = ["qmlls"]; defaultFormat = ["qmlformat"]; formats = { @@ -54,7 +48,7 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = deprecatedSingleOrListOf "vim.language.qml.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "QML LSP server to use"; }; @@ -83,13 +77,14 @@ in { grammars = [cfg.treesitter.package]; }; }) + (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["qml" "qmljs"]; + }); + }; }) (mkIf (cfg.format.enable && !cfg.lsp.enable) { From 04aeeb29389312785286c193e7f09402eaea3500 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 17:26:42 +0200 Subject: [PATCH 044/130] lsp/presets/zuban: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/zuban.nix | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 modules/plugins/lsp/presets/zuban.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 30c2bf80..7bc3417b 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -23,5 +23,6 @@ ./wgsl-analyzer.nix ./yaml-language-server.nix ./zls.nix + ./zuban.nix ]; } diff --git a/modules/plugins/lsp/presets/zuban.nix b/modules/plugins/lsp/presets/zuban.nix new file mode 100644 index 00000000..3713d912 --- /dev/null +++ b/modules/plugins/lsp/presets/zuban.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.zuban; +in { + options.vim.lsp.presets.zuban = { + enable = mkEnableOption "the Zuban Python Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.zuban = { + enable = true; + cmd = [(getExe pkgs.zuban) "server"]; + root_markers = [".git"]; + }; + }; +} From 212c345c3b38b9a7ee2a9cb5d4f7b11cb16df9e0 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 17:28:09 +0200 Subject: [PATCH 045/130] lsp/presets/ty: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/ty.nix | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 modules/plugins/lsp/presets/ty.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 7bc3417b..5f30d78a 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -17,6 +17,7 @@ ./tofu-ls.nix ./tombi.nix ./twig-language-server.nix + ./ty.nix ./typescript-go.nix ./typescript-language-server.nix ./vala-language-server.nix diff --git a/modules/plugins/lsp/presets/ty.nix b/modules/plugins/lsp/presets/ty.nix new file mode 100644 index 00000000..869fcb3c --- /dev/null +++ b/modules/plugins/lsp/presets/ty.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.ty; +in { + options.vim.lsp.presets.ty = { + enable = mkEnableOption "the ty Python Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.ty = { + enable = true; + cmd = [(getExe pkgs.ty) "server"]; + root_markers = [".git"]; + }; + }; +} From 5ee04aa8ad44a870ed2b2f09acd5c65d76bd6b46 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 17:29:40 +0200 Subject: [PATCH 046/130] lsp/presets/ruff: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/ruff.nix | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 modules/plugins/lsp/presets/ruff.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 5f30d78a..2e188014 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -6,6 +6,7 @@ ./qmlls.nix ./r-languageserver.nix ./ruby-lsp.nix + ./ruff.nix ./solargraph.nix ./sqls.nix ./svelte-language-server.nix diff --git a/modules/plugins/lsp/presets/ruff.nix b/modules/plugins/lsp/presets/ruff.nix new file mode 100644 index 00000000..28775b7b --- /dev/null +++ b/modules/plugins/lsp/presets/ruff.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.ruff; +in { + options.vim.lsp.presets.ruff = { + enable = mkEnableOption "the Ruff Python Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.ruff = { + enable = true; + cmd = [(getExe pkgs.ruff) "server"]; + root_markers = [".git"]; + }; + }; +} From ee388f875f8b103971d6fa9ecdf65a79423ead79 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 17:32:27 +0200 Subject: [PATCH 047/130] lsp/presets/python-lsp-server: init --- modules/plugins/lsp/presets/default.nix | 1 + .../plugins/lsp/presets/python-lsp-server.nix | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 modules/plugins/lsp/presets/python-lsp-server.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 2e188014..ed515ef2 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -3,6 +3,7 @@ ./deno.nix ./harper.nix ./lemminx.nix + ./python-lsp-server.nix ./qmlls.nix ./r-languageserver.nix ./ruby-lsp.nix diff --git a/modules/plugins/lsp/presets/python-lsp-server.nix b/modules/plugins/lsp/presets/python-lsp-server.nix new file mode 100644 index 00000000..7408a7f3 --- /dev/null +++ b/modules/plugins/lsp/presets/python-lsp-server.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.python-lsp-server; +in { + options.vim.lsp.presets.python-lsp-server = { + enable = mkEnableOption "the Python Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.python-lsp-server = { + enable = true; + cmd = [(getExe pkgs.python3Packages.python-lsp-server)]; + root_markers = [".git"]; + }; + }; +} From 611b42f339355e39b7ff06615b7756fca52d3d49 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 17:34:38 +0200 Subject: [PATCH 048/130] lsp/presets/basedpyright: init --- modules/plugins/lsp/presets/basedpyright.nix | 77 ++++++++++++++++++++ modules/plugins/lsp/presets/default.nix | 1 + 2 files changed, 78 insertions(+) create mode 100644 modules/plugins/lsp/presets/basedpyright.nix diff --git a/modules/plugins/lsp/presets/basedpyright.nix b/modules/plugins/lsp/presets/basedpyright.nix new file mode 100644 index 00000000..4e9b5b07 --- /dev/null +++ b/modules/plugins/lsp/presets/basedpyright.nix @@ -0,0 +1,77 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe'; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + inherit (lib.generators) mkLuaInline; + inherit (lib.nvim.dag) entryBefore; + + cfg = config.vim.lsp.presets.basedpyright; +in { + options.vim.lsp.presets.basedpyright = { + enable = mkEnableOption "the Based Pyright Language Server"; + }; + + config = mkIf cfg.enable { + vim = { + lsp.servers.basedpyright = { + enable = true; + cmd = [(getExe' pkgs.basedpyright "basedpyright-langserver") "--stdio"]; + root_markers = [".git" "pyrightconfig.json"]; + settings = { + basedpyright = { + analysis = { + autoSearchPaths = true; + useLibraryCodeForTypes = true; + diagnosticMode = "openFilesOnly"; + }; + }; + }; + on_attach = mkLuaInline '' + function(client, bufnr) + vim.api.nvim_buf_create_user_command(bufnr, 'LspPyrightOrganizeImports', function() + local params = { + command = 'basedpyright.organizeimports', + arguments = { vim.uri_from_bufnr(bufnr) }, + } + + -- Using client.request() directly because "basedpyright.organizeimports" is private + -- (not advertised via capabilities), which client:exec_cmd() refuses to call. + -- https://github.com/neovim/neovim/blob/c333d64663d3b6e0dd9aa440e433d346af4a3d81/runtime/lua/vim/lsp/client.lua#L1024-L1030 + client.request('workspace/executeCommand', params, nil, bufnr) + end, { + desc = 'Organize Imports', + }) + + vim.api.nvim_buf_create_user_command(bufnr, 'LspPyrightSetPythonPath', basedpyright_set_python_path, { + desc = 'Reconfigure basedpyright with the provided python path', + nargs = 1, + complete = 'file', + }) + end + ''; + }; + luaConfigRC.basedpyright-util = entryBefore ["lsp-servers"] '' + local function basedpyright_set_python_path(server_name, command) + local path = command.args + local clients = vim.lsp.get_clients { + bufnr = vim.api.nvim_get_current_buf(), + name = server_name, + } + for _, client in ipairs(clients) do + if client.settings then + client.settings.python = vim.tbl_deep_extend('force', client.settings.python or {}, { pythonPath = path }) + else + client.config.settings = vim.tbl_deep_extend('force', client.config.settings, { python = { pythonPath = path } }) + end + client:notify('workspace/didChangeConfiguration', { settings = nil }) + end + end + ''; + }; + }; +} diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index ed515ef2..c017f45b 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -1,5 +1,6 @@ { imports = [ + ./basedpyright.nix ./deno.nix ./harper.nix ./lemminx.nix From 919883516c641fa2c58df68e54d529070acf05ea Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 17:36:48 +0200 Subject: [PATCH 049/130] lsp/presets/pyright: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/pyright.nix | 76 +++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 modules/plugins/lsp/presets/pyright.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index c017f45b..0a257614 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -4,6 +4,7 @@ ./deno.nix ./harper.nix ./lemminx.nix + ./pyright.nix ./python-lsp-server.nix ./qmlls.nix ./r-languageserver.nix diff --git a/modules/plugins/lsp/presets/pyright.nix b/modules/plugins/lsp/presets/pyright.nix new file mode 100644 index 00000000..b7367bc2 --- /dev/null +++ b/modules/plugins/lsp/presets/pyright.nix @@ -0,0 +1,76 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe'; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + inherit (lib.generators) mkLuaInline; + inherit (lib.nvim.dag) entryBefore; + + cfg = config.vim.lsp.presets.pyright; +in { + options.vim.lsp.presets.pyright = { + enable = mkEnableOption "the Pyright Language Server"; + }; + + config = mkIf cfg.enable { + vim = { + lsp.servers.pyright = { + enable = true; + cmd = [(getExe' pkgs.pyright "pyright-langserver") "--stdio"]; + root_markers = [".git" "pyrightconfig.json"]; + settings = { + python = { + analysis = { + autoSearchPaths = true; + useLibraryCodeForTypes = true; + diagnosticMode = "openFilesOnly"; + }; + }; + }; + on_attach = mkLuaInline '' + function(client, bufnr) + vim.api.nvim_buf_create_user_command(bufnr, 'LspPyrightOrganizeImports', function() + local params = { + command = 'pyright.organizeimports', + arguments = { vim.uri_from_bufnr(bufnr) }, + } + + -- Using client.request() directly because "pyright.organizeimports" is private + -- (not advertised via capabilities), which client:exec_cmd() refuses to call. + -- https://github.com/neovim/neovim/blob/c333d64663d3b6e0dd9aa440e433d346af4a3d81/runtime/lua/vim/lsp/client.lua#L1024-L1030 + client.request('workspace/executeCommand', params, nil, bufnr) + end, { + desc = 'Organize Imports', + }) + vim.api.nvim_buf_create_user_command(bufnr, 'LspPyrightSetPythonPath', pyright_set_python_path, { + desc = 'Reconfigure pyright with the provided python path', + nargs = 1, + complete = 'file', + }) + end + ''; + }; + luaConfigRC.pyright-util = entryBefore ["lsp-servers"] '' + local function pyright_set_python_path(server_name, command) + local path = command.args + local clients = vim.lsp.get_clients { + bufnr = vim.api.nvim_get_current_buf(), + name = server_name, + } + for _, client in ipairs(clients) do + if client.settings then + client.settings.python = vim.tbl_deep_extend('force', client.settings.python or {}, { pythonPath = path }) + else + client.config.settings = vim.tbl_deep_extend('force', client.config.settings, { python = { pythonPath = path } }) + end + client:notify('workspace/didChangeConfiguration', { settings = nil }) + end + end + ''; + }; + }; +} From 6eb193c437f3ea07f956f40da44a71799a5774d0 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 17:38:26 +0200 Subject: [PATCH 050/130] lsp/presets/pyrefly: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/pyrefly.nix | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 modules/plugins/lsp/presets/pyrefly.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 0a257614..2a63ae0f 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -4,6 +4,7 @@ ./deno.nix ./harper.nix ./lemminx.nix + ./pyrefly.nix ./pyright.nix ./python-lsp-server.nix ./qmlls.nix diff --git a/modules/plugins/lsp/presets/pyrefly.nix b/modules/plugins/lsp/presets/pyrefly.nix new file mode 100644 index 00000000..18db921a --- /dev/null +++ b/modules/plugins/lsp/presets/pyrefly.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.pyrefly; +in { + options.vim.lsp.presets.pyrefly = { + enable = mkEnableOption "the Pyrefly Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.pyrefly = { + enable = true; + cmd = [(getExe pkgs.pyrefly) "lsp"]; + root_markers = [".git" "pyrefly.toml"]; + }; + }; +} From 27fdd3501ab15be324f1ee93c508227130f205a7 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 17:43:51 +0200 Subject: [PATCH 051/130] languages/python: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/python.nix | 217 +++------------------------ 1 file changed, 17 insertions(+), 200 deletions(-) diff --git a/modules/plugins/languages/python.nix b/modules/plugins/languages/python.nix index 44179ab2..5e1eaa7b 100644 --- a/modules/plugins/languages/python.nix +++ b/modules/plugins/languages/python.nix @@ -7,185 +7,18 @@ inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.lists) flatten; + inherit (lib) genAttrs; inherit (lib.meta) getExe getExe'; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) enum package bool; + inherit (lib.types) enum package bool listOf; inherit (lib.nvim.attrsets) mapListToAttrs; inherit (lib.nvim.types) deprecatedSingleOrListOf diagnostics; - inherit (lib.generators) mkLuaInline; - inherit (lib.nvim.dag) entryBefore; inherit (lib.trivial) warn; cfg = config.vim.languages.python; defaultServers = ["basedpyright"]; - servers = { - pyrefly = { - enable = true; - cmd = [(getExe pkgs.pyrefly) "lsp"]; - filetypes = ["python"]; - root_markers = [ - "pyproject.toml" - "pyrefly.toml" - "setup.py" - "setup.cfg" - "requirements.txt" - "Pipfile" - ".git" - ]; - }; - - pyright = { - enable = true; - cmd = [(getExe' pkgs.pyright "pyright-langserver") "--stdio"]; - filetypes = ["python"]; - root_markers = [ - "pyproject.toml" - "setup.py" - "setup.cfg" - "requirements.txt" - "Pipfile" - "pyrightconfig.json" - ".git" - ]; - settings = { - python = { - analysis = { - autoSearchPaths = true; - useLibraryCodeForTypes = true; - diagnosticMode = "openFilesOnly"; - }; - }; - }; - on_attach = mkLuaInline '' - function(client, bufnr) - vim.api.nvim_buf_create_user_command(bufnr, 'LspPyrightOrganizeImports', function() - local params = { - command = 'pyright.organizeimports', - arguments = { vim.uri_from_bufnr(bufnr) }, - } - - -- Using client.request() directly because "pyright.organizeimports" is private - -- (not advertised via capabilities), which client:exec_cmd() refuses to call. - -- https://github.com/neovim/neovim/blob/c333d64663d3b6e0dd9aa440e433d346af4a3d81/runtime/lua/vim/lsp/client.lua#L1024-L1030 - client.request('workspace/executeCommand', params, nil, bufnr) - end, { - desc = 'Organize Imports', - }) - vim.api.nvim_buf_create_user_command(bufnr, 'LspPyrightSetPythonPath', set_python_path, { - desc = 'Reconfigure basedpyright with the provided python path', - nargs = 1, - complete = 'file', - }) - end - ''; - }; - - basedpyright = { - enable = true; - cmd = [(getExe' pkgs.basedpyright "basedpyright-langserver") "--stdio"]; - filetypes = ["python"]; - root_markers = [ - "pyproject.toml" - "setup.py" - "setup.cfg" - "requirements.txt" - "Pipfile" - "pyrightconfig.json" - ".git" - ]; - settings = { - basedpyright = { - analysis = { - autoSearchPaths = true; - useLibraryCodeForTypes = true; - diagnosticMode = "openFilesOnly"; - }; - }; - }; - on_attach = mkLuaInline '' - function(client, bufnr) - vim.api.nvim_buf_create_user_command(bufnr, 'LspPyrightOrganizeImports', function() - local params = { - command = 'basedpyright.organizeimports', - arguments = { vim.uri_from_bufnr(bufnr) }, - } - - -- Using client.request() directly because "basedpyright.organizeimports" is private - -- (not advertised via capabilities), which client:exec_cmd() refuses to call. - -- https://github.com/neovim/neovim/blob/c333d64663d3b6e0dd9aa440e433d346af4a3d81/runtime/lua/vim/lsp/client.lua#L1024-L1030 - client.request('workspace/executeCommand', params, nil, bufnr) - end, { - desc = 'Organize Imports', - }) - - vim.api.nvim_buf_create_user_command(bufnr, 'LspPyrightSetPythonPath', set_python_path, { - desc = 'Reconfigure basedpyright with the provided python path', - nargs = 1, - complete = 'file', - }) - end - ''; - }; - - python-lsp-server = { - enable = true; - cmd = [(getExe pkgs.python3Packages.python-lsp-server)]; - filetypes = ["python"]; - root_markers = [ - "pyproject.toml" - "setup.py" - "setup.cfg" - "requirements.txt" - "Pipfile" - ".git" - ]; - }; - - ruff = { - enable = true; - cmd = [(getExe pkgs.ruff) "server"]; - filetypes = ["python"]; - root_markers = [ - "pyproject.toml" - "setup.py" - "setup.cfg" - "requirements.txt" - "Pipfile" - ".git" - ]; - }; - - ty = { - enable = true; - cmd = [(getExe pkgs.ty) "server"]; - filetypes = ["python"]; - root_markers = [ - "pyproject.toml" - "setup.py" - "setup.cfg" - "requirements.txt" - "Pipfile" - ".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" - ]; - }; - }; + servers = ["pyrefly" "pyright" "basedpyright" "python-lsp-server" "ruff" "ty" "zuban"]; defaultFormat = ["black"]; formats = { @@ -313,7 +146,7 @@ in { }; servers = mkOption { - type = deprecatedSingleOrListOf "vim.language.python.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "Python LSP server to use"; }; @@ -382,35 +215,19 @@ in { }) (mkIf cfg.lsp.enable { - vim.luaConfigRC.python-util = - entryBefore ["lsp-servers"] - /* - lua - */ - '' - local function set_python_path(server_name, command) - local path = command.args - local clients = vim.lsp.get_clients { - bufnr = vim.api.nvim_get_current_buf(), - name = server_name, - } - for _, client in ipairs(clients) do - if client.settings then - client.settings.python = vim.tbl_deep_extend('force', client.settings.python or {}, { pythonPath = path }) - else - client.config.settings = vim.tbl_deep_extend('force', client.config.settings, { python = { pythonPath = path } }) - end - client:notify('workspace/didChangeConfiguration', { settings = nil }) - end - end - ''; - - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["python"]; + root_markers = [ + "Pipfile" + "pyproject.toml" + "requirements.txt" + "setup.cfg" + "setup.py" + ]; + }); + }; }) (mkIf cfg.format.enable { From e1c3257ca37dcbf87700f83c151f52278ea17261 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 17:46:21 +0200 Subject: [PATCH 052/130] lsp/presets/phpactor: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/phpactor.nix | 25 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 modules/plugins/lsp/presets/phpactor.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 2a63ae0f..1615ef5e 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -4,6 +4,7 @@ ./deno.nix ./harper.nix ./lemminx.nix + ./phpactor.nix ./pyrefly.nix ./pyright.nix ./python-lsp-server.nix diff --git a/modules/plugins/lsp/presets/phpactor.nix b/modules/plugins/lsp/presets/phpactor.nix new file mode 100644 index 00000000..57e2ee24 --- /dev/null +++ b/modules/plugins/lsp/presets/phpactor.nix @@ -0,0 +1,25 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.phpactor; +in { + options.vim.lsp.presets.phpactor = { + enable = mkEnableOption "the PHPActor Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.phpactor = { + enable = true; + cmd = [(getExe pkgs.phpactor) "language-server"]; + root_markers = [".git" ".phpactor.json" ".phpactor.yml"]; + workspace_required = true; + }; + }; +} From d9ff1b000baeee10848b03b55b334628535e9cc8 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 17:48:42 +0200 Subject: [PATCH 053/130] lsp/presets/phan: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/phan.nix | 45 +++++++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 modules/plugins/lsp/presets/phan.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 1615ef5e..7d6a99da 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -4,6 +4,7 @@ ./deno.nix ./harper.nix ./lemminx.nix + ./phan.nix ./phpactor.nix ./pyrefly.nix ./pyright.nix diff --git a/modules/plugins/lsp/presets/phan.nix b/modules/plugins/lsp/presets/phan.nix new file mode 100644 index 00000000..281da772 --- /dev/null +++ b/modules/plugins/lsp/presets/phan.nix @@ -0,0 +1,45 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + inherit (lib.generators) mkLuaInline; + + cfg = config.vim.lsp.presets.phan; +in { + options.vim.lsp.presets.phan = { + enable = mkEnableOption "the Phan Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.phan = { + enable = true; + cmd = [ + (getExe pkgs.php85Packages.phan) + "-m" + "json" + "--no-color" + "--no-progress-bar" + "-x" + "-u" + "-S" + "--language-server-on-stdin" + "--allow-polyfill-parser" + ]; + root_dir = mkLuaInline '' + function(bufnr, on_dir) + local fname = vim.api.nvim_buf_get_name(bufnr) + local cwd = assert(vim.uv.cwd()) + local root = vim.fs.root(fname, { 'composer.json', '.git' }) + + -- prefer cwd if root is a descendant + on_dir(root and vim.fs.relpath(cwd, root) and cwd) + end + ''; + }; + }; +} From 01525bf49b76039f2f6a1e912b3008df6e0526ef Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 17:51:07 +0200 Subject: [PATCH 054/130] lsp/presets/intelephense: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/intelephense.nix | 24 ++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 modules/plugins/lsp/presets/intelephense.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 7d6a99da..a72358b8 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -3,6 +3,7 @@ ./basedpyright.nix ./deno.nix ./harper.nix + ./intelephense.nix ./lemminx.nix ./phan.nix ./phpactor.nix diff --git a/modules/plugins/lsp/presets/intelephense.nix b/modules/plugins/lsp/presets/intelephense.nix new file mode 100644 index 00000000..da0edbbb --- /dev/null +++ b/modules/plugins/lsp/presets/intelephense.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.intelephense; +in { + options.vim.lsp.presets.intelephense = { + enable = mkEnableOption "the Intelephense Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.intelephense = { + enable = true; + cmd = [(getExe pkgs.intelephense) "--stdio"]; + root_markers = [".git"]; + }; + }; +} From 0bd718b472250401a74c6352cf47e93b9a2f695b Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 17:54:59 +0200 Subject: [PATCH 055/130] languages/php: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/php.nix | 68 +++++-------------------------- 1 file changed, 11 insertions(+), 57 deletions(-) diff --git a/modules/plugins/languages/php.nix b/modules/plugins/languages/php.nix index fb9edd5c..38249ee1 100644 --- a/modules/plugins/languages/php.nix +++ b/modules/plugins/languages/php.nix @@ -6,65 +6,18 @@ }: let 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 deprecatedSingleOrListOf; + inherit (lib.nvim.types) mkGrammarOption; inherit (lib.nvim.attrsets) mapListToAttrs; - inherit (lib.generators) mkLuaInline; cfg = config.vim.languages.php; defaultServers = ["phpactor"]; - servers = { - phpactor = { - enable = true; - cmd = [(getExe pkgs.phpactor) "language-server"]; - filetypes = ["php"]; - root_markers = [".git" "composer.json" ".phpactor.json" ".phpactor.yml"]; - workspace_required = true; - }; - - phan = { - enable = true; - cmd = [ - (getExe pkgs.php81Packages.phan) - "-m" - "json" - "--no-color" - "--no-progress-bar" - "-x" - "-u" - "-S" - "--language-server-on-stdin" - "--allow-polyfill-parser" - ]; - filetypes = ["php"]; - root_dir = - mkLuaInline - /* - lua - */ - '' - function(bufnr, on_dir) - local fname = vim.api.nvim_buf_get_name(bufnr) - local cwd = assert(vim.uv.cwd()) - local root = vim.fs.root(fname, { 'composer.json', '.git' }) - - -- prefer cwd if root is a descendant - on_dir(root and vim.fs.relpath(cwd, root) and cwd) - end - ''; - }; - - intelephense = { - enable = true; - cmd = [(getExe pkgs.intelephense) "--stdio"]; - filetypes = ["php"]; - root_markers = ["composer.json" ".git"]; - }; - }; + servers = ["phpactor" "phan" "intelephense"]; defaultFormat = ["php_cs_fixer"]; formats = { @@ -103,7 +56,7 @@ in { }; servers = mkOption { - type = deprecatedSingleOrListOf "vim.language.php.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "PHP LSP server to use"; }; @@ -159,12 +112,13 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["php"]; + root_markers = ["composer.json"]; + }); + }; }) (mkIf cfg.format.enable { From e79b9ecc5bf23824db250476e33e6957cf27a3bd Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 17:59:42 +0200 Subject: [PATCH 056/130] lsp/presets/openscad-lsp: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/openscad-lsp.nix | 24 ++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 modules/plugins/lsp/presets/openscad-lsp.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index a72358b8..f0b0a442 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -5,6 +5,7 @@ ./harper.nix ./intelephense.nix ./lemminx.nix + ./openscad-lsp.nix ./phan.nix ./phpactor.nix ./pyrefly.nix diff --git a/modules/plugins/lsp/presets/openscad-lsp.nix b/modules/plugins/lsp/presets/openscad-lsp.nix new file mode 100644 index 00000000..d271c8d3 --- /dev/null +++ b/modules/plugins/lsp/presets/openscad-lsp.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.openscad-lsp; +in { + options.vim.lsp.presets.openscad-lsp = { + enable = mkEnableOption "the Open SCAD Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.openscad-lsp = { + enable = true; + cmd = [(getExe pkgs.openscad-lsp) "--stdio"]; + root_markers = [".git"]; + }; + }; +} From 92a912a713ecf0a4e55a55a890fa0e9851bccb2a Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 18:01:21 +0200 Subject: [PATCH 057/130] lsp/presets/ols: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/ols.nix | 29 +++++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 modules/plugins/lsp/presets/ols.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index f0b0a442..1a497b49 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -5,6 +5,7 @@ ./harper.nix ./intelephense.nix ./lemminx.nix + ./ols.nix ./openscad-lsp.nix ./phan.nix ./phpactor.nix diff --git a/modules/plugins/lsp/presets/ols.nix b/modules/plugins/lsp/presets/ols.nix new file mode 100644 index 00000000..9eb4e3ad --- /dev/null +++ b/modules/plugins/lsp/presets/ols.nix @@ -0,0 +1,29 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + inherit (lib.generators) mkLuaInline; + + cfg = config.vim.lsp.presets.ols; +in { + options.vim.lsp.presets.ols = { + enable = mkEnableOption "the Odin Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.ols = { + enable = true; + cmd = [(getExe pkgs.ols)]; + root_dir = mkLuaInline '' + function(bufnr, on_dir) + local fname = vim.api.nvim_buf_get_name(bufnr) + on_dir(util.root_pattern('ols.json', '.git', '*.odin')(fname)) + end''; + }; + }; +} From 16753bfc5205a11d2e1bc29aee5ba570571845e7 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 18:03:08 +0200 Subject: [PATCH 058/130] lsp/presets/ocaml-lsp: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/ocaml-lsp.nix | 44 +++++++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 modules/plugins/lsp/presets/ocaml-lsp.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 1a497b49..714c39b5 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -5,6 +5,7 @@ ./harper.nix ./intelephense.nix ./lemminx.nix + ./ocaml-lsp.nix ./ols.nix ./openscad-lsp.nix ./phan.nix diff --git a/modules/plugins/lsp/presets/ocaml-lsp.nix b/modules/plugins/lsp/presets/ocaml-lsp.nix new file mode 100644 index 00000000..0e9b0952 --- /dev/null +++ b/modules/plugins/lsp/presets/ocaml-lsp.nix @@ -0,0 +1,44 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + inherit (lib.generators) mkLuaInline; + + cfg = config.vim.lsp.presets.ocaml-lsp; +in { + options.vim.lsp.presets.ocaml-lsp = { + enable = mkEnableOption "the OCaml Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.ocaml-lsp = { + enable = true; + cmd = [(getExe pkgs.ocamlPackages.ocaml-lsp)]; + root_dir = mkLuaInline '' + function(bufnr, on_dir) + local fname = vim.api.nvim_buf_get_name(bufnr) + on_dir(util.root_pattern('*.opam', 'esy.json', 'package.json', '.git', 'dune-project', 'dune-workspace')(fname)) + end + ''; + get_language_id = mkLuaInline '' + function(_, ftype) + local language_id_of = { + menhir = 'ocaml.menhir', + ocaml = 'ocaml', + ocamlinterface = 'ocaml.interface', + ocamllex = 'ocaml.ocamllex', + reason = 'reason', + dune = 'dune', + } + + return language_id_of[ftype] + end + ''; + }; + }; +} From 2af349436fe47e92884e04fcb11dde11460cc64a Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 18:05:02 +0200 Subject: [PATCH 059/130] lsp/presets/nushell: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/nushell.nix | 29 +++++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 modules/plugins/lsp/presets/nushell.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 714c39b5..63dddb8a 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -5,6 +5,7 @@ ./harper.nix ./intelephense.nix ./lemminx.nix + ./nushell.nix ./ocaml-lsp.nix ./ols.nix ./openscad-lsp.nix diff --git a/modules/plugins/lsp/presets/nushell.nix b/modules/plugins/lsp/presets/nushell.nix new file mode 100644 index 00000000..1f253825 --- /dev/null +++ b/modules/plugins/lsp/presets/nushell.nix @@ -0,0 +1,29 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + inherit (lib.generators) mkLuaInline; + + cfg = config.vim.lsp.presets.nushell; +in { + options.vim.lsp.presets.nushell = { + enable = mkEnableOption "the NuShell Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.nushell = { + enable = true; + cmd = [(getExe pkgs.nushell) "--no-config-file" "--lsp"]; + root_dir = mkLuaInline '' + function(bufnr, on_dir) + on_dir(vim.fs.root(bufnr, { '.git' }) or vim.fs.dirname(vim.api.nvim_buf_get_name(bufnr))) + end + ''; + }; + }; +} From 239f7d4c44a6eef8d832084d6be2cc647e74b69a Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 18:07:01 +0200 Subject: [PATCH 060/130] lsp/presets/nil: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/nil.nix | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 modules/plugins/lsp/presets/nil.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 63dddb8a..5bf3e93f 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -5,6 +5,7 @@ ./harper.nix ./intelephense.nix ./lemminx.nix + ./nil.nix ./nushell.nix ./ocaml-lsp.nix ./ols.nix diff --git a/modules/plugins/lsp/presets/nil.nix b/modules/plugins/lsp/presets/nil.nix new file mode 100644 index 00000000..e59e24fd --- /dev/null +++ b/modules/plugins/lsp/presets/nil.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.nil; +in { + options.vim.lsp.presets.nil = { + enable = mkEnableOption "the Nil Nix Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.nil = { + enable = true; + cmd = [(getExe pkgs.nil)]; + root_markers = [".git"]; + }; + }; +} From 11eddae2eb1527534d5970de7bed1af7edaeeb9d Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 18:07:50 +0200 Subject: [PATCH 061/130] lsp/presets/nixd: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/nixd.nix | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 modules/plugins/lsp/presets/nixd.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 5bf3e93f..f0239ca6 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -6,6 +6,7 @@ ./intelephense.nix ./lemminx.nix ./nil.nix + ./nixd.nix ./nushell.nix ./ocaml-lsp.nix ./ols.nix diff --git a/modules/plugins/lsp/presets/nixd.nix b/modules/plugins/lsp/presets/nixd.nix new file mode 100644 index 00000000..6f1326be --- /dev/null +++ b/modules/plugins/lsp/presets/nixd.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.nixd; +in { + options.vim.lsp.presets.nixd = { + enable = mkEnableOption "the NixD Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.nixd = { + enable = true; + cmd = [(getExe pkgs.nixd)]; + root_markers = [".git"]; + }; + }; +} From a8e4dc181726a14d8a3363aa948e226ecfae371f Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 18:09:47 +0200 Subject: [PATCH 062/130] lsp/presets/nimlsp: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/nimlsp.nix | 32 +++++++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 modules/plugins/lsp/presets/nimlsp.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index f0239ca6..4b64e67b 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -6,6 +6,7 @@ ./intelephense.nix ./lemminx.nix ./nil.nix + ./nimlsp.nix ./nixd.nix ./nushell.nix ./ocaml-lsp.nix diff --git a/modules/plugins/lsp/presets/nimlsp.nix b/modules/plugins/lsp/presets/nimlsp.nix new file mode 100644 index 00000000..e52e9cee --- /dev/null +++ b/modules/plugins/lsp/presets/nimlsp.nix @@ -0,0 +1,32 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + inherit (lib.generators) mkLuaInline; + + cfg = config.vim.lsp.presets.nimlsp; +in { + options.vim.lsp.presets.nimlsp = { + enable = mkEnableOption "the Nim Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.nimlsp = { + enable = true; + cmd = [(getExe pkgs.nimlsp)]; + root_dir = mkLuaInline '' + function(bufnr, on_dir) + local fname = vim.api.nvim_buf_get_name(bufnr) + on_dir( + util.root_pattern '*.nimble'(fname) or vim.fs.dirname(vim.fs.find('.git', { path = fname, upward = true })[1]) + ) + end + ''; + }; + }; +} From 835d3db423d9e44ae51760af3b3f3be1cf9b40fb Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 18:11:40 +0200 Subject: [PATCH 063/130] languages/openscad: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/openscad.nix | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/modules/plugins/languages/openscad.nix b/modules/plugins/languages/openscad.nix index e1ca096d..4ff18ff8 100644 --- a/modules/plugins/languages/openscad.nix +++ b/modules/plugins/languages/openscad.nix @@ -4,12 +4,10 @@ lib, ... }: let - inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.modules) mkIf mkMerge; inherit (lib.types) enum listOf; - inherit (lib.meta) getExe; - inherit (lib.nvim.attrsets) mapListToAttrs; + inherit (lib) genAttrs; cfg = config.vim.languages.openscad; /* @@ -22,13 +20,7 @@ */ defaultServers = ["openscad-lsp"]; - servers = { - openscad-lsp = { - enable = true; - cmd = [(getExe pkgs.openscad-lsp) "--stdio"]; - filetypes = ["openscad"]; - }; - }; + servers = ["openscad-lsp"]; in { options.vim.languages.openscad = { enable = mkEnableOption "OpenSCAD language support"; @@ -42,7 +34,7 @@ in { }; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "OpenSCAD LSP server to use"; }; @@ -51,12 +43,12 @@ in { config = mkIf cfg.enable (mkMerge [ (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["openscad"]; + }); + }; }) ]); } From 00a372118a6f296a79dbee85c814f8266770a9a2 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 18:13:31 +0200 Subject: [PATCH 064/130] languages/odin: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/odin.nix | 41 ++++++++---------------------- 1 file changed, 11 insertions(+), 30 deletions(-) diff --git a/modules/plugins/languages/odin.nix b/modules/plugins/languages/odin.nix index d2bd3c85..25d26df1 100644 --- a/modules/plugins/languages/odin.nix +++ b/modules/plugins/languages/odin.nix @@ -7,34 +7,15 @@ inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) enum package; + inherit (lib.types) enum package listOf; inherit (lib.nvim.dag) entryAfter; - inherit (lib.meta) getExe; - inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; - inherit (lib.generators) mkLuaInline; - inherit (lib.nvim.attrsets) mapListToAttrs; + inherit (lib) genAttrs; + inherit (lib.nvim.types) mkGrammarOption; cfg = config.vim.languages.odin; defaultServers = ["ols"]; - servers = { - ols = { - enable = true; - cmd = [(getExe pkgs.ols)]; - filetypes = ["odin"]; - root_dir = - mkLuaInline - /* - lua - */ - '' - function(bufnr, on_dir) - local fname = vim.api.nvim_buf_get_name(bufnr) - on_dir(util.root_pattern('ols.json', '.git', '*.odin')(fname)) - end''; - }; - }; - + servers = ["ols"]; defaultDebugger = "codelldb"; debuggers = { codelldb = { @@ -71,7 +52,7 @@ in { }; servers = mkOption { - type = deprecatedSingleOrListOf "vim.language.odin.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "Odin LSP server to use"; }; @@ -106,12 +87,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["odin"]; + }); + }; }) (mkIf cfg.dap.enable { From cf981331a3c0f9445ae8b418bb0146a182b4cda2 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 18:15:09 +0200 Subject: [PATCH 065/130] languages/ocaml: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/ocaml.nix | 57 +++++------------------------ 1 file changed, 10 insertions(+), 47 deletions(-) diff --git a/modules/plugins/languages/ocaml.nix b/modules/plugins/languages/ocaml.nix index 6395fda5..051bef75 100644 --- a/modules/plugins/languages/ocaml.nix +++ b/modules/plugins/languages/ocaml.nix @@ -7,53 +7,16 @@ inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.modules) mkIf mkMerge; + inherit (lib) genAttrs; inherit (lib.meta) getExe; - inherit (lib.types) enum; + inherit (lib.types) enum listOf; inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; - inherit (lib.generators) mkLuaInline; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.ocaml; defaultServers = ["ocaml-lsp"]; - servers = { - ocaml-lsp = { - enable = true; - cmd = [(getExe pkgs.ocamlPackages.ocaml-lsp)]; - filetypes = ["ocaml" "menhir" "ocamlinterface" "ocamllex" "reason" "dune"]; - root_dir = - mkLuaInline - /* - lua - */ - '' - function(bufnr, on_dir) - local fname = vim.api.nvim_buf_get_name(bufnr) - on_dir(util.root_pattern('*.opam', 'esy.json', 'package.json', '.git', 'dune-project', 'dune-workspace')(fname)) - end - ''; - get_language_id = - mkLuaInline - /* - lua - */ - '' - function(_, ftype) - local language_id_of = { - menhir = 'ocaml.menhir', - ocaml = 'ocaml', - ocamlinterface = 'ocaml.interface', - ocamllex = 'ocaml.ocamllex', - reason = 'reason', - dune = 'dune', - } - - return language_id_of[ftype] - - end - ''; - }; - }; + servers = ["ocaml-lsp"]; defaultFormat = ["ocamlformat"]; formats = { @@ -84,7 +47,7 @@ in { }; servers = mkOption { - type = deprecatedSingleOrListOf "vim.language.ocaml.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "OCaml LSP server to use"; }; @@ -102,12 +65,12 @@ in { config = mkIf cfg.enable (mkMerge [ (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["ocaml" "menhir" "ocamlinterface" "ocamllex" "reason" "dune"]; + }); + }; }) (mkIf cfg.treesitter.enable { From c3b7ca7f26ade82d99f1bcb7679af8dd62e6c912 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 18:17:08 +0200 Subject: [PATCH 066/130] languages/nu: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/nu.nix | 41 +++++++++----------------------- 1 file changed, 11 insertions(+), 30 deletions(-) diff --git a/modules/plugins/languages/nu.nix b/modules/plugins/languages/nu.nix index a36e1255..9425da85 100644 --- a/modules/plugins/languages/nu.nix +++ b/modules/plugins/languages/nu.nix @@ -5,32 +5,13 @@ ... }: let inherit (lib.options) mkEnableOption mkOption literalExpression; - inherit (lib.types) enum; + inherit (lib.types) enum listOf; inherit (lib.modules) mkIf mkMerge; - inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; - inherit (lib.meta) getExe; - inherit (lib.generators) mkLuaInline; - inherit (lib.nvim.attrsets) mapListToAttrs; - inherit (builtins) attrNames; + inherit (lib.nvim.types) mkGrammarOption; + inherit (lib) genAttrs; defaultServers = ["nushell"]; - servers = { - nushell = { - enable = true; - cmd = [(getExe pkgs.nushell) "--no-config-file" "--lsp"]; - filetypes = ["nu"]; - root_dir = - mkLuaInline - /* - lua - */ - '' - function(bufnr, on_dir) - on_dir(vim.fs.root(bufnr, { '.git' }) or vim.fs.dirname(vim.api.nvim_buf_get_name(bufnr))) - end - ''; - }; - }; + servers = ["nushell"]; cfg = config.vim.languages.nu; in { @@ -56,7 +37,7 @@ in { }; servers = mkOption { - type = deprecatedSingleOrListOf "vim.language.nu.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "Nu LSP server to use"; }; @@ -70,12 +51,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["nu"]; + }); + }; }) ]); } From bba6db1fd4e578b6e7a59def9d3c0ed0f129afd0 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 18:18:42 +0200 Subject: [PATCH 067/130] languages/nix: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/nix.nix | 35 ++++++++++--------------------- 1 file changed, 11 insertions(+), 24 deletions(-) diff --git a/modules/plugins/languages/nix.nix b/modules/plugins/languages/nix.nix index 29185b12..eac9264e 100644 --- a/modules/plugins/languages/nix.nix +++ b/modules/plugins/languages/nix.nix @@ -5,32 +5,18 @@ ... }: let inherit (builtins) attrNames; - inherit (lib) concatStringsSep; + inherit (lib) concatStringsSep genAttrs; inherit (lib.meta) getExe; inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) enum; + inherit (lib.types) enum listOf; inherit (lib.nvim.types) mkGrammarOption diagnostics deprecatedSingleOrListOf; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.nix; defaultServers = ["nil"]; - servers = { - nil = { - enable = true; - cmd = [(getExe pkgs.nil)]; - filetypes = ["nix"]; - root_markers = [".git" "flake.nix"]; - }; - - nixd = { - enable = true; - cmd = [(getExe pkgs.nixd)]; - filetypes = ["nix"]; - root_markers = [".git" "flake.nix"]; - }; - }; + servers = ["nil" "nixd"]; defaultFormat = ["alejandra"]; formats = { @@ -91,7 +77,7 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = deprecatedSingleOrListOf "vim.language.nix.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "Nix LSP server to use"; }; @@ -147,12 +133,13 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["nix"]; + root_markers = ["flake.nix"]; + }); + }; }) (mkIf cfg.format.enable { From c091ae1cbb5abacc7b869a6e0f35ff301d147fd4 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 18:20:07 +0200 Subject: [PATCH 068/130] languages/nim: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/nim.nix | 40 ++++++++----------------------- 1 file changed, 10 insertions(+), 30 deletions(-) diff --git a/modules/plugins/languages/nim.nix b/modules/plugins/languages/nim.nix index 97bcdd9d..18fb4914 100644 --- a/modules/plugins/languages/nim.nix +++ b/modules/plugins/languages/nim.nix @@ -6,36 +6,16 @@ }: let inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption literalExpression; - inherit (lib.meta) getExe'; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) enum; + inherit (lib.types) enum listOf; + inherit (lib) genAttrs; inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; - inherit (lib.generators) mkLuaInline; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.nim; defaultServers = ["nimlsp"]; - servers = { - nimlsp = { - enable = true; - cmd = [(getExe' pkgs.nimlsp "nimlsp")]; - filetypes = ["nim"]; - root_dir = - mkLuaInline - /* - lua - */ - '' - function(bufnr, on_dir) - local fname = vim.api.nvim_buf_get_name(bufnr) - on_dir( - util.root_pattern '*.nimble'(fname) or vim.fs.dirname(vim.fs.find('.git', { path = fname, upward = true })[1]) - ) - end - ''; - }; - }; + servers = ["nimlsp"]; defaultFormat = ["nimpretty"]; formats = { @@ -66,7 +46,7 @@ in { }; servers = mkOption { - type = deprecatedSingleOrListOf "vim.language.nim.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "Nim LSP server to use"; }; @@ -103,12 +83,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["nim"]; + }); + }; }) (mkIf cfg.format.enable { From 37f81afb1efa9fa6f8ca4a4c2735be0186177319 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 23:13:24 +0200 Subject: [PATCH 069/130] lsp/presets/marksman: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/marksman.nix | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 modules/plugins/lsp/presets/marksman.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 4b64e67b..64ee7ba5 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -5,6 +5,7 @@ ./harper.nix ./intelephense.nix ./lemminx.nix + ./marksman.nix ./nil.nix ./nimlsp.nix ./nixd.nix diff --git a/modules/plugins/lsp/presets/marksman.nix b/modules/plugins/lsp/presets/marksman.nix new file mode 100644 index 00000000..5bc296dc --- /dev/null +++ b/modules/plugins/lsp/presets/marksman.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.marksman; +in { + options.vim.lsp.presets.marksman = { + enable = mkEnableOption "the Marksman Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.marksman = { + enable = true; + cmd = [(getExe pkgs.marksman) "server"]; + root_markers = [".git" ".marksman.toml"]; + }; + }; +} From b9c3338d016fa7c290fed85cf66324ad3703ef1d Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 23:15:12 +0200 Subject: [PATCH 070/130] lsp/presets/markdown-oxide: init --- modules/plugins/lsp/presets/default.nix | 1 + .../plugins/lsp/presets/markdown-oxide.nix | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 modules/plugins/lsp/presets/markdown-oxide.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 64ee7ba5..69403523 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -5,6 +5,7 @@ ./harper.nix ./intelephense.nix ./lemminx.nix + ./markdown-oxide.nix ./marksman.nix ./nil.nix ./nimlsp.nix diff --git a/modules/plugins/lsp/presets/markdown-oxide.nix b/modules/plugins/lsp/presets/markdown-oxide.nix new file mode 100644 index 00000000..96af3cda --- /dev/null +++ b/modules/plugins/lsp/presets/markdown-oxide.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.markdown-oxide; +in { + options.vim.lsp.presets.markdown-oxide = { + enable = mkEnableOption "the Markdown-Oxide Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.markdown-oxide = { + enable = true; + cmd = [(getExe pkgs.markdown-oxide)]; + root_markers = [".git" ".moxide.toml" ".obsidian"]; + }; + }; +} From 417336cc5be6293fa07577993810b201ff2de239 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 23:16:31 +0200 Subject: [PATCH 071/130] lsp/presets/rumdl: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/rumdl.nix | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 modules/plugins/lsp/presets/rumdl.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 69403523..b035d5f5 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -23,6 +23,7 @@ ./r-languageserver.nix ./ruby-lsp.nix ./ruff.nix + ./rumdl.nix ./solargraph.nix ./sqls.nix ./svelte-language-server.nix diff --git a/modules/plugins/lsp/presets/rumdl.nix b/modules/plugins/lsp/presets/rumdl.nix new file mode 100644 index 00000000..c616cd94 --- /dev/null +++ b/modules/plugins/lsp/presets/rumdl.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.rumdl; +in { + options.vim.lsp.presets.rumdl = { + enable = mkEnableOption "the Rumdl Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.rumdl = { + enable = true; + cmd = [(getExe pkgs.rumdl) "server"]; + root_markers = [".git" ".rumdl.toml" "rumdl.toml" ".config/rumdl.toml" "pyproject.toml"]; + }; + }; +} From 95bc599f75df13a1448f68454c3e89579d3b3ba2 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 23:22:12 +0200 Subject: [PATCH 072/130] languages/markdown: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/markdown.nix | 38 ++++++-------------------- 1 file changed, 9 insertions(+), 29 deletions(-) diff --git a/modules/plugins/languages/markdown.nix b/modules/plugins/languages/markdown.nix index 33078e6d..71773c8a 100644 --- a/modules/plugins/languages/markdown.nix +++ b/modules/plugins/languages/markdown.nix @@ -5,6 +5,7 @@ ... }: let inherit (builtins) attrNames; + inherit (lib) genAttrs; inherit (lib.meta) getExe getExe'; inherit (lib.modules) mkIf mkMerge; inherit (lib.options) literalExpression mkEnableOption mkOption; @@ -17,28 +18,7 @@ cfg = config.vim.languages.markdown; defaultServers = ["marksman"]; - servers = { - marksman = { - enable = true; - cmd = [(getExe pkgs.marksman) "server"]; - filetypes = ["markdown" "mdx"]; - root_markers = [".marksman.toml" ".git"]; - }; - - markdown-oxide = { - enable = true; - cmd = [(getExe pkgs.markdown-oxide)]; - filetypes = ["markdown"]; - root_markers = [".git" ".obsidian" ".moxide.toml"]; - }; - - rumdl = { - enable = true; - cmd = [(getExe pkgs.rumdl) "server"]; - filetypes = ["markdown"]; - root_markers = [".git" ".rumdl.toml" "rumdl.toml" ".config/rumdl.toml" "pyproject.toml"]; - }; - }; + servers = ["marksman" "markdown-oxide" "rumdl"]; defaultFormat = ["deno_fmt"]; formats = { @@ -99,7 +79,7 @@ in { servers = mkOption { description = "Markdown LSP server to use"; - type = deprecatedSingleOrListOf "vim.language.markdown.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; }; }; @@ -186,12 +166,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["markdown" "mdx"]; + }); + }; }) (mkIf cfg.format.enable { From 041c8b83bea921360d7a2e30a259d0c887bea3fe Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 23:25:07 +0200 Subject: [PATCH 073/130] lsp/presets/lua-language-server: init --- modules/plugins/lsp/presets/default.nix | 1 + .../lsp/presets/lua-language-server.nix | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 modules/plugins/lsp/presets/lua-language-server.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index b035d5f5..c490c10a 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -5,6 +5,7 @@ ./harper.nix ./intelephense.nix ./lemminx.nix + ./lua-language-server.nix ./markdown-oxide.nix ./marksman.nix ./nil.nix diff --git a/modules/plugins/lsp/presets/lua-language-server.nix b/modules/plugins/lsp/presets/lua-language-server.nix new file mode 100644 index 00000000..5c89ad26 --- /dev/null +++ b/modules/plugins/lsp/presets/lua-language-server.nix @@ -0,0 +1,33 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.lua-language-server; +in { + options.vim.lsp.presets.lua-language-server = { + enable = mkEnableOption "the Lua Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.lua-language-server = { + enable = true; + cmd = [(getExe pkgs.lua-language-server)]; + root_markers = [ + ".luarc.json" + ".luarc.jsonc" + ".luacheckrc" + ".stylua.toml" + "stylua.toml" + "selene.toml" + "selene.yml" + ".git" + ]; + }; + }; +} From 32cf03986b0b6b49504ee2b18fecb7c8082e4eb7 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 23:29:29 +0200 Subject: [PATCH 074/130] lsp/presets/kotlin-language-server: init --- modules/plugins/lsp/presets/default.nix | 1 + .../lsp/presets/kotlin-language-server.nix | 46 +++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 modules/plugins/lsp/presets/kotlin-language-server.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index c490c10a..9f96e477 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -4,6 +4,7 @@ ./deno.nix ./harper.nix ./intelephense.nix + ./kotlin-language-server.nix ./lemminx.nix ./lua-language-server.nix ./markdown-oxide.nix diff --git a/modules/plugins/lsp/presets/kotlin-language-server.nix b/modules/plugins/lsp/presets/kotlin-language-server.nix new file mode 100644 index 00000000..9d71f316 --- /dev/null +++ b/modules/plugins/lsp/presets/kotlin-language-server.nix @@ -0,0 +1,46 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + inherit (lib.generators) mkLuaInline; + + cfg = config.vim.lsp.presets.kotlin-language-server; +in { + options.vim.lsp.presets.kotlin-language-server = { + enable = mkEnableOption "the Kotlin Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.kotlin-language-server = { + enable = true; + cmd = [(getExe pkgs.kotlin-language-server)]; + root_markers = [ + "settings.gradle" # Gradle (multi-project) + "settings.gradle.kts" # Gradle (multi-project) + "build.xml" # Ant + "pom.xml" # Maven + "build.gradle" # Gradle + "build.gradle.kts" # gradle + ]; + init_options = { + storagePath = mkLuaInline '' + vim.fs.root(vim.fn.expand '%:p:h', + { + 'settings.gradle', -- Gradle (multi-project) + 'settings.gradle.kts', -- Gradle (multi-project) + 'build.xml', -- Ant + 'pom.xml', -- Maven + 'build.gradle', -- Gradle + 'build.gradle.kts', -- Gradle + } + ) + ''; + }; + }; + }; +} From 57d50b56387ad7388fe4552bc5c87b7f1f83778f Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 23:35:56 +0200 Subject: [PATCH 075/130] lsp/presets/just-lsp: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/just-lsp.nix | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 modules/plugins/lsp/presets/just-lsp.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 9f96e477..eeadd363 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -4,6 +4,7 @@ ./deno.nix ./harper.nix ./intelephense.nix + ./just-lsp.nix ./kotlin-language-server.nix ./lemminx.nix ./lua-language-server.nix diff --git a/modules/plugins/lsp/presets/just-lsp.nix b/modules/plugins/lsp/presets/just-lsp.nix new file mode 100644 index 00000000..509c22d9 --- /dev/null +++ b/modules/plugins/lsp/presets/just-lsp.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.just-lsp; +in { + options.vim.lsp.presets.just-lsp = { + enable = mkEnableOption "the Just Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.just-lsp = { + enable = true; + cmd = [(getExe pkgs.just-lsp)]; + root_markers = [".git" "Justfile" "justfile"]; + }; + }; +} From 486866f1a1d746bf2766baec2c6980ee54e3bcf3 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 23:40:04 +0200 Subject: [PATCH 076/130] lsp/presets/julia-languageserver: init --- modules/plugins/lsp/presets/default.nix | 1 + .../lsp/presets/julia-languageserver.nix | 129 ++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 modules/plugins/lsp/presets/julia-languageserver.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index eeadd363..e629153b 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -4,6 +4,7 @@ ./deno.nix ./harper.nix ./intelephense.nix + ./julia-languageserver.nix ./just-lsp.nix ./kotlin-language-server.nix ./lemminx.nix diff --git a/modules/plugins/lsp/presets/julia-languageserver.nix b/modules/plugins/lsp/presets/julia-languageserver.nix new file mode 100644 index 00000000..0fcd7440 --- /dev/null +++ b/modules/plugins/lsp/presets/julia-languageserver.nix @@ -0,0 +1,129 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + inherit (lib.generators) mkLuaInline; + inherit (lib.nvim.dag) entryBefore; + + cfg = config.vim.lsp.presets.julia-languageserver; +in { + options.vim.lsp.presets.julia-languageserver = { + enable = mkEnableOption "the Julia Language Server"; + }; + + config = mkIf cfg.enable { + vim = { + lsp.servers.julia-languageserver = { + enable = true; + root_markers = ["Project.toml" "JuliaProject.toml"]; + cmd = mkLuaInline '' + { + '${getExe (pkgs.julia.withPackages ["LanguageServer"])}', + '--startup-file=no', + '--history-file=no', + '-e', + [[ + # Load LanguageServer.jl: attempt to load from ~/.julia/environments/nvim-lspconfig + # with the regular load path as a fallback + ls_install_path = joinpath( + get(DEPOT_PATH, 1, joinpath(homedir(), ".julia")), + "environments", "nvim-lspconfig" + ) + pushfirst!(LOAD_PATH, ls_install_path) + using LanguageServer + popfirst!(LOAD_PATH) + depot_path = get(ENV, "JULIA_DEPOT_PATH", "") + project_path = let + dirname(something( + ## 1. Finds an explicitly set project (JULIA_PROJECT) + Base.load_path_expand(( + p = get(ENV, "JULIA_PROJECT", nothing); + p === nothing ? nothing : isempty(p) ? nothing : p + )), + ## 2. Look for a Project.toml file in the current working directory, + ## or parent directories, with $HOME as an upper boundary + Base.current_project(), + ## 3. First entry in the load path + get(Base.load_path(), 1, nothing), + ## 4. Fallback to default global environment, + ## this is more or less unreachable + Base.load_path_expand("@v#.#"), + )) + end + @info "Running language server" VERSION pwd() project_path depot_path + server = LanguageServer.LanguageServerInstance(stdin, stdout, project_path, depot_path) + server.runlinter = true + run(server) + ]], + } + ''; + on_attach = mkLuaInline '' + function(_, bufnr) + vim.api.nvim_buf_create_user_command(bufnr, 'LspJuliaActivateEnv', activate_julia_env, { + desc = 'Activate a Julia environment', + nargs = '?', + complete = 'file', + }) + end + ''; + }; + luaConfigRC.julia-util = entryBefore ["lsp-servers"] '' + local function activate_julia_env(path) + assert(vim.fn.has 'nvim-0.10' == 1, 'requires Nvim 0.10 or newer') + local bufnr = vim.api.nvim_get_current_buf() + local julials_clients = vim.lsp.get_clients { bufnr = bufnr, name = 'julials' } + assert( + #julials_clients > 0, + 'method julia/activateenvironment is not supported by any servers active on the current buffer' + ) + local function _activate_env(environment) + if environment then + for _, julials_client in ipairs(julials_clients) do + julials_client:notify('julia/activateenvironment', { envPath = environment }) + end + vim.notify('Julia environment activated: \n`' .. environment .. '`', vim.log.levels.INFO) + end + end + if path then + path = vim.fs.normalize(vim.fn.fnamemodify(vim.fn.expand(path), ':p')) + local found_env = false + for _, project_file in ipairs(root_files) do + local file = vim.uv.fs_stat(vim.fs.joinpath(path, project_file)) + if file and file.type then + found_env = true + break + end + end + if not found_env then + vim.notify('Path is not a julia environment: \n`' .. path .. '`', vim.log.levels.WARN) + return + end + _activate_env(path) + else + local depot_paths = vim.env.JULIA_DEPOT_PATH + and vim.split(vim.env.JULIA_DEPOT_PATH, vim.fn.has 'win32' == 1 and ';' or ':') + or { vim.fn.expand '~/.julia' } + local environments = {} + vim.list_extend(environments, vim.fs.find(root_files, { type = 'file', upward = true, limit = math.huge })) + for _, depot_path in ipairs(depot_paths) do + local depot_env = vim.fs.joinpath(vim.fs.normalize(depot_path), 'environments') + vim.list_extend( + environments, + vim.fs.find(function(name, env_path) + return vim.tbl_contains(root_files, name) and string.sub(env_path, #depot_env + 1):match '^/[^/]*$' + end, { path = depot_env, type = 'file', limit = math.huge }) + ) + end + environments = vim.tbl_map(vim.fs.dirname, environments) + vim.ui.select(environments, { prompt = 'Select a Julia environment' }, _activate_env) + end + end + ''; + }; + }; +} From cef2e990185459a45f6dbf91fc5604889f19fbef Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 23:41:53 +0200 Subject: [PATCH 077/130] languages/lua: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/lua.nix | 33 +++++++++---------------------- 1 file changed, 9 insertions(+), 24 deletions(-) diff --git a/modules/plugins/languages/lua.nix b/modules/plugins/languages/lua.nix index 52d32d6f..aeee8bec 100644 --- a/modules/plugins/languages/lua.nix +++ b/modules/plugins/languages/lua.nix @@ -8,6 +8,7 @@ inherit (lib.options) literalExpression mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; inherit (lib.meta) getExe; + inherit (lib) genAttrs; inherit (lib.types) bool enum listOf; inherit (lib.nvim.types) diagnostics mkGrammarOption; inherit (lib.nvim.dag) entryBefore; @@ -16,23 +17,7 @@ cfg = config.vim.languages.lua; defaultServers = ["lua-language-server"]; - servers = { - lua-language-server = { - enable = true; - cmd = [(getExe pkgs.lua-language-server)]; - filetypes = ["lua"]; - root_markers = [ - ".luarc.json" - ".luarc.jsonc" - ".luacheckrc" - ".stylua.toml" - "stylua.toml" - "selene.toml" - "selene.yml" - ".git" - ]; - }; - }; + servers = ["lua-language-server"]; defaultFormat = ["stylua"]; formats = { @@ -77,7 +62,7 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "Lua LSP server to use"; }; @@ -122,12 +107,12 @@ in { (mkIf cfg.enable (mkMerge [ (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["lsp"]; + }); + }; }) (mkIf cfg.lsp.lazydev.enable { From e4be1e6f0fbd4c89e3d95f1db8b249ee72eea5f0 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 23:43:22 +0200 Subject: [PATCH 078/130] languages/kotlin: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/kotlin.nix | 48 ++++++---------------------- 1 file changed, 10 insertions(+), 38 deletions(-) diff --git a/modules/plugins/languages/kotlin.nix b/modules/plugins/languages/kotlin.nix index 63cbe428..27b9a14b 100644 --- a/modules/plugins/languages/kotlin.nix +++ b/modules/plugins/languages/kotlin.nix @@ -6,44 +6,16 @@ }: let inherit (lib.options) literalExpression mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; - inherit (lib.meta) getExe' getExe; - inherit (builtins) attrNames; + inherit (lib.meta) getExe; + inherit (lib) genAttrs; inherit (lib.types) enum listOf; inherit (lib.nvim.types) mkGrammarOption diagnostics; - inherit (lib.generators) mkLuaInline; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.kotlin; defaultServers = ["kotlin-language-server"]; - servers = { - kotlin-language-server = { - enable = true; - cmd = [(getExe' pkgs.kotlin-language-server "kotlin-language-server")]; - filetypes = ["kotlin"]; - root_markers = [ - "settings.gradle" # Gradle (multi-project) - "settings.gradle.kts" # Gradle (multi-project) - "build.xml" # Ant - "pom.xml" # Maven - "build.gradle" # Gradle - "build.gradle.kts" # gradle - ]; - init_options = { - storagePath = mkLuaInline " - vim.fs.root(vim.fn.expand '%:p:h', - { - 'settings.gradle', -- Gradle (multi-project) - 'settings.gradle.kts', -- Gradle (multi-project) - 'build.xml', -- Ant - 'pom.xml', -- Maven - 'build.gradle', -- Gradle - 'build.gradle.kts', -- Gradle - } - )"; - }; - }; - }; + servers = ["kotlin-language-server"]; defaultDiagnosticsProvider = ["ktlint"]; diagnosticsProviders = { @@ -73,7 +45,7 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "Kotlin LSP server to use"; }; @@ -112,12 +84,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["kotlin"]; + }); + }; }) ]); } From ba968b7385483665d2c9398d536ed5002cf764e3 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 23:44:30 +0200 Subject: [PATCH 079/130] languages/just: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/just.nix | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/modules/plugins/languages/just.nix b/modules/plugins/languages/just.nix index 210941bd..2570da76 100644 --- a/modules/plugins/languages/just.nix +++ b/modules/plugins/languages/just.nix @@ -4,25 +4,16 @@ pkgs, ... }: let - inherit (builtins) attrNames; 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.attrsets) mapListToAttrs; inherit (lib.nvim.types) mkGrammarOption; cfg = config.vim.languages.just; defaultServers = ["just-lsp"]; - servers = { - just-lsp = { - enable = true; - cmd = [(getExe pkgs.just-lsp)]; - filetypes = ["just"]; - root_markers = [".git" "justfile"]; - }; - }; + servers = ["just-lsp"]; in { options.vim.languages.just = { enable = mkEnableOption "Just support"; @@ -45,7 +36,7 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "Just LSP server to use"; }; @@ -61,12 +52,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["just"]; + }); + }; }) ]); } From fb8816e67f1611223109b9ec4c92e21b1444d11b Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sat, 11 Apr 2026 23:47:18 +0200 Subject: [PATCH 080/130] languages/julia: refactor lsp.servers to use lsp/presets/ --- docs/manual/release-notes/rl-0.9.md | 2 + modules/plugins/languages/julia.nix | 156 +++------------------------- 2 files changed, 17 insertions(+), 141 deletions(-) diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index 572dea25..a524b2f1 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -85,6 +85,8 @@ - Renamed `r_language_server` to `r-languageserver`. +- Renamed `julials` to `julia-languageserver`. + - Removed `languages.tailwind` which only provided an LSP. Use `lsp.presets.tailwindcss-language-server` instead. diff --git a/modules/plugins/languages/julia.nix b/modules/plugins/languages/julia.nix index 7d5785c9..d77fc168 100644 --- a/modules/plugins/languages/julia.nix +++ b/modules/plugins/languages/julia.nix @@ -4,86 +4,16 @@ config, ... }: let - inherit (builtins) attrNames; inherit (lib.options) literalExpression mkEnableOption mkOption; - inherit (lib.types) enum; + inherit (lib.types) enum listOf; inherit (lib.modules) mkIf mkMerge; - inherit (lib.meta) getExe; - inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; - inherit (lib.generators) mkLuaInline; - inherit (lib.nvim.attrsets) mapListToAttrs; - inherit (lib.nvim.dag) entryBefore; - - defaultServers = ["julials"]; - servers = { - julials = { - enable = true; - cmd = - mkLuaInline - /* - lua - */ - '' - { - '${getExe (pkgs.julia.withPackages ["LanguageServer"])}', - '--startup-file=no', - '--history-file=no', - '-e', - [[ - # Load LanguageServer.jl: attempt to load from ~/.julia/environments/nvim-lspconfig - # with the regular load path as a fallback - ls_install_path = joinpath( - get(DEPOT_PATH, 1, joinpath(homedir(), ".julia")), - "environments", "nvim-lspconfig" - ) - pushfirst!(LOAD_PATH, ls_install_path) - using LanguageServer - popfirst!(LOAD_PATH) - depot_path = get(ENV, "JULIA_DEPOT_PATH", "") - project_path = let - dirname(something( - ## 1. Finds an explicitly set project (JULIA_PROJECT) - Base.load_path_expand(( - p = get(ENV, "JULIA_PROJECT", nothing); - p === nothing ? nothing : isempty(p) ? nothing : p - )), - ## 2. Look for a Project.toml file in the current working directory, - ## or parent directories, with $HOME as an upper boundary - Base.current_project(), - ## 3. First entry in the load path - get(Base.load_path(), 1, nothing), - ## 4. Fallback to default global environment, - ## this is more or less unreachable - Base.load_path_expand("@v#.#"), - )) - end - @info "Running language server" VERSION pwd() project_path depot_path - server = LanguageServer.LanguageServerInstance(stdin, stdout, project_path, depot_path) - server.runlinter = true - run(server) - ]], - } - ''; - filetypes = ["julia"]; - root_markers = ["Project.toml" "JuliaProject.toml"]; - on_attach = - mkLuaInline - /* - lua - */ - '' - function(_, bufnr) - vim.api.nvim_buf_create_user_command(bufnr, 'LspJuliaActivateEnv', activate_julia_env, { - desc = 'Activate a Julia environment', - nargs = '?', - complete = 'file', - }) - end - ''; - }; - }; + inherit (lib) genAttrs; + inherit (lib.nvim.types) mkGrammarOption; cfg = config.vim.languages.julia; + + defaultServers = ["julia-languageserver"]; + servers = ["julia-languageserver"]; in { options = { vim.languages.julia = { @@ -107,7 +37,7 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = deprecatedSingleOrListOf "vim.language.julia.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = '' Julia LSP Server to Use @@ -136,70 +66,14 @@ in { }) (mkIf cfg.lsp.enable { - vim.luaConfigRC.julia-util = - entryBefore ["lsp-servers"] - /* - lua - */ - '' - local function activate_julia_env(path) - assert(vim.fn.has 'nvim-0.10' == 1, 'requires Nvim 0.10 or newer') - local bufnr = vim.api.nvim_get_current_buf() - local julials_clients = vim.lsp.get_clients { bufnr = bufnr, name = 'julials' } - assert( - #julials_clients > 0, - 'method julia/activateenvironment is not supported by any servers active on the current buffer' - ) - local function _activate_env(environment) - if environment then - for _, julials_client in ipairs(julials_clients) do - julials_client:notify('julia/activateenvironment', { envPath = environment }) - end - vim.notify('Julia environment activated: \n`' .. environment .. '`', vim.log.levels.INFO) - end - end - if path then - path = vim.fs.normalize(vim.fn.fnamemodify(vim.fn.expand(path), ':p')) - local found_env = false - for _, project_file in ipairs(root_files) do - local file = vim.uv.fs_stat(vim.fs.joinpath(path, project_file)) - if file and file.type then - found_env = true - break - end - end - if not found_env then - vim.notify('Path is not a julia environment: \n`' .. path .. '`', vim.log.levels.WARN) - return - end - _activate_env(path) - else - local depot_paths = vim.env.JULIA_DEPOT_PATH - and vim.split(vim.env.JULIA_DEPOT_PATH, vim.fn.has 'win32' == 1 and ';' or ':') - or { vim.fn.expand '~/.julia' } - local environments = {} - vim.list_extend(environments, vim.fs.find(root_files, { type = 'file', upward = true, limit = math.huge })) - for _, depot_path in ipairs(depot_paths) do - local depot_env = vim.fs.joinpath(vim.fs.normalize(depot_path), 'environments') - vim.list_extend( - environments, - vim.fs.find(function(name, env_path) - return vim.tbl_contains(root_files, name) and string.sub(env_path, #depot_env + 1):match '^/[^/]*$' - end, { path = depot_env, type = 'file', limit = math.huge }) - ) - end - environments = vim.tbl_map(vim.fs.dirname, environments) - vim.ui.select(environments, { prompt = 'Select a Julia environment' }, _activate_env) - end - end - ''; - - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim = { + lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["julia"]; + }); + }; + }; }) ]); } From df3f01d0c46ce5e77b092d5d78b8715c321a0058 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 00:13:25 +0200 Subject: [PATCH 081/130] lsp/presets/arduino-language-server: init --- .../lsp/presets/arduino-language-server.nix | 46 +++++++++++++++++++ modules/plugins/lsp/presets/default.nix | 1 + 2 files changed, 47 insertions(+) create mode 100644 modules/plugins/lsp/presets/arduino-language-server.nix diff --git a/modules/plugins/lsp/presets/arduino-language-server.nix b/modules/plugins/lsp/presets/arduino-language-server.nix new file mode 100644 index 00000000..0280f215 --- /dev/null +++ b/modules/plugins/lsp/presets/arduino-language-server.nix @@ -0,0 +1,46 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe getExe'; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + inherit (lib.generators) mkLuaInline; + + cfg = config.vim.lsp.presets.arduino-language-server; +in { + options.vim.lsp.presets.arduino-language-server = { + enable = mkEnableOption "the Arduino Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.arduino-language-server = { + enable = true; + cmd = [ + (getExe pkgs.arduino-language-server) + "-clangd" + (getExe' pkgs.clang-tools "clangd") + "-cli" + (getExe pkgs.arduino-cli) + "-cli-config" + "$HOME/.arduino15/arduino-cli.yaml" + ]; + root_dir = mkLuaInline '' + function(bufnr, on_dir) + local fname = vim.api.nvim_buf_get_name(bufnr) + on_dir(util.root_pattern("*.ino")(fname)) + end + ''; + capabilities = { + textDocument = { + semanticTokens = mkLuaInline "vim.NIL"; + }; + workspace = { + semanticTokens = mkLuaInline "vim.NIL"; + }; + }; + }; + }; +} diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index e629153b..530367c5 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -1,5 +1,6 @@ { imports = [ + ./arduino-language-server.nix ./basedpyright.nix ./deno.nix ./harper.nix From 9ac800a85a5b14814b2ea27515d9066efc917f4f Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 00:14:48 +0200 Subject: [PATCH 082/130] lsp/presets/asm-lsp: init --- modules/plugins/lsp/presets/asm-lsp.nix | 24 ++++++++++++++++++++++++ modules/plugins/lsp/presets/default.nix | 1 + 2 files changed, 25 insertions(+) create mode 100644 modules/plugins/lsp/presets/asm-lsp.nix diff --git a/modules/plugins/lsp/presets/asm-lsp.nix b/modules/plugins/lsp/presets/asm-lsp.nix new file mode 100644 index 00000000..87e0a268 --- /dev/null +++ b/modules/plugins/lsp/presets/asm-lsp.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.asm-lsp; +in { + options.vim.lsp.presets.asm-lsp = { + enable = mkEnableOption "the Assembly Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.asm-lsp = { + enable = true; + cmd = [(getExe pkgs.asm-lsp)]; + root_markers = [".git" ".asm-lsp.toml"]; + }; + }; +} diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 530367c5..01675574 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -1,6 +1,7 @@ { imports = [ ./arduino-language-server.nix + ./asm-lsp.nix ./basedpyright.nix ./deno.nix ./harper.nix From c7e1dedcdbd621dd475d9610377a4c5c8414bf56 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 00:17:07 +0200 Subject: [PATCH 083/130] lsp/presets/astro-language-server: init --- .../lsp/presets/astro-language-server.nix | 35 +++++++++++++++++++ modules/plugins/lsp/presets/default.nix | 1 + 2 files changed, 36 insertions(+) create mode 100644 modules/plugins/lsp/presets/astro-language-server.nix diff --git a/modules/plugins/lsp/presets/astro-language-server.nix b/modules/plugins/lsp/presets/astro-language-server.nix new file mode 100644 index 00000000..8dbd9f35 --- /dev/null +++ b/modules/plugins/lsp/presets/astro-language-server.nix @@ -0,0 +1,35 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + inherit (lib.generators) mkLuaInline; + + cfg = config.vim.lsp.presets.astro-language-server; +in { + options.vim.lsp.presets.astro-language-server = { + enable = mkEnableOption "the Astro Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.astro-language-server = { + enable = true; + cmd = [(getExe pkgs.astro-language-server) "--stdio"]; + root_markers = [".git" "package.json" "tsconfig.json" "jsconfig.json"]; + init_options = { + typescript = {}; + }; + before_init = mkLuaInline '' + function(_, config) + if config.init_options and config.init_options.typescript and not config.init_options.typescript.tsdk then + config.init_options.typescript.tsdk = util.get_typescript_server_path(config.root_dir) + end + end + ''; + }; + }; +} diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 01675574..0193a429 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -2,6 +2,7 @@ imports = [ ./arduino-language-server.nix ./asm-lsp.nix + ./astro-language-server.nix ./basedpyright.nix ./deno.nix ./harper.nix From 98f77c31d55685ae88d267910eb8ca7cba1210e6 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 00:18:54 +0200 Subject: [PATCH 084/130] lsp/presets/bash-language-server: init --- .../lsp/presets/bash-language-server.nix | 30 +++++++++++++++++++ modules/plugins/lsp/presets/default.nix | 1 + 2 files changed, 31 insertions(+) create mode 100644 modules/plugins/lsp/presets/bash-language-server.nix diff --git a/modules/plugins/lsp/presets/bash-language-server.nix b/modules/plugins/lsp/presets/bash-language-server.nix new file mode 100644 index 00000000..047e726d --- /dev/null +++ b/modules/plugins/lsp/presets/bash-language-server.nix @@ -0,0 +1,30 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + inherit (lib.generators) mkLuaInline; + + cfg = config.vim.lsp.presets.bash-language-server; +in { + options.vim.lsp.presets.bash-language-server = { + enable = mkEnableOption "the Bash Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.bash-language-server = { + enable = true; + cmd = [(getExe pkgs.bash-language-server) "start"]; + root_markers = [".git"]; + settings = { + basheIde = { + globPattern = mkLuaInline "vim.env.GLOB_PATTERN or '*@(.sh|.inc|.bash|.command)'"; + }; + }; + }; + }; +} diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 0193a429..b5a7036f 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -3,6 +3,7 @@ ./arduino-language-server.nix ./asm-lsp.nix ./astro-language-server.nix + ./bash-language-server.nix ./basedpyright.nix ./deno.nix ./harper.nix From d5ff92aee7c5fac301c72670580f50a4f32db4cb Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 00:20:26 +0200 Subject: [PATCH 085/130] languages/arduino: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/arduino.nix | 56 +++++---------------------- 1 file changed, 9 insertions(+), 47 deletions(-) diff --git a/modules/plugins/languages/arduino.nix b/modules/plugins/languages/arduino.nix index 89f9e051..f3c300f0 100644 --- a/modules/plugins/languages/arduino.nix +++ b/modules/plugins/languages/arduino.nix @@ -4,54 +4,16 @@ lib, ... }: let - inherit (builtins) attrNames; - inherit (lib.generators) mkLuaInline; - inherit (lib.meta) getExe getExe'; + inherit (lib) genAttrs; inherit (lib.modules) mkIf mkMerge; inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.types) enum listOf str; - inherit (lib.nvim.attrsets) mapListToAttrs; inherit (lib.nvim.types) mkGrammarOption; cfg = config.vim.languages.arduino; defaultServers = ["arduino-language-server"]; - servers = { - arduino-language-server = { - enable = true; - cmd = - [ - (getExe pkgs.arduino-language-server) - "-clangd" - (getExe' pkgs.clang-tools "clangd") - "-cli" - (getExe pkgs.arduino-cli) - "-cli-config" - "$HOME/.arduino15/arduino-cli.yaml" - ] - ++ cfg.lsp.extraArgs; - filetypes = ["arduino"]; - root_dir = - mkLuaInline - /* - lua - */ - '' - function(bufnr, on_dir) - local fname = vim.api.nvim_buf_get_name(bufnr) - on_dir(util.root_pattern("*.ino")(fname)) - end - ''; - capabilities = { - textDocument = { - semanticTokens = mkLuaInline "vim.NIL"; - }; - workspace = { - semanticTokens = mkLuaInline "vim.NIL"; - }; - }; - }; - }; + servers = ["arduino-language-server"]; in { options.vim.languages.arduino = { enable = mkEnableOption "Arduino support"; @@ -74,7 +36,7 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "Arduino LSP servers to use"; }; @@ -94,12 +56,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["arduino"]; + }); + }; }) ]); } From 700ddae60c4d8e422a560e356a01bac445e0e67d Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 00:21:40 +0200 Subject: [PATCH 086/130] languages/asm: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/asm.nix | 31 +++++++++++-------------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/modules/plugins/languages/asm.nix b/modules/plugins/languages/asm.nix index f1831401..41b9f4bd 100644 --- a/modules/plugins/languages/asm.nix +++ b/modules/plugins/languages/asm.nix @@ -4,24 +4,15 @@ lib, ... }: let - inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) enum; - inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; - inherit (lib.meta) getExe; - inherit (lib.nvim.attrsets) mapListToAttrs; + inherit (lib.types) enum listOf; + inherit (lib) genAttrs; + inherit (lib.nvim.types) mkGrammarOption; cfg = config.vim.languages.assembly; defaultServers = ["asm-lsp"]; - servers = { - asm-lsp = { - enable = true; - cmd = [(getExe pkgs.asm-lsp)]; - filetypes = ["asm" "nasm" "masm" "vmasm" "fasm" "tasm" "tiasm" "asm68k" "asm8300"]; - root_markers = [".asm-lsp.toml" ".git"]; - }; - }; + servers = ["asm-lsp"]; in { options.vim.languages.assembly = { enable = mkEnableOption "Assembly support"; @@ -46,7 +37,7 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = deprecatedSingleOrListOf "vim.language.asm.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "Assembly LSP server to use"; }; @@ -63,12 +54,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["asm" "nasm" "masm" "vmasm" "fasm" "tasm" "tiasm" "asm68k" "asm8300"]; + }); + }; }) ]); } From faa58857030cfd35f5c69d589e428f1124ab9b81 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 00:23:58 +0200 Subject: [PATCH 087/130] languages/astro: refactor lsp.servers to use lsp/presets/ --- docs/manual/release-notes/rl-0.9.md | 2 ++ modules/plugins/languages/astro.nix | 44 ++++++++--------------------- 2 files changed, 13 insertions(+), 33 deletions(-) diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index a524b2f1..afe97652 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -87,6 +87,8 @@ - Renamed `julials` to `julia-languageserver`. +- Renamed `astro` to `astro-language-server`. + - Removed `languages.tailwind` which only provided an LSP. Use `lsp.presets.tailwindcss-language-server` instead. diff --git a/modules/plugins/languages/astro.nix b/modules/plugins/languages/astro.nix index af647ad0..729e1f69 100644 --- a/modules/plugins/languages/astro.nix +++ b/modules/plugins/languages/astro.nix @@ -9,37 +9,15 @@ inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.modules) mkIf mkMerge; inherit (lib.meta) getExe; - inherit (lib.types) enum coercedTo; + inherit (lib.types) enum coercedTo listOf; inherit (lib.nvim.attrsets) mapListToAttrs; inherit (lib.nvim.types) mkGrammarOption diagnostics deprecatedSingleOrListOf; - inherit (lib.generators) mkLuaInline; + inherit (lib) genAttrs; cfg = config.vim.languages.astro; - defaultServers = ["astro"]; - servers = { - astro = { - enable = true; - cmd = [(getExe pkgs.astro-language-server) "--stdio"]; - filetypes = ["astro"]; - root_markers = ["package.json" "tsconfig.json" "jsconfig.json" ".git"]; - init_options = { - typescript = {}; - }; - before_init = - mkLuaInline - /* - lua - */ - '' - function(_, config) - if config.init_options and config.init_options.typescript and not config.init_options.typescript.tsdk then - config.init_options.typescript.tsdk = util.get_typescript_server_path(config.root_dir) - end - end - ''; - }; - }; + defaultServers = ["astro-language-server"]; + servers = ["astro-language-server"]; defaultFormat = ["prettier"]; formats = let @@ -107,7 +85,7 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = deprecatedSingleOrListOf "vim.language.astro.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "Astro LSP server to use"; }; @@ -151,12 +129,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["astro"]; + }); + }; }) (mkIf cfg.format.enable { From 288f76c79ecce5f0c8d6bc62008ff15227bcff9a Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 00:26:27 +0200 Subject: [PATCH 088/130] languages/bash: refactor lsp.servers to use lsp/presets/ --- docs/manual/release-notes/rl-0.9.md | 2 ++ modules/plugins/languages/bash.nix | 34 ++++++++++------------------- 2 files changed, 13 insertions(+), 23 deletions(-) diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index afe97652..a91328c1 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -89,6 +89,8 @@ - Renamed `astro` to `astro-language-server`. +- Renamed `bash-ls` to `bash-language-server`. + - Removed `languages.tailwind` which only provided an LSP. Use `lsp.presets.tailwindcss-language-server` instead. diff --git a/modules/plugins/languages/bash.nix b/modules/plugins/languages/bash.nix index d9d78b2b..35e9bda8 100644 --- a/modules/plugins/languages/bash.nix +++ b/modules/plugins/languages/bash.nix @@ -8,27 +8,15 @@ inherit (lib.options) mkOption mkEnableOption literalExpression; inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) enum bool; - inherit (lib.generators) mkLuaInline; + inherit (lib.types) enum bool listOf; + inherit (lib) genAttrs; inherit (lib.nvim.types) diagnostics mkGrammarOption deprecatedSingleOrListOf; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.bash; - defaultServers = ["bash-ls"]; - servers = { - bash-ls = { - enable = true; - cmd = [(getExe pkgs.bash-language-server) "start"]; - filetypes = ["bash" "sh"]; - root_markers = [".git"]; - settings = { - basheIde = { - globPattern = mkLuaInline "vim.env.GLOB_PATTERN or '*@(.sh|.inc|.bash|.command)'"; - }; - }; - }; - }; + defaultServers = ["bash-language-server"]; + servers = ["bash-language-server"]; defaultFormat = ["shfmt"]; formats = { @@ -65,7 +53,7 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = deprecatedSingleOrListOf "vim.language.bash.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "Bash LSP server to use"; }; @@ -107,12 +95,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["bash" "sh" "zsh"]; + }); + }; }) (mkIf cfg.format.enable { From 123923c9490bb679e8ab2cbbf8ee0a56aebe391b Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 00:29:06 +0200 Subject: [PATCH 089/130] lsp/presets/vscode-json-language-server: init --- modules/plugins/lsp/presets/default.nix | 3 ++- .../presets/vscode-json-language-server.nix | 25 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 modules/plugins/lsp/presets/vscode-json-language-server.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index b5a7036f..e8927e3e 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -3,8 +3,8 @@ ./arduino-language-server.nix ./asm-lsp.nix ./astro-language-server.nix - ./bash-language-server.nix ./basedpyright.nix + ./bash-language-server.nix ./deno.nix ./harper.nix ./intelephense.nix @@ -47,6 +47,7 @@ ./typescript-go.nix ./typescript-language-server.nix ./vala-language-server.nix + ./vscode-json-language-server.nix ./wgsl-analyzer.nix ./yaml-language-server.nix ./zls.nix diff --git a/modules/plugins/lsp/presets/vscode-json-language-server.nix b/modules/plugins/lsp/presets/vscode-json-language-server.nix new file mode 100644 index 00000000..bcb98291 --- /dev/null +++ b/modules/plugins/lsp/presets/vscode-json-language-server.nix @@ -0,0 +1,25 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe'; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.vscode-json-language-server; +in { + options.vim.lsp.presets.vscode-json-language-server = { + enable = mkEnableOption "the VSCode JSON Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.vscode-json-language-server = { + enable = true; + cmd = [(getExe' pkgs.vscode-langservers-extracted "vscode-json-language-server") "--stdio"]; + root_markers = [".git"]; + init_options = {provideFormatter = true;}; + }; + }; +} From 0af8457666270e091049222e62a209a4ff1733dd Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 00:31:07 +0200 Subject: [PATCH 090/130] languages/json: refactor lsp.servers to use lsp/presets/ --- docs/manual/release-notes/rl-0.9.md | 2 ++ modules/plugins/languages/json.nix | 30 ++++++++++++----------------- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index a91328c1..798bd68a 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -91,6 +91,8 @@ - Renamed `bash-ls` to `bash-language-server`. +- Renamed `jsonls` to `vscode-json-language-server`. + - Removed `languages.tailwind` which only provided an LSP. Use `lsp.presets.tailwindcss-language-server` instead. diff --git a/modules/plugins/languages/json.nix b/modules/plugins/languages/json.nix index 5e85371a..5189059c 100644 --- a/modules/plugins/languages/json.nix +++ b/modules/plugins/languages/json.nix @@ -6,23 +6,17 @@ }: let inherit (builtins) attrNames; inherit (lib.options) mkOption mkEnableOption literalExpression; - inherit (lib.meta) getExe' getExe; + inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) enum; + inherit (lib.types) enum listOf; + inherit (lib) genAttrs; inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.json; - defaultServers = ["jsonls"]; - servers = { - jsonls = { - cmd = [(getExe' pkgs.vscode-langservers-extracted "vscode-json-language-server") "--stdio"]; - filetypes = ["json" "jsonc" "json5"]; - init_options = {provideFormatter = true;}; - root_markers = [".git"]; - }; - }; + defaultServers = ["vscode-json-language-server"]; + servers = ["vscode-json-language-server"]; defaultFormat = ["jsonfmt"]; @@ -57,7 +51,7 @@ in { }; servers = mkOption { - type = deprecatedSingleOrListOf "vim.language.json.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "JSON LSP server to use"; }; @@ -89,12 +83,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (name: { - inherit name; - value = servers.${name}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["json" "jsonc" "json5"]; + }); + }; }) (mkIf cfg.format.enable { From 419e5603f6294e7a955098967224b45f5bacc042 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 00:32:48 +0200 Subject: [PATCH 091/130] lsp/presets/jq-lsp: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/jq-lsp.nix | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 modules/plugins/lsp/presets/jq-lsp.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index e8927e3e..7e016603 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -8,6 +8,7 @@ ./deno.nix ./harper.nix ./intelephense.nix + ./jq-lsp.nix ./julia-languageserver.nix ./just-lsp.nix ./kotlin-language-server.nix diff --git a/modules/plugins/lsp/presets/jq-lsp.nix b/modules/plugins/lsp/presets/jq-lsp.nix new file mode 100644 index 00000000..f886f9c6 --- /dev/null +++ b/modules/plugins/lsp/presets/jq-lsp.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.jq-lsp; +in { + options.vim.lsp.presets.jq-lsp = { + enable = mkEnableOption "the JQ Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.jq-lsp = { + enable = true; + cmd = [(getExe pkgs.jq-lsp)]; + root_markers = [".git"]; + }; + }; +} From 7a7bc5add17a200edc85520ed92980d0b0710407 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 00:34:04 +0200 Subject: [PATCH 092/130] lsp/presets/jinja-lsp: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/jinja-lsp.nix | 24 +++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 modules/plugins/lsp/presets/jinja-lsp.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 7e016603..caae9347 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -8,6 +8,7 @@ ./deno.nix ./harper.nix ./intelephense.nix + ./jinja-lsp.nix ./jq-lsp.nix ./julia-languageserver.nix ./just-lsp.nix diff --git a/modules/plugins/lsp/presets/jinja-lsp.nix b/modules/plugins/lsp/presets/jinja-lsp.nix new file mode 100644 index 00000000..5d1ce099 --- /dev/null +++ b/modules/plugins/lsp/presets/jinja-lsp.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.jinja-lsp; +in { + options.vim.lsp.presets.jinja-lsp = { + enable = mkEnableOption "the Jinja Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.jinja-lsp = { + enable = true; + cmd = [(getExe pkgs.jinja-lsp)]; + root_markers = [".git"]; + }; + }; +} From a4e58ee0436fd3cb53387ad0cd41165dfbe0bb7e Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 00:38:56 +0200 Subject: [PATCH 093/130] lsp/presets/jdt-language-server: init --- modules/plugins/lsp/presets/default.nix | 1 + .../lsp/presets/jdt-language-server.nix | 136 ++++++++++++++++++ 2 files changed, 137 insertions(+) create mode 100644 modules/plugins/lsp/presets/jdt-language-server.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index caae9347..a1d4c92a 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -8,6 +8,7 @@ ./deno.nix ./harper.nix ./intelephense.nix + ./jdt-language-server.nix ./jinja-lsp.nix ./jq-lsp.nix ./julia-languageserver.nix diff --git a/modules/plugins/lsp/presets/jdt-language-server.nix b/modules/plugins/lsp/presets/jdt-language-server.nix new file mode 100644 index 00000000..fc5e2900 --- /dev/null +++ b/modules/plugins/lsp/presets/jdt-language-server.nix @@ -0,0 +1,136 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + inherit (lib.generators) mkLuaInline; + inherit (lib.nvim.dag) entryBefore; + + cfg = config.vim.lsp.presets.jdt-language-server; +in { + options.vim.lsp.presets.jdt-language-server = { + enable = mkEnableOption "the Eclipse JDT Language Server"; + }; + + config = mkIf cfg.enable { + vim = { + lsp.servers.jdt-language-server = { + enable = true; + cmd = mkLuaInline '' + { + '${getExe pkgs.jdt-language-server}', + '-configuration', + get_jdtls_config_dir(), + '-data', + get_jdtls_workspace_dir(), + get_jdtls_jvm_args(), + } + ''; + root_markers = [ + # Multi-module projects + ".git" + "build.gradle" + "build.gradle.kts" + # Single-module projects + "build.xml" # Ant + "pom.xml" # Maven + "settings.gradle" # Gradle + "settings.gradle.kts" # Gradle + ]; + init_options = { + workspace = mkLuaInline "get_jdtls_workspace_dir()"; + jvm_args = {}; + os_config = mkLuaInline "nil"; + }; + handlers = { + "textDocument/codeAction" = mkLuaInline "jdtls_on_textdocument_codeaction"; + "textDocument/rename" = mkLuaInline "jdtls_on_textdocument_rename"; + "workspace/applyEdit" = mkLuaInline "jdtls_on_workspace_applyedit"; + "language/status" = mkLuaInline "vim.schedule_wrap(jdtls_on_language_status)"; + }; + }; + luaConfigRC.jdtls-util = entryBefore ["lsp-servers"] '' + local jdtls_handlers = require 'vim.lsp.handlers' + + local jdtls_env = { + HOME = vim.uv.os_homedir(), + XDG_CACHE_HOME = os.getenv 'XDG_CACHE_HOME', + JDTLS_JVM_ARGS = os.getenv 'JDTLS_JVM_ARGS', + } + + local function get_cache_dir() + return jdtls_env.XDG_CACHE_HOME and jdtls_env.XDG_CACHE_HOME or jdtls_env.HOME .. '/.cache' + end + + local function get_jdtls_cache_dir() + return get_cache_dir() .. '/jdtls' + end + + local function get_jdtls_config_dir() + return get_jdtls_cache_dir() .. '/config' + end + + local function get_jdtls_workspace_dir() + return get_jdtls_cache_dir() .. '/workspace' + end + + local function get_jdtls_jvm_args() + local args = {} + for a in string.gmatch((jdtls_env.JDTLS_JVM_ARGS or '''), '%S+') do + local arg = string.format('--jvm-arg=%s', a) + table.insert(args, arg) + end + return unpack(args) + end + + -- TextDocument version is reported as 0, override with nil so that + -- the client doesn't think the document is newer and refuses to update + -- See: https://github.com/eclipse/eclipse.jdt.ls/issues/1695 + local function jdtls_fix_zero_version(workspace_edit) + if workspace_edit and workspace_edit.documentChanges then + for _, change in pairs(workspace_edit.documentChanges) do + local text_document = change.textDocument + if text_document and text_document.version and text_document.version == 0 then + text_document.version = nil + end + end + end + return workspace_edit + end + + local function jdtls_on_textdocument_codeaction(err, actions, ctx) + for _, action in ipairs(actions) do + -- TODO: (steelsojka) Handle more than one edit? + if action.command == 'java.apply.workspaceEdit' then -- 'action' is Command in java format + action.edit = jdtls_fix_zero_version(action.edit or action.arguments[1]) + elseif type(action.command) == 'table' and action.command.command == 'java.apply.workspaceEdit' then -- 'action' is CodeAction in java format + action.edit = jdtls_fix_zero_version(action.edit or action.command.arguments[1]) + end + end + + jdtls_handlers[ctx.method](err, actions, ctx) + end + + local function jdtls_on_textdocument_rename(err, workspace_edit, ctx) + jdtls_handlers[ctx.method](err, jdtls_fix_zero_version(workspace_edit), ctx) + end + + local function jdtls_on_workspace_applyedit(err, workspace_edit, ctx) + jdtls_handlers[ctx.method](err, jdtls_fix_zero_version(workspace_edit), ctx) + end + + -- Non-standard notification that can be used to display progress + local function jdtls_on_language_status(_, result) + local command = vim.api.nvim_command + command 'echohl ModeMsg' + command(string.format('echo "%s"', result.message)) + command 'echohl None' + end + ''; + }; + }; +} From af7df8107734d14f2efd909a8034ca05ca6d9792 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 00:40:35 +0200 Subject: [PATCH 094/130] lsp/presets/superhtml: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/superhtml.nix | 24 +++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 modules/plugins/lsp/presets/superhtml.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index a1d4c92a..8a27a82d 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -37,6 +37,7 @@ ./rumdl.nix ./solargraph.nix ./sqls.nix + ./superhtml.nix ./svelte-language-server.nix ./tailwindcss-language-server.nix ./taplo.nix diff --git a/modules/plugins/lsp/presets/superhtml.nix b/modules/plugins/lsp/presets/superhtml.nix new file mode 100644 index 00000000..376c8ddd --- /dev/null +++ b/modules/plugins/lsp/presets/superhtml.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.superhtml; +in { + options.vim.lsp.presets.superhtml = { + enable = mkEnableOption "the SuperHTML Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.superhtml = { + enable = true; + cmd = [(getExe pkgs.superhtml) "lsp"]; + root_markers = [".git"]; + }; + }; +} From c92589d408139170cede274a1187e162493b0fa0 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 00:41:40 +0200 Subject: [PATCH 095/130] lsp/presets/emmet-ls: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/emmet-ls.nix | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 modules/plugins/lsp/presets/emmet-ls.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 8a27a82d..2193529f 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -6,6 +6,7 @@ ./basedpyright.nix ./bash-language-server.nix ./deno.nix + ./emmet-ls.nix ./harper.nix ./intelephense.nix ./jdt-language-server.nix diff --git a/modules/plugins/lsp/presets/emmet-ls.nix b/modules/plugins/lsp/presets/emmet-ls.nix new file mode 100644 index 00000000..4886115f --- /dev/null +++ b/modules/plugins/lsp/presets/emmet-ls.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.emmet-ls; +in { + options.vim.lsp.presets.emmet-ls = { + enable = mkEnableOption "the Emmet Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.emmet-ls = { + enable = true; + cmd = [(getExe pkgs.emmet-ls) "--stdio"]; + root_markers = [".git"]; + }; + }; +} From 3ffa639bcaed13f1dc78b10bacb4cd4eb26dec72 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 00:44:55 +0200 Subject: [PATCH 096/130] lsp/presets/helm-ls: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/helm-ls.nix | 29 +++++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 modules/plugins/lsp/presets/helm-ls.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 2193529f..8910bb43 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -8,6 +8,7 @@ ./deno.nix ./emmet-ls.nix ./harper.nix + ./helm-ls.nix ./intelephense.nix ./jdt-language-server.nix ./jinja-lsp.nix diff --git a/modules/plugins/lsp/presets/helm-ls.nix b/modules/plugins/lsp/presets/helm-ls.nix new file mode 100644 index 00000000..735d7266 --- /dev/null +++ b/modules/plugins/lsp/presets/helm-ls.nix @@ -0,0 +1,29 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.helm-ls; +in { + options.vim.lsp.presets.helm-ls = { + enable = mkEnableOption "the Helm Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.helm-ls = { + enable = true; + cmd = [(getExe pkgs.helm-ls) "serve"]; + root_markers = [".git" "Chart.yaml"]; + capabilities = { + didChangeWatchedFiles = { + dynamicRegistration = true; + }; + }; + }; + }; +} From e8e8058c752225310587d68fcd9af1d2893fd846 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 00:48:14 +0200 Subject: [PATCH 097/130] languages/jq: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/jq.nix | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/modules/plugins/languages/jq.nix b/modules/plugins/languages/jq.nix index 149dc5b2..d27a5be5 100644 --- a/modules/plugins/languages/jq.nix +++ b/modules/plugins/languages/jq.nix @@ -8,6 +8,7 @@ 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.attrsets) mapListToAttrs; inherit (lib.nvim.types) mkGrammarOption; @@ -15,14 +16,7 @@ cfg = config.vim.languages.jq; defaultServers = ["jq-lsp"]; - servers = { - jq-lsp = { - enable = true; - cmd = [(getExe pkgs.jq-lsp)]; - filetypes = ["jq"]; - root_markers = [".git"]; - }; - }; + servers = ["jq-lsp"]; defaultFormat = ["jqfmt"]; formats = { @@ -57,7 +51,7 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "JQ LSP server to use"; }; @@ -88,12 +82,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["jq"]; + }); + }; }) (mkIf cfg.format.enable { From 6d075667e7716a71d3262b35550ca7e7914aca33 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 00:49:18 +0200 Subject: [PATCH 098/130] languages/jinja: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/jinja.nix | 30 ++++++++++------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/modules/plugins/languages/jinja.nix b/modules/plugins/languages/jinja.nix index ce141eb9..a7d677b0 100644 --- a/modules/plugins/languages/jinja.nix +++ b/modules/plugins/languages/jinja.nix @@ -4,26 +4,16 @@ lib, ... }: let - inherit (builtins) attrNames; - inherit (lib.meta) getExe; + inherit (lib) genAttrs; inherit (lib.modules) mkIf mkMerge; inherit (lib.options) literalExpression 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" - ]; - }; - }; + servers = ["jinja-lsp"]; in { options.vim.languages.jinja = { enable = mkEnableOption "Jinja template language support"; @@ -48,7 +38,7 @@ in { }; servers = mkOption { description = "Jinja LSP server to use"; - type = listOf (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; }; }; @@ -64,12 +54,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["jinja"]; + }); + }; }) ]); } From d6035ff6bc1d3de9be9f390f91a63ed05e15b5d9 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 00:51:25 +0200 Subject: [PATCH 099/130] languages/java: refactor lsp.servers to use lsp/presets/ --- docs/manual/release-notes/rl-0.9.md | 3 + modules/plugins/languages/java.nix | 150 ++-------------------------- 2 files changed, 13 insertions(+), 140 deletions(-) diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index 798bd68a..d7a6a893 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -93,6 +93,8 @@ - Renamed `jsonls` to `vscode-json-language-server`. +- Renamed `jdtls` to `jdt-language-server`. + - Removed `languages.tailwind` which only provided an LSP. Use `lsp.presets.tailwindcss-language-server` instead. @@ -228,6 +230,7 @@ {command}`:healthcheck` doesn't know that. - Remove [which-key.nvim] `o` `+Notes` description which did not actually correspond to any keybinds. + - Allow disabling nvf's vendored keymaps by toggling `vendoredKeymaps.enable`. [pyrox0](https://github.com/pyrox0): diff --git a/modules/plugins/languages/java.nix b/modules/plugins/languages/java.nix index d843e2a8..4f7d0c02 100644 --- a/modules/plugins/languages/java.nix +++ b/modules/plugins/languages/java.nix @@ -6,60 +6,14 @@ }: let inherit (lib.options) literalExpression mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; - inherit (lib.meta) getExe; - inherit (builtins) attrNames; + inherit (lib) genAttrs; inherit (lib.types) listOf enum; inherit (lib.nvim.types) mkGrammarOption; - inherit (lib.nvim.attrsets) mapListToAttrs; - inherit (lib.nvim.dag) entryBefore; - inherit (lib.generators) mkLuaInline; cfg = config.vim.languages.java; - defaultServers = ["jdtls"]; - servers = { - jdtls = { - enable = true; - cmd = - mkLuaInline - /* - lua - */ - '' - { - '${getExe pkgs.jdt-language-server}', - '-configuration', - get_jdtls_config_dir(), - '-data', - get_jdtls_workspace_dir(), - get_jdtls_jvm_args(), - } - ''; - filetypes = ["java"]; - root_markers = [ - # Multi-module projects - ".git" - "build.gradle" - "build.gradle.kts" - # Single-module projects - "build.xml" # Ant - "pom.xml" # Maven - "settings.gradle" # Gradle - "settings.gradle.kts" # Gradle - ]; - init_options = { - workspace = mkLuaInline "get_jdtls_workspace_dir()"; - jvm_args = {}; - os_config = mkLuaInline "nil"; - }; - handlers = { - "textDocument/codeAction" = mkLuaInline "jdtls_on_textdocument_codeaction"; - "textDocument/rename" = mkLuaInline "jdtls_on_textdocument_rename"; - "workspace/applyEdit" = mkLuaInline "jdtls_on_workspace_applyedit"; - "language/status" = mkLuaInline "vim.schedule_wrap(jdtls_on_language_status)"; - }; - }; - }; + defaultServers = ["jdt-language-server"]; + servers = ["jdt-language-server"]; in { options.vim.languages.java = { enable = mkEnableOption "Java language support"; @@ -82,7 +36,7 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "Java LSP server to use"; }; @@ -91,96 +45,12 @@ in { config = mkIf cfg.enable (mkMerge [ (mkIf cfg.lsp.enable { - vim.luaConfigRC.jdtls-util = - entryBefore ["lsp-servers"] - /* - lua - */ - '' - local jdtls_handlers = require 'vim.lsp.handlers' - - local jdtls_env = { - HOME = vim.uv.os_homedir(), - XDG_CACHE_HOME = os.getenv 'XDG_CACHE_HOME', - JDTLS_JVM_ARGS = os.getenv 'JDTLS_JVM_ARGS', - } - - local function get_cache_dir() - return jdtls_env.XDG_CACHE_HOME and jdtls_env.XDG_CACHE_HOME or jdtls_env.HOME .. '/.cache' - end - - local function get_jdtls_cache_dir() - return get_cache_dir() .. '/jdtls' - end - - local function get_jdtls_config_dir() - return get_jdtls_cache_dir() .. '/config' - end - - local function get_jdtls_workspace_dir() - return get_jdtls_cache_dir() .. '/workspace' - end - - local function get_jdtls_jvm_args() - local args = {} - for a in string.gmatch((jdtls_env.JDTLS_JVM_ARGS or '''), '%S+') do - local arg = string.format('--jvm-arg=%s', a) - table.insert(args, arg) - end - return unpack(args) - end - - -- TextDocument version is reported as 0, override with nil so that - -- the client doesn't think the document is newer and refuses to update - -- See: https://github.com/eclipse/eclipse.jdt.ls/issues/1695 - local function jdtls_fix_zero_version(workspace_edit) - if workspace_edit and workspace_edit.documentChanges then - for _, change in pairs(workspace_edit.documentChanges) do - local text_document = change.textDocument - if text_document and text_document.version and text_document.version == 0 then - text_document.version = nil - end - end - end - return workspace_edit - end - - local function jdtls_on_textdocument_codeaction(err, actions, ctx) - for _, action in ipairs(actions) do - -- TODO: (steelsojka) Handle more than one edit? - if action.command == 'java.apply.workspaceEdit' then -- 'action' is Command in java format - action.edit = jdtls_fix_zero_version(action.edit or action.arguments[1]) - elseif type(action.command) == 'table' and action.command.command == 'java.apply.workspaceEdit' then -- 'action' is CodeAction in java format - action.edit = jdtls_fix_zero_version(action.edit or action.command.arguments[1]) - end - end - - jdtls_handlers[ctx.method](err, actions, ctx) - end - - local function jdtls_on_textdocument_rename(err, workspace_edit, ctx) - jdtls_handlers[ctx.method](err, jdtls_fix_zero_version(workspace_edit), ctx) - end - - local function jdtls_on_workspace_applyedit(err, workspace_edit, ctx) - jdtls_handlers[ctx.method](err, jdtls_fix_zero_version(workspace_edit), ctx) - end - - -- Non-standard notification that can be used to display progress - local function jdtls_on_language_status(_, result) - local command = vim.api.nvim_command - command 'echohl ModeMsg' - command(string.format('echo "%s"', result.message)) - command 'echohl None' - end - ''; - - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["java"]; + }); + }; }) (mkIf cfg.treesitter.enable { From baedca480763324864ec2d85d866886655407765 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 00:54:08 +0200 Subject: [PATCH 100/130] languages/html: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/html.nix | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/modules/plugins/languages/html.nix b/modules/plugins/languages/html.nix index cba4da6d..7531bdfe 100644 --- a/modules/plugins/languages/html.nix +++ b/modules/plugins/languages/html.nix @@ -8,7 +8,8 @@ inherit (lib.meta) getExe; inherit (lib.options) literalExpression mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) bool enum; + inherit (lib.types) bool enum listOf; + inherit (lib) genAttrs; inherit (lib.lists) optional; inherit (lib.nvim.types) mkGrammarOption diagnostics deprecatedSingleOrListOf; inherit (lib.nvim.dag) entryAnywhere; @@ -17,18 +18,7 @@ cfg = config.vim.languages.html; defaultServers = ["superhtml"]; - servers = { - superhtml = { - cmd = [(getExe pkgs.superhtml) "lsp"]; - filetypes = ["html" "shtml" "htm"]; - root_markers = ["index.html" ".git"]; - }; - emmet-ls = { - cmd = [(getExe pkgs.emmet-ls) "--stdio"]; - filetypes = ["html" "shtml" "htm"]; - root_markers = ["index.html" ".git"]; - }; - }; + servers = ["superhtml" "emmet-ls"]; defaultFormat = ["superhtml"]; formats = { @@ -70,7 +60,7 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = deprecatedSingleOrListOf "vim.language.html.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "HTML LSP server to use"; }; @@ -124,12 +114,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["html" "shtml" "xhtml" "htm"]; + }); + }; }) (mkIf (cfg.format.enable && !cfg.lsp.enable) { From 894c13d0c29e010e87888a3382fe6d87950bb51f Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 00:56:08 +0200 Subject: [PATCH 101/130] languages/helm: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/helm.nix | 49 ++++++++---------------------- 1 file changed, 12 insertions(+), 37 deletions(-) diff --git a/modules/plugins/languages/helm.nix b/modules/plugins/languages/helm.nix index c2152b54..68e872c9 100644 --- a/modules/plugins/languages/helm.nix +++ b/modules/plugins/languages/helm.nix @@ -4,41 +4,16 @@ lib, ... }: let - inherit (builtins) attrNames head; inherit (lib.options) literalExpression mkEnableOption mkOption; - inherit (lib.modules) mkDefault mkIf mkMerge; - inherit (lib.meta) getExe; - inherit (lib.types) enum; - inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; - inherit (lib.nvim.attrsets) mapListToAttrs; + inherit (lib.modules) mkIf mkMerge; + inherit (lib) genAttrs; + inherit (lib.types) enum listOf; + inherit (lib.nvim.types) mkGrammarOption; cfg = config.vim.languages.helm; - yamlCfg = config.vim.languages.yaml; defaultServers = ["helm-ls"]; - servers = { - helm-ls = { - enable = true; - cmd = [(getExe pkgs.helm-ls) "serve"]; - filetypes = ["helm" "yaml.helm-values"]; - root_markers = ["Chart.yaml"]; - capabilities = { - didChangeWatchedFiles = { - dynamicRegistration = true; - }; - }; - settings = mkIf (yamlCfg.enable && yamlCfg.lsp.enable) { - helm-ls = { - yamlls = { - # Without this being enabled, the YAML language module will look broken in helmfiles - # if both modules are enabled at once. - enabled = mkDefault yamlCfg.lsp.enable; - path = head config.vim.lsp.servers.${head yamlCfg.lsp.servers}.cmd; - }; - }; - }; - }; - }; + servers = ["helm-ls"]; in { options.vim.languages.helm = { enable = mkEnableOption "Helm language support"; @@ -61,7 +36,7 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = deprecatedSingleOrListOf "vim.language.helm.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "Helm LSP server to use"; }; @@ -75,12 +50,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["helm" "yaml.helm-values"]; + }); + }; }) { From e24630d7c33bfc4f10ad557917c46ebf8c498d85 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 14:48:18 +0200 Subject: [PATCH 102/130] lsp/presets/gopls: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/gopls.nix | 59 +++++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 modules/plugins/lsp/presets/gopls.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 8910bb43..1d09184d 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -7,6 +7,7 @@ ./bash-language-server.nix ./deno.nix ./emmet-ls.nix + ./gopls.nix ./harper.nix ./helm-ls.nix ./intelephense.nix diff --git a/modules/plugins/lsp/presets/gopls.nix b/modules/plugins/lsp/presets/gopls.nix new file mode 100644 index 00000000..3a95738f --- /dev/null +++ b/modules/plugins/lsp/presets/gopls.nix @@ -0,0 +1,59 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + inherit (lib.generators) mkLuaInline; + + cfg = config.vim.lsp.presets.gopls; +in { + options.vim.lsp.presets.gopls = { + enable = mkEnableOption "the official Go Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.gopls = { + enable = true; + cmd = [(getExe pkgs.gopls)]; + root_dir = mkLuaInline '' + function(bufnr, on_dir) + local fname = vim.api.nvim_buf_get_name(bufnr) + + local function get_root(fname) + if _G.nvf_gopls_mod_cache and fname:sub(1, #_G.nvf_gopls_mod_cache) == _G.nvf_gopls_mod_cache then + local clients = vim.lsp.get_clients { name = 'gopls' } + if #clients > 0 then + return clients[#clients].config.root_dir + end + end + return vim.fs.root(fname, 'go.work') or vim.fs.root(fname, 'go.mod') or vim.fs.root(fname, '.git') + end + + -- see: https://github.com/neovim/nvim-lspconfig/issues/804 + if _G.nvf_gopls_mod_cache then + on_dir(get_root(fname)) + return + end + local cmd = { 'go', 'env', 'GOMODCACHE' } + local ok, err = pcall(vim.system, cmd, { text = true }, function(output) + if output.code == 0 then + if output.stdout then + _G.nvf_gopls_mod_cache = vim.trim(output.stdout) + end + on_dir(get_root(fname)) + else + vim.schedule(function() + vim.notify(('[gopls] cmd failed with code %d: %s\n%s'):format(output.code, cmd, output.stderr)) + end) + end + end) + if not ok then vim.notify(('[gopls] cmd failed: %s\n%s'):format(cmd, err)) end + end + ''; + }; + }; +} From b95390794ee9afd6c63d8ec575b8e962eb699cf9 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 14:50:40 +0200 Subject: [PATCH 103/130] lsp/presets/glsl_analyzer: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/glsl_analyzer.nix | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 modules/plugins/lsp/presets/glsl_analyzer.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 1d09184d..2658ea16 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -7,6 +7,7 @@ ./bash-language-server.nix ./deno.nix ./emmet-ls.nix + ./glsl_analyzer.nix ./gopls.nix ./harper.nix ./helm-ls.nix diff --git a/modules/plugins/lsp/presets/glsl_analyzer.nix b/modules/plugins/lsp/presets/glsl_analyzer.nix new file mode 100644 index 00000000..f548f792 --- /dev/null +++ b/modules/plugins/lsp/presets/glsl_analyzer.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.glsl_analyzer; +in { + options.vim.lsp.presets.glsl_analyzer = { + enable = mkEnableOption "the GLSL-Analyzer Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.glsl_analyzer = { + enable = true; + cmd = [(getExe pkgs.glsl_analyzer)]; + root_markers = [".git"]; + }; + }; +} From cf5928d9418c403f372dc96c57bfb59074e0cfcd Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 14:53:16 +0200 Subject: [PATCH 104/130] lsp/presets/gleam: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/gleam.nix | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 modules/plugins/lsp/presets/gleam.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 2658ea16..9381c80a 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -7,6 +7,7 @@ ./bash-language-server.nix ./deno.nix ./emmet-ls.nix + ./gleam.nix ./glsl_analyzer.nix ./gopls.nix ./harper.nix diff --git a/modules/plugins/lsp/presets/gleam.nix b/modules/plugins/lsp/presets/gleam.nix new file mode 100644 index 00000000..a98c313c --- /dev/null +++ b/modules/plugins/lsp/presets/gleam.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.gleam; +in { + options.vim.lsp.presets.gleam = { + enable = mkEnableOption "the Gleam Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.gleam = { + enable = true; + cmd = [(getExe pkgs.gleam) "lsp"]; + root_markers = [".git" "gleam.toml"]; + }; + }; +} From 3aa1b7a9d695e19b9781d758e865cbc75f92072f Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 14:54:47 +0200 Subject: [PATCH 105/130] lsp/presets/fsautocomplete: init --- modules/plugins/lsp/presets/default.nix | 1 + .../plugins/lsp/presets/fsautocomplete.nix | 54 +++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 modules/plugins/lsp/presets/fsautocomplete.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 9381c80a..23dd7525 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -7,6 +7,7 @@ ./bash-language-server.nix ./deno.nix ./emmet-ls.nix + ./fsautocomplete.nix ./gleam.nix ./glsl_analyzer.nix ./gopls.nix diff --git a/modules/plugins/lsp/presets/fsautocomplete.nix b/modules/plugins/lsp/presets/fsautocomplete.nix new file mode 100644 index 00000000..8fcd5e39 --- /dev/null +++ b/modules/plugins/lsp/presets/fsautocomplete.nix @@ -0,0 +1,54 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + inherit (lib.generators) mkLuaInline; + + cfg = config.vim.lsp.presets.fsautocomplete; +in { + options.vim.lsp.presets.fsautocomplete = { + enable = mkEnableOption "the F# Autocomplete Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.fsautocomplete = { + enable = true; + cmd = [(getExe pkgs.fsautocomplete) "--adaptive-lsp-server-enabled"]; + root_dir = mkLuaInline '' + function(bufnr, on_dir) + on_dir(vim.fs.root(bufnr, function(name, path) + return name == ".git" or name:match("%.sln$") or name:match("%.fsproj$") + end)) + end + ''; + init_options = { + AutomaticWorkspaceInit = true; + }; + settings = { + FSharp = { + keywordsAutocomplete = true; + ExternalAutocomplete = false; + Linter = true; + UnionCaseStubGeneration = true; + UnionCaseStubGenerationBody = ''failwith "Not Implemented"''; + RecordStubGeneration = true; + RecordStubGenerationBody = ''failwith "Not Implemented"''; + InterfaceStubGeneration = true; + InterfaceStubGenerationObjectIdentifier = "this"; + InterfaceStubGenerationMethodBody = ''failwith "Not Implemented"''; + UnusedOpensAnalyzer = true; + UnusedDeclarationsAnalyzer = true; + UseSdkScripts = true; + SimplifyNameAnalyzer = true; + ResolveNamespaces = true; + EnableReferenceCodeLens = true; + }; + }; + }; + }; +} From fd1bf72c3bb01b612d1efdf352f53afe3f3379da Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 14:56:10 +0200 Subject: [PATCH 106/130] lsp/presets/elm-language-server: init --- modules/plugins/lsp/presets/default.nix | 1 + .../lsp/presets/elm-language-server.nix | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 modules/plugins/lsp/presets/elm-language-server.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 23dd7525..bf9e506b 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -6,6 +6,7 @@ ./basedpyright.nix ./bash-language-server.nix ./deno.nix + ./elm-language-server.nix ./emmet-ls.nix ./fsautocomplete.nix ./gleam.nix diff --git a/modules/plugins/lsp/presets/elm-language-server.nix b/modules/plugins/lsp/presets/elm-language-server.nix new file mode 100644 index 00000000..db7f82d9 --- /dev/null +++ b/modules/plugins/lsp/presets/elm-language-server.nix @@ -0,0 +1,25 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.elm-language-server; +in { + options.vim.lsp.presets.elm-language-server = { + enable = mkEnableOption "the Elm Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.elm-language-server = { + enable = true; + cmd = [(getExe pkgs.elmPackages.elm-language-server)]; + root_markers = [".git" "elm.json"]; + workspace_required = false; + }; + }; +} From 094d56b7ee4250026906a480eaa6b763b90e7f86 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 14:58:15 +0200 Subject: [PATCH 107/130] lsp/presets/elixir-ls: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/elixir-ls.nix | 34 +++++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 modules/plugins/lsp/presets/elixir-ls.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index bf9e506b..b89b5fec 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -6,6 +6,7 @@ ./basedpyright.nix ./bash-language-server.nix ./deno.nix + ./elixir-ls.nix ./elm-language-server.nix ./emmet-ls.nix ./fsautocomplete.nix diff --git a/modules/plugins/lsp/presets/elixir-ls.nix b/modules/plugins/lsp/presets/elixir-ls.nix new file mode 100644 index 00000000..e1749f25 --- /dev/null +++ b/modules/plugins/lsp/presets/elixir-ls.nix @@ -0,0 +1,34 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + inherit (lib.generators) mkLuaInline; + + cfg = config.vim.lsp.presets.elixir-ls; +in { + options.vim.lsp.presets.elixir-ls = { + enable = mkEnableOption "the Elixir Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.elixir-ls = { + enable = true; + cmd = [(getExe pkgs.elixir-ls)]; + root_dir = mkLuaInline '' + function(bufnr, on_dir) + local fname = vim.api.nvim_buf_get_name(bufnr) + local matches = vim.fs.find({ 'mix.exs' }, { upward = true, limit = 2, path = fname }) + local child_or_root_path, maybe_umbrella_path = unpack(matches) + local root_dir = vim.fs.dirname(maybe_umbrella_path or child_or_root_path) + + on_dir(root_dir) + end + ''; + }; + }; +} From f01641b2083ed1230e93ec3fc6dafe58d1d60eaa Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 14:59:41 +0200 Subject: [PATCH 108/130] lsp/presets/dart: init --- modules/plugins/lsp/presets/dart.nix | 37 +++++++++++++++++++++++++ modules/plugins/lsp/presets/default.nix | 1 + 2 files changed, 38 insertions(+) create mode 100644 modules/plugins/lsp/presets/dart.nix diff --git a/modules/plugins/lsp/presets/dart.nix b/modules/plugins/lsp/presets/dart.nix new file mode 100644 index 00000000..e8800abd --- /dev/null +++ b/modules/plugins/lsp/presets/dart.nix @@ -0,0 +1,37 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.dart; +in { + options.vim.lsp.presets.dart = { + enable = mkEnableOption "the Dart Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.dart = { + enable = true; + cmd = [(getExe pkgs.dart) "language-server" "--protocol=lsp"]; + root_markers = [".git" "pubspec.yaml"]; + init_options = { + onlyAnalyzeProjectsWithOpenFiles = true; + suggestFromUnimportedLibraries = true; + closingLabels = true; + outline = true; + flutterOutline = true; + }; + settings = { + dart = { + completeFunctionCalls = true; + showTodos = true; + }; + }; + }; + }; +} diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index b89b5fec..333c8348 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -5,6 +5,7 @@ ./astro-language-server.nix ./basedpyright.nix ./bash-language-server.nix + ./dart.nix ./deno.nix ./elixir-ls.nix ./elm-language-server.nix From c5700a056f8ee83e6b606a3a462bf5baf1911c7c Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 15:01:29 +0200 Subject: [PATCH 109/130] lsp/presets/cue: init --- modules/plugins/lsp/presets/cue.nix | 24 ++++++++++++++++++++++++ modules/plugins/lsp/presets/default.nix | 1 + 2 files changed, 25 insertions(+) create mode 100644 modules/plugins/lsp/presets/cue.nix diff --git a/modules/plugins/lsp/presets/cue.nix b/modules/plugins/lsp/presets/cue.nix new file mode 100644 index 00000000..bf7b73b1 --- /dev/null +++ b/modules/plugins/lsp/presets/cue.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.cue; +in { + options.vim.lsp.presets.cue = { + enable = mkEnableOption "the CUE Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.cue = { + enable = true; + cmd = [(getExe pkgs.cue) "lsp"]; + root_markers = [".git" "cue.mod"]; + }; + }; +} diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 333c8348..7b82fc3b 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -7,6 +7,7 @@ ./bash-language-server.nix ./dart.nix ./deno.nix + ./cue.nix ./elixir-ls.nix ./elm-language-server.nix ./emmet-ls.nix From aca58cd0d93356f869f5c2fe7ffa83aea365ac80 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 15:03:09 +0200 Subject: [PATCH 110/130] lsp/presets/vscode-css-language-server: init --- modules/plugins/lsp/presets/default.nix | 1 + .../presets/vscode-css-language-server.nix | 30 +++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 modules/plugins/lsp/presets/vscode-css-language-server.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 7b82fc3b..9adbf8d2 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -61,6 +61,7 @@ ./typescript-go.nix ./typescript-language-server.nix ./vala-language-server.nix + ./vscode-css-language-server.nix ./vscode-json-language-server.nix ./wgsl-analyzer.nix ./yaml-language-server.nix diff --git a/modules/plugins/lsp/presets/vscode-css-language-server.nix b/modules/plugins/lsp/presets/vscode-css-language-server.nix new file mode 100644 index 00000000..100d363b --- /dev/null +++ b/modules/plugins/lsp/presets/vscode-css-language-server.nix @@ -0,0 +1,30 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe'; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.vscode-css-language-server; +in { + options.vim.lsp.presets.vscode-css-language-server = { + enable = mkEnableOption "the VSCode CSS Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.vscode-css-language-server = { + enable = true; + cmd = [(getExe' pkgs.vscode-langservers-extracted "vscode-css-language-server") "--stdio"]; + root_markers = [".git" "package.json"]; + init_options = {provideFormatter = true;}; + settings = { + css.validate = true; + scss.validate = true; + less.validate = true; + }; + }; + }; +} From 94f434b38c3e9608a886e91feec00a7c8639280c Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 15:20:27 +0200 Subject: [PATCH 111/130] lsp/presets/neocmakelsp: init --- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/neocmakelsp.nix | 27 +++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 modules/plugins/lsp/presets/neocmakelsp.nix diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 9adbf8d2..5379d2d8 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -28,6 +28,7 @@ ./lua-language-server.nix ./markdown-oxide.nix ./marksman.nix + ./neocmakelsp.nix ./nil.nix ./nimlsp.nix ./nixd.nix diff --git a/modules/plugins/lsp/presets/neocmakelsp.nix b/modules/plugins/lsp/presets/neocmakelsp.nix new file mode 100644 index 00000000..31e64769 --- /dev/null +++ b/modules/plugins/lsp/presets/neocmakelsp.nix @@ -0,0 +1,27 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.neocmakelsp; +in { + options.vim.lsp.presets.neocmakelsp = { + enable = mkEnableOption "the Neo CMake Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.neocmakelsp = { + enable = true; + cmd = [(getExe pkgs.neocmakelsp) "stdio"]; + root_markers = [".git" ".gersemirc"]; + capabilities = { + textDocument.completion.completionItem.snippetSupport = true; + }; + }; + }; +} From e439bf45b9d496feb88d273839b4effad4237de7 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 15:22:02 +0200 Subject: [PATCH 112/130] lsp/presets/clojure-lsp: init --- modules/plugins/lsp/presets/clojure-lsp.nix | 24 +++++++++++++++++++++ modules/plugins/lsp/presets/default.nix | 3 ++- 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 modules/plugins/lsp/presets/clojure-lsp.nix diff --git a/modules/plugins/lsp/presets/clojure-lsp.nix b/modules/plugins/lsp/presets/clojure-lsp.nix new file mode 100644 index 00000000..280a0da6 --- /dev/null +++ b/modules/plugins/lsp/presets/clojure-lsp.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + + cfg = config.vim.lsp.presets.clojure-lsp; +in { + options.vim.lsp.presets.clojure-lsp = { + enable = mkEnableOption "the Clojure Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.clojure-lsp = { + enable = true; + cmd = [(getExe pkgs.clojure-lsp)]; + root_markers = [".git" "project.clj"]; + }; + }; +} diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 5379d2d8..737296ee 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -5,9 +5,10 @@ ./astro-language-server.nix ./basedpyright.nix ./bash-language-server.nix + ./clojure-lsp.nix + ./cue.nix ./dart.nix ./deno.nix - ./cue.nix ./elixir-ls.nix ./elm-language-server.nix ./emmet-ls.nix From d44cb76b269998b89b6e17ed09760786f695c10a Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 15:24:03 +0200 Subject: [PATCH 113/130] lsp/presets/ccls: init --- modules/plugins/lsp/presets/ccls.nix | 54 +++++++++++++++++++++++++ modules/plugins/lsp/presets/default.nix | 1 + 2 files changed, 55 insertions(+) create mode 100644 modules/plugins/lsp/presets/ccls.nix diff --git a/modules/plugins/lsp/presets/ccls.nix b/modules/plugins/lsp/presets/ccls.nix new file mode 100644 index 00000000..47c5643d --- /dev/null +++ b/modules/plugins/lsp/presets/ccls.nix @@ -0,0 +1,54 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + inherit (lib.generators) mkLuaInline; + + cfg = config.vim.lsp.presets.ccls; +in { + options.vim.lsp.presets.ccls = { + enable = mkEnableOption "the CC Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.ccls = { + enable = true; + cmd = [(getExe pkgs.ccls)]; + offset_encoding = "utf-32"; + root_markers = [".git" ".ccls" "compile_commands.json"]; + workspace_required = true; + on_attach = mkLuaInline '' + function(client, bufnr) + local function switch_source_header(bufnr) + local method_name = "textDocument/switchSourceHeader" + local params = vim.lsp.util.make_text_document_params(bufnr) + client:request(method_name, params, function(err, result) + if err then + error(tostring(err)) + end + if not result then + vim.notify('corresponding file cannot be determined') + return + end + vim.cmd.edit(vim.uri_to_fname(result)) + end, bufnr) + end + + vim.api.nvim_buf_create_user_command( + bufnr, + "LspCclsSwitchSourceHeader", + function(arg) + switch_source_header(client, 0) + end, + {desc = "Switch between source/header"} + ) + end + ''; + }; + }; +} diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 737296ee..13cb1624 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -5,6 +5,7 @@ ./astro-language-server.nix ./basedpyright.nix ./bash-language-server.nix + ./ccls.nix ./clojure-lsp.nix ./cue.nix ./dart.nix From 40ca9f3f7d2b3edae7b6e7c8e2835713a0f0c689 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 15:26:42 +0200 Subject: [PATCH 114/130] lsp/presets/clangd: init --- modules/plugins/lsp/presets/clangd.nix | 107 ++++++++++++++++++++++++ modules/plugins/lsp/presets/default.nix | 1 + 2 files changed, 108 insertions(+) create mode 100644 modules/plugins/lsp/presets/clangd.nix diff --git a/modules/plugins/lsp/presets/clangd.nix b/modules/plugins/lsp/presets/clangd.nix new file mode 100644 index 00000000..0c7943fa --- /dev/null +++ b/modules/plugins/lsp/presets/clangd.nix @@ -0,0 +1,107 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe'; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + inherit (lib.generators) mkLuaInline; + + cfg = config.vim.lsp.presets.clangd; +in { + options.vim.lsp.presets.clangd = { + enable = mkEnableOption "the Clangd Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.clangd = { + enable = true; + cmd = [(getExe' pkgs.clang-tools "clangd")]; + root_markers = [ + ".git" + ".clangd" + ".clang-tidy" + ".clang-format" + "compile_commands.json" + "compile_flags.txt" + "configure.ac" + ]; + capabilities = { + textDocument = { + completion = { + editsNearCursor = true; + }; + }; + offsetEncoding = ["utf-8" "utf-16"]; + }; + on_attach = mkLuaInline '' + function(client, bufnr) + local function switch_source_header(bufnr) + local method_name = "textDocument/switchSourceHeader" + local client = vim.lsp.get_clients({ bufnr = bufnr, name = "clangd", })[1] + if not client then + return vim.notify(('method %s is not supported by any servers active on the current buffer'):format(method_name)) + end + local params = vim.lsp.util.make_text_document_params(bufnr) + client.request(method_name, params, function(err, result) + if err then + error(tostring(err)) + end + if not result then + vim.notify('corresponding file cannot be determined') + return + end + vim.cmd.edit(vim.uri_to_fname(result)) + end, bufnr) + end + + local function symbol_info() + local bufnr = vim.api.nvim_get_current_buf() + local clangd_client = vim.lsp.get_clients({ bufnr = bufnr, name = "clangd" })[1] + if not clangd_client or not clangd_client:supports_method 'textDocument/symbolInfo' then + return vim.notify('Clangd client not found', vim.log.levels.ERROR) + end + local win = vim.api.nvim_get_current_win() + local params = vim.lsp.util.make_position_params(win, clangd_client.offset_encoding) + clangd_client:request('textDocument/symbolInfo', params, function(err, res) + if err or #res == 0 then + -- Clangd always returns an error, there is not reason to parse it + return + end + local container = string.format('container: %s', res[1].containerName) ---@type string + local name = string.format('name: %s', res[1].name) ---@type string + vim.lsp.util.open_floating_preview({ name, container }, "", { + height = 2, + width = math.max(string.len(name), string.len(container)), + focusable = false, + focus = false, + border = 'single', + title = 'Symbol Info', + }) + end, bufnr) + end + + vim.api.nvim_buf_create_user_command( + bufnr, + "ClangdSwitchSourceHeader", + function(arg) + switch_source_header(0) + end, + {desc = "Switch between source/header"} + ) + + vim.api.nvim_buf_create_user_command( + bufnr, + "ClangdShowSymbolInfo", + function(arg) + symbol_info() + end, + {desc = "Show symbol info"} + ) + end + ''; + }; + }; +} diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 13cb1624..caf26d7c 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -6,6 +6,7 @@ ./basedpyright.nix ./bash-language-server.nix ./ccls.nix + ./clangd.nix ./clojure-lsp.nix ./cue.nix ./dart.nix From 7fc044d09180e175b78203e9a946b0fbae3d297f Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 15:32:21 +0200 Subject: [PATCH 115/130] languages/go: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/go.nix | 59 ++++++-------------------------- 1 file changed, 10 insertions(+), 49 deletions(-) diff --git a/modules/plugins/languages/go.nix b/modules/plugins/languages/go.nix index 7c83ebf2..6831fe9c 100644 --- a/modules/plugins/languages/go.nix +++ b/modules/plugins/languages/go.nix @@ -9,8 +9,9 @@ inherit (lib.options) mkEnableOption mkOption literalMD literalExpression; inherit (lib.modules) mkIf mkMerge; inherit (lib.meta) getExe; + inherit (lib) genAttrs; inherit (lib.generators) mkLuaInline; - inherit (lib.types) bool enum package str; + inherit (lib.types) enum package str listOf; inherit (lib.nvim.types) mkGrammarOption diagnostics deprecatedSingleOrListOf mkPluginSetupOption; inherit (lib.nvim.dag) entryAfter; inherit (lib.nvim.attrsets) mapListToAttrs; @@ -18,47 +19,7 @@ cfg = config.vim.languages.go; defaultServers = ["gopls"]; - servers = { - gopls = { - cmd = [(getExe pkgs.gopls)]; - filetypes = ["go" "gomod" "gosum" "gowork" "gotmpl"]; - root_dir = mkLuaInline '' - function(bufnr, on_dir) - local fname = vim.api.nvim_buf_get_name(bufnr) - - local function get_root(fname) - if _G.nvf_gopls_mod_cache and fname:sub(1, #_G.nvf_gopls_mod_cache) == _G.nvf_gopls_mod_cache then - local clients = vim.lsp.get_clients { name = 'gopls' } - if #clients > 0 then - return clients[#clients].config.root_dir - end - end - return vim.fs.root(fname, 'go.work') or vim.fs.root(fname, 'go.mod') or vim.fs.root(fname, '.git') - end - - -- see: https://github.com/neovim/nvim-lspconfig/issues/804 - if _G.nvf_gopls_mod_cache then - on_dir(get_root(fname)) - return - end - local cmd = { 'go', 'env', 'GOMODCACHE' } - local ok, err = pcall(vim.system, cmd, { text = true }, function(output) - if output.code == 0 then - if output.stdout then - _G.nvf_gopls_mod_cache = vim.trim(output.stdout) - end - on_dir(get_root(fname)) - else - vim.schedule(function() - vim.notify(('[gopls] cmd failed with code %d: %s\n%s'):format(output.code, cmd, output.stderr)) - end) - end - end) - if not ok then vim.notify(('[gopls] cmd failed: %s\n%s'):format(cmd, err)) end - end - ''; - }; - }; + servers = ["gopls"]; defaultFormat = ["gofmt"]; formats = { @@ -194,7 +155,7 @@ in { }; servers = mkOption { - type = deprecatedSingleOrListOf "vim.language.go.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "Go LSP server to use"; }; @@ -319,12 +280,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (name: { - inherit name; - value = servers.${name}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["go" "gomod" "gosum" "gowork" "gotmpl"]; + }); + }; }) (mkIf cfg.format.enable { From 65f3b779c6a50c30a1448a4d5f3d427f6c34bce7 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 15:33:26 +0200 Subject: [PATCH 116/130] languages/glsl: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/glsl.nix | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/modules/plugins/languages/glsl.nix b/modules/plugins/languages/glsl.nix index c4df32e3..15c7072f 100644 --- a/modules/plugins/languages/glsl.nix +++ b/modules/plugins/languages/glsl.nix @@ -4,25 +4,16 @@ pkgs, ... }: let - inherit (builtins) attrNames; inherit (lib.modules) mkIf mkMerge; inherit (lib.nvim.types) mkGrammarOption; inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.types) enum listOf; - inherit (lib.meta) getExe; - inherit (lib.nvim.attrsets) mapListToAttrs; + inherit (lib) genAttrs; cfg = config.vim.languages.glsl; defaultServers = ["glsl_analyzer"]; - servers = { - glsl_analyzer = { - enable = true; - cmd = [(getExe pkgs.glsl_analyzer)]; - filetypes = ["glsl" "vert" "tesc" "tese" "frag" "geom" "comp"]; - root_markers = [".git"]; - }; - }; + servers = ["glsl_analyzer"]; in { options.vim.languages.glsl = { enable = mkEnableOption "GLSL language support"; @@ -46,7 +37,7 @@ in { }; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "GLSL LSP server to use"; }; @@ -62,12 +53,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["glsl" "vert" "tesc" "tese" "frag" "geom" "comp"]; + }); + }; }) ]); } From 56b62f79ea43fd5069e7ad9eb3f04b3dc088175a Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 15:34:30 +0200 Subject: [PATCH 117/130] languages/gleam: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/gleam.nix | 31 ++++++++++------------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/modules/plugins/languages/gleam.nix b/modules/plugins/languages/gleam.nix index 8007c8bc..a79fcb6d 100644 --- a/modules/plugins/languages/gleam.nix +++ b/modules/plugins/languages/gleam.nix @@ -4,25 +4,16 @@ lib, ... }: let - inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.modules) mkIf mkMerge; - inherit (lib.meta) getExe; - inherit (lib.types) enum; - inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; - inherit (lib.nvim.attrsets) mapListToAttrs; + inherit (lib) genAttrs; + inherit (lib.types) enum listOf; + inherit (lib.nvim.types) mkGrammarOption; cfg = config.vim.languages.gleam; defaultServers = ["gleam"]; - servers = { - gleam = { - enable = true; - cmd = [(getExe pkgs.gleam) "lsp"]; - filetypes = ["gleam"]; - root_markers = ["gleam.toml" ".git"]; - }; - }; + servers = ["gleam"]; in { options.vim.languages.gleam = { enable = mkEnableOption "Gleam language support"; @@ -45,7 +36,7 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = deprecatedSingleOrListOf "vim.language.gleam.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "Gleam LSP server to use"; }; @@ -59,12 +50,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["gleam"]; + }); + }; }) ]); } From dcf3288ede94e1dc185fb6bb43b73bd170fe0413 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 15:35:58 +0200 Subject: [PATCH 118/130] languages/fsharp: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/fsharp.nix | 55 +++++----------------------- 1 file changed, 10 insertions(+), 45 deletions(-) diff --git a/modules/plugins/languages/fsharp.nix b/modules/plugins/languages/fsharp.nix index e57eb66d..ac41c399 100644 --- a/modules/plugins/languages/fsharp.nix +++ b/modules/plugins/languages/fsharp.nix @@ -6,50 +6,15 @@ }: let inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption literalExpression; - inherit (lib.types) enum; + inherit (lib.types) enum listOf; + inherit (lib) genAttrs; inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; - inherit (lib.generators) mkLuaInline; inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; inherit (lib.nvim.attrsets) mapListToAttrs; defaultServer = ["fsautocomplete"]; - servers = { - fsautocomplete = { - cmd = [(getExe pkgs.fsautocomplete) "--adaptive-lsp-server-enabled"]; - filetypes = ["fsharp"]; - root_dir = mkLuaInline '' - function(bufnr, on_dir) - on_dir(vim.fs.root(bufnr, function(name, path) - return name == ".git" or name:match("%.sln$") or name:match("%.fsproj$") - end)) - end - ''; - init_options = { - AutomaticWorkspaceInit = true; - }; - settings = { - FSharp = { - keywordsAutocomplete = true; - ExternalAutocomplete = false; - Linter = true; - UnionCaseStubGeneration = true; - UnionCaseStubGenerationBody = ''failwith "Not Implemented"''; - RecordStubGeneration = true; - RecordStubGenerationBody = ''failwith "Not Implemented"''; - InterfaceStubGeneration = true; - InterfaceStubGenerationObjectIdentifier = "this"; - InterfaceStubGenerationMethodBody = ''failwith "Not Implemented"''; - UnusedOpensAnalyzer = true; - UnusedDeclarationsAnalyzer = true; - UseSdkScripts = true; - SimplifyNameAnalyzer = true; - ResolveNamespaces = true; - EnableReferenceCodeLens = true; - }; - }; - }; - }; + servers = ["fsautocomplete"]; defaultFormat = ["fantomas"]; formats = { @@ -82,7 +47,7 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = deprecatedSingleOrListOf "vim.language.fsharp.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServer; description = "F# LSP server to use"; }; @@ -106,12 +71,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (name: { - inherit name; - value = servers.${name}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["fsharp"]; + }); + }; }) (mkIf cfg.format.enable { From 66b0d3c6fd15eea2ad1740157ba2087182208011 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 15:37:03 +0200 Subject: [PATCH 119/130] languages/elm: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/elm.nix | 32 ++++++++++--------------------- 1 file changed, 10 insertions(+), 22 deletions(-) diff --git a/modules/plugins/languages/elm.nix b/modules/plugins/languages/elm.nix index 9a7c4a17..bf4cb3a9 100644 --- a/modules/plugins/languages/elm.nix +++ b/modules/plugins/languages/elm.nix @@ -4,26 +4,16 @@ lib, ... }: let - inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) enum; - inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; - inherit (lib.meta) getExe; - inherit (lib.nvim.attrsets) mapListToAttrs; + inherit (lib.types) enum listOf; + inherit (lib.nvim.types) mkGrammarOption; + inherit (lib) genAttrs; cfg = config.vim.languages.elm; defaultServers = ["elm-language-server"]; - servers = { - elm-language-server = { - enable = true; - cmd = [(getExe pkgs.elmPackages.elm-language-server)]; - filetypes = ["elm"]; - root_markers = ["elm.json"]; - workspace_required = false; - }; - }; + servers = ["elm-language-server"]; in { options.vim.languages.elm = { enable = mkEnableOption "Elm language support"; @@ -47,7 +37,7 @@ in { }; servers = mkOption { - type = deprecatedSingleOrListOf "vim.language.elm.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "Elm LSP servers to use"; }; @@ -63,13 +53,11 @@ in { }) (mkIf cfg.lsp.enable { - vim = { - lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["elm"]; + }); }; }) ]); From d99888cb280de664a4c2facc1c40cc0cc3d3f200 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 15:38:55 +0200 Subject: [PATCH 120/130] languages/elixir: refactor lsp.servers to use lsp/presets/ --- docs/manual/release-notes/rl-0.9.md | 2 ++ modules/plugins/languages/elixir.nix | 44 +++++++--------------------- 2 files changed, 13 insertions(+), 33 deletions(-) diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index d7a6a893..44a41cd8 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -95,6 +95,8 @@ - Renamed `jdtls` to `jdt-language-server`. +- Renamed `elixirls` to `elixir-ls`. + - Removed `languages.tailwind` which only provided an LSP. Use `lsp.presets.tailwindcss-language-server` instead. diff --git a/modules/plugins/languages/elixir.nix b/modules/plugins/languages/elixir.nix index f8191f77..645d4866 100644 --- a/modules/plugins/languages/elixir.nix +++ b/modules/plugins/languages/elixir.nix @@ -7,38 +7,16 @@ inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.modules) mkIf mkMerge; - inherit (lib.meta) getExe; - inherit (lib.types) enum; - inherit (lib.generators) mkLuaInline; + inherit (lib) genAttrs; + inherit (lib.types) enum listOf; inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; inherit (lib.nvim.dag) entryAnywhere; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.elixir; - defaultServers = ["elixirls"]; - servers = { - elixirls = { - enable = true; - cmd = [(getExe pkgs.elixir-ls)]; - filetypes = ["elixir" "eelixir" "heex" "surface"]; - root_dir = - mkLuaInline - /* - lua - */ - '' - function(bufnr, on_dir) - local fname = vim.api.nvim_buf_get_name(bufnr) - local matches = vim.fs.find({ 'mix.exs' }, { upward = true, limit = 2, path = fname }) - local child_or_root_path, maybe_umbrella_path = unpack(matches) - local root_dir = vim.fs.dirname(maybe_umbrella_path or child_or_root_path) - - on_dir(root_dir) - end - ''; - }; - }; + defaultServers = ["elixir-ls"]; + servers = ["elixir-ls"]; defaultFormat = ["mix"]; formats = { @@ -70,7 +48,7 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = deprecatedSingleOrListOf "vim.language.elixir.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "Elixir LSP server to use"; }; @@ -102,12 +80,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["elixir" "eelixir" "heex" "surface"]; + }); + }; }) (mkIf cfg.format.enable { From 436414e5495e09db3cf9e64216c57290983a50aa Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 15:41:15 +0200 Subject: [PATCH 121/130] languages/dart: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/dart.nix | 44 ++++++++---------------------- 1 file changed, 11 insertions(+), 33 deletions(-) diff --git a/modules/plugins/languages/dart.nix b/modules/plugins/languages/dart.nix index b585da76..54c16e93 100644 --- a/modules/plugins/languages/dart.nix +++ b/modules/plugins/languages/dart.nix @@ -4,42 +4,20 @@ lib, ... }: let - inherit (builtins) attrNames; inherit (lib.modules) mkIf mkMerge; - inherit (lib.meta) getExe; + inherit (lib) genAttrs; inherit (lib.trivial) boolToString; inherit (lib.options) mkEnableOption mkOption literalExpression; - inherit (lib.types) enum package nullOr str bool; + inherit (lib.types) enum package nullOr str bool listOf; inherit (lib.strings) optionalString; - inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; + inherit (lib.nvim.types) mkGrammarOption; inherit (lib.nvim.dag) entryAfter; - inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.dart; ftcfg = cfg.flutter-tools; defaultServers = ["dart"]; - servers = { - dart = { - enable = true; - cmd = [(getExe pkgs.dart) "language-server" "--protocol=lsp"]; - filetypes = ["dart"]; - root_markers = ["pubspec.yaml"]; - init_options = { - onlyAnalyzeProjectsWithOpenFiles = true; - suggestFromUnimportedLibraries = true; - closingLabels = true; - outline = true; - flutterOutline = true; - }; - settings = { - dart = { - completeFunctionCalls = true; - showTodos = true; - }; - }; - }; - }; + servers = ["dart"]; in { options.vim.languages.dart = { enable = mkEnableOption "Dart language support"; @@ -62,7 +40,7 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = deprecatedSingleOrListOf "vim.language.dart.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "Dart LSP server to use"; }; @@ -142,12 +120,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["dart"]; + }); + }; }) (mkIf ftcfg.enable { From b5d6c6fad7afe3edd44ddcbb1444b5970e9fb2cc Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 15:43:15 +0200 Subject: [PATCH 122/130] languages/cue: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/cue.nix | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/modules/plugins/languages/cue.nix b/modules/plugins/languages/cue.nix index b4294ecd..497aca35 100644 --- a/modules/plugins/languages/cue.nix +++ b/modules/plugins/languages/cue.nix @@ -4,16 +4,14 @@ lib, ... }: let - inherit (lib.options) mkEnableOption literalExpression; - inherit (lib.meta) getExe; + inherit (lib.options) mkEnableOption literalExpression mkOption; inherit (lib.modules) mkIf mkMerge; inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.types) enum listOf; + inherit (lib) genAttrs; - lspOptions = { - cmd = [(getExe pkgs.cue) "lsp"]; - filetypes = ["cue"]; - root_markers = ["cue.mod" ".git"]; - }; + defaultServers = ["cue"]; + servers = ["cue"]; cfg = config.vim.languages.cue; in { @@ -38,6 +36,12 @@ in { default = config.vim.lsp.enable; defaultText = literalExpression "config.vim.lsp.enable"; }; + + servers = mkOption { + type = listOf (enum servers); + default = defaultServers; + description = "CUE LSP server to use"; + }; }; }; @@ -48,7 +52,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers.cue = lspOptions; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["cue"]; + }); + }; }) ]); } From e00bf6ceace6a597df8ce046c94be568184d9e3b Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 15:45:04 +0200 Subject: [PATCH 123/130] languages/css: refactor lsp.servers to use lsp/presets/ --- docs/manual/release-notes/rl-0.9.md | 2 ++ modules/plugins/languages/css.nix | 39 ++++++++++++----------------- 2 files changed, 18 insertions(+), 23 deletions(-) diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index 44a41cd8..b0e53071 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -93,6 +93,8 @@ - Renamed `jsonls` to `vscode-json-language-server`. +- Renamed `cssls` to `vscode-css-language-server`. + - Renamed `jdtls` to `jdt-language-server`. - Renamed `elixirls` to `elixir-ls`. diff --git a/modules/plugins/languages/css.nix b/modules/plugins/languages/css.nix index 27516400..fc34ea37 100644 --- a/modules/plugins/languages/css.nix +++ b/modules/plugins/languages/css.nix @@ -6,29 +6,17 @@ }: let inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption literalExpression; + inherit (lib) genAttrs; inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) enum; + inherit (lib.types) enum listOf; inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.css; - defaultServer = ["cssls"]; - servers = { - cssls = { - cmd = ["${pkgs.vscode-langservers-extracted}/bin/vscode-css-language-server" "--stdio"]; - filetypes = ["css" "scss" "less"]; - # needed to enable formatting - init_options = {provideFormatter = true;}; - root_markers = [".git" "package.json"]; - settings = { - css.validate = true; - scss.validate = true; - less.validate = true; - }; - }; - }; + defaultServer = ["vscode-css-language-server"]; + servers = ["vscode-css-language-server"]; defaultFormat = ["prettier"]; formats = { @@ -68,7 +56,7 @@ in { }; servers = mkOption { - type = deprecatedSingleOrListOf "vim.language.css.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServer; description = "CSS LSP server to use"; }; @@ -92,12 +80,17 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (name: { - inherit name; - value = servers.${name}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = [ + "css" + # TODO: split in their own modules + "scss" + "less" + ]; + }); + }; }) (mkIf cfg.format.enable { From 6e02715cc2ad18e0ce8194c9d7f8983f8d90d8fd Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 15:46:49 +0200 Subject: [PATCH 124/130] languages/cmake: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/cmake.nix | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/modules/plugins/languages/cmake.nix b/modules/plugins/languages/cmake.nix index a0610d46..a602fddf 100644 --- a/modules/plugins/languages/cmake.nix +++ b/modules/plugins/languages/cmake.nix @@ -7,25 +7,15 @@ inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.modules) mkIf mkMerge; + inherit (lib) genAttrs; inherit (lib.meta) getExe; inherit (lib.types) enum listOf package; - inherit (lib.nvim.attrsets) mapListToAttrs; inherit (lib.nvim.types) mkGrammarOption; cfg = config.vim.languages.cmake; defaultServers = ["neocmakelsp"]; - servers = { - neocmakelsp = { - enable = true; - cmd = [(getExe pkgs.neocmakelsp) "stdio"]; - filetypes = ["cmake"]; - root_markers = [".gersemirc" ".git" "build" "cmake"]; - capabilities = { - textDocument.completion.completionItem.snippetSupport = true; - }; - }; - }; + servers = ["neocmakelsp"]; defaultFormat = "gersemi"; formats = { @@ -55,7 +45,7 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "CMake LSP servers to use"; }; @@ -90,12 +80,13 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["cmake"]; + root_markers = ["build" "cmake"]; + }); + }; }) (mkIf cfg.format.enable { From 58f73dc76a54c4f340a8367f5e6968ee446d9e0c Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 15:48:20 +0200 Subject: [PATCH 125/130] languages/clojure: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/clojure.nix | 28 ++++++++++----------------- 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/modules/plugins/languages/clojure.nix b/modules/plugins/languages/clojure.nix index decaf926..1a10fafb 100644 --- a/modules/plugins/languages/clojure.nix +++ b/modules/plugins/languages/clojure.nix @@ -4,25 +4,16 @@ lib, ... }: let - inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption literalExpression; 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.attrsets) mapListToAttrs; cfg = config.vim.languages.clojure; defaultServers = ["clojure-lsp"]; - servers = { - clojure-lsp = { - enable = true; - cmd = [(getExe pkgs.clojure-lsp)]; - filetypes = ["clojure" "edn"]; - root_markers = ["project.clj" "deps.edn" "build.boot" "shadow-cljs.edn" ".git" "bb.edn"]; - }; - }; + servers = ["clojure-lsp"]; in { options.vim.languages.clojure = { enable = mkEnableOption "Clojure language support"; @@ -45,7 +36,7 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; description = "Clojure LSP server to use"; }; @@ -54,12 +45,13 @@ in { config = mkIf cfg.enable (mkMerge [ (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["clojure" "edn"]; + root_markers = ["deps.edn" "build.boot" "shadow-cljs.edn" "bb.edn"]; + }); + }; }) (mkIf cfg.treesitter.enable { From c5a83d3a6a5d851001a3846222ccbca7d9d5b884 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 12 Apr 2026 15:50:27 +0200 Subject: [PATCH 126/130] languages/clang: refactor lsp.servers to use lsp/presets/ --- modules/plugins/languages/clang.nix | 147 +++------------------------- 1 file changed, 11 insertions(+), 136 deletions(-) diff --git a/modules/plugins/languages/clang.nix b/modules/plugins/languages/clang.nix index 5115ed2a..844074a5 100644 --- a/modules/plugins/languages/clang.nix +++ b/modules/plugins/languages/clang.nix @@ -6,141 +6,16 @@ }: let inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption literalExpression; - inherit (lib.types) bool enum package; - inherit (lib.meta) getExe; + inherit (lib.types) bool enum package listOf; + inherit (lib) genAttrs; inherit (lib.modules) mkIf mkMerge; - inherit (lib.generators) mkLuaInline; - inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; - inherit (lib.nvim.attrsets) mapListToAttrs; + inherit (lib.nvim.types) mkGrammarOption; inherit (lib.nvim.dag) entryAfter; cfg = config.vim.languages.clang; defaultServers = ["clangd"]; - servers = { - ccls = { - cmd = [(getExe pkgs.ccls)]; - filetypes = ["c" "cpp" "objc" "objcpp" "cuda"]; - offset_encoding = "utf-32"; - root_markers = ["compile_commands.json" ".ccls" ".git"]; - workspace_required = true; - on_attach = mkLuaInline '' - function(client, bufnr) - local function switch_source_header(bufnr) - local method_name = "textDocument/switchSourceHeader" - local params = vim.lsp.util.make_text_document_params(bufnr) - client:request(method_name, params, function(err, result) - if err then - error(tostring(err)) - end - if not result then - vim.notify('corresponding file cannot be determined') - return - end - vim.cmd.edit(vim.uri_to_fname(result)) - end, bufnr) - end - - vim.api.nvim_buf_create_user_command( - bufnr, - "LspCclsSwitchSourceHeader", - function(arg) - switch_source_header(client, 0) - end, - {desc = "Switch between source/header"} - ) - end - ''; - }; - - clangd = { - cmd = ["${pkgs.clang-tools}/bin/clangd"]; - filetypes = ["c" "cpp" "objc" "objcpp" "cuda" "proto"]; - root_markers = [ - ".clangd" - ".clang-tidy" - ".clang-format" - "compile_commands.json" - "compile_flags.txt" - "configure.ac" - ".git" - ]; - capabilities = { - textDocument = { - completion = { - editsNearCursor = true; - }; - }; - offsetEncoding = ["utf-8" "utf-16"]; - }; - on_attach = mkLuaInline '' - function(client, bufnr) - local function switch_source_header(bufnr) - local method_name = "textDocument/switchSourceHeader" - local client = vim.lsp.get_clients({ bufnr = bufnr, name = "clangd", })[1] - if not client then - return vim.notify(('method %s is not supported by any servers active on the current buffer'):format(method_name)) - end - local params = vim.lsp.util.make_text_document_params(bufnr) - client.request(method_name, params, function(err, result) - if err then - error(tostring(err)) - end - if not result then - vim.notify('corresponding file cannot be determined') - return - end - vim.cmd.edit(vim.uri_to_fname(result)) - end, bufnr) - end - - local function symbol_info() - local bufnr = vim.api.nvim_get_current_buf() - local clangd_client = vim.lsp.get_clients({ bufnr = bufnr, name = "clangd" })[1] - if not clangd_client or not clangd_client:supports_method 'textDocument/symbolInfo' then - return vim.notify('Clangd client not found', vim.log.levels.ERROR) - end - local win = vim.api.nvim_get_current_win() - local params = vim.lsp.util.make_position_params(win, clangd_client.offset_encoding) - clangd_client:request('textDocument/symbolInfo', params, function(err, res) - if err or #res == 0 then - -- Clangd always returns an error, there is not reason to parse it - return - end - local container = string.format('container: %s', res[1].containerName) ---@type string - local name = string.format('name: %s', res[1].name) ---@type string - vim.lsp.util.open_floating_preview({ name, container }, "", { - height = 2, - width = math.max(string.len(name), string.len(container)), - focusable = false, - focus = false, - border = 'single', - title = 'Symbol Info', - }) - end, bufnr) - end - - vim.api.nvim_buf_create_user_command( - bufnr, - "ClangdSwitchSourceHeader", - function(arg) - switch_source_header(0) - end, - {desc = "Switch between source/header"} - ) - - vim.api.nvim_buf_create_user_command( - bufnr, - "ClangdShowSymbolInfo", - function(arg) - symbol_info() - end, - {desc = "Show symbol info"} - ) - end - ''; - }; - }; + servers = ["ccls" "clangd"]; defaultDebugger = "lldb-vscode"; debuggers = { @@ -204,7 +79,7 @@ in { servers = mkOption { description = "The clang LSP server to use"; - type = deprecatedSingleOrListOf "vim.language.clang.lsp.servers" (enum (attrNames servers)); + type = listOf (enum servers); default = defaultServers; }; }; @@ -240,12 +115,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (name: { - inherit name; - value = servers.${name}; - }) - cfg.lsp.servers; + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["c" "cpp" "objc" "objcpp" "cuda" "proto"]; + }); + }; }) (mkIf cfg.dap.enable { From a3aa4e49d12555e654c70ce97bff894e4ea65250 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Mon, 13 Apr 2026 08:34:26 +0200 Subject: [PATCH 127/130] chore: preset enable docs --- docs/manual/release-notes/rl-0.9.md | 3 +- lib/types/default.nix | 2 + lib/types/lsp.nix | 12 ++ modules/extra/deprecations.nix | 6 + .../lsp/presets/arduino-language-server.nix | 4 +- modules/plugins/lsp/presets/asm-lsp.nix | 4 +- .../lsp/presets/astro-language-server.nix | 4 +- modules/plugins/lsp/presets/basedpyright.nix | 4 +- .../lsp/presets/bash-language-server.nix | 4 +- modules/plugins/lsp/presets/ccls.nix | 4 +- modules/plugins/lsp/presets/clangd.nix | 4 +- modules/plugins/lsp/presets/clojure-lsp.nix | 4 +- modules/plugins/lsp/presets/cue.nix | 4 +- modules/plugins/lsp/presets/dart.nix | 4 +- modules/plugins/lsp/presets/deno.nix | 4 +- modules/plugins/lsp/presets/elixir-ls.nix | 4 +- .../lsp/presets/elm-language-server.nix | 4 +- modules/plugins/lsp/presets/emmet-ls.nix | 4 +- .../plugins/lsp/presets/fsautocomplete.nix | 4 +- modules/plugins/lsp/presets/gleam.nix | 4 +- modules/plugins/lsp/presets/glsl_analyzer.nix | 4 +- modules/plugins/lsp/presets/gopls.nix | 4 +- modules/plugins/lsp/presets/harper.nix | 63 +++++----- modules/plugins/lsp/presets/helm-ls.nix | 4 +- modules/plugins/lsp/presets/intelephense.nix | 4 +- .../lsp/presets/jdt-language-server.nix | 4 +- modules/plugins/lsp/presets/jinja-lsp.nix | 4 +- modules/plugins/lsp/presets/jq-lsp.nix | 4 +- .../lsp/presets/julia-languageserver.nix | 4 +- modules/plugins/lsp/presets/just-lsp.nix | 4 +- .../lsp/presets/kotlin-language-server.nix | 4 +- modules/plugins/lsp/presets/lemminx.nix | 4 +- .../lsp/presets/lua-language-server.nix | 4 +- .../plugins/lsp/presets/markdown-oxide.nix | 4 +- modules/plugins/lsp/presets/marksman.nix | 4 +- modules/plugins/lsp/presets/neocmakelsp.nix | 4 +- modules/plugins/lsp/presets/nil.nix | 4 +- modules/plugins/lsp/presets/nimlsp.nix | 4 +- modules/plugins/lsp/presets/nixd.nix | 4 +- modules/plugins/lsp/presets/nushell.nix | 4 +- modules/plugins/lsp/presets/ocaml-lsp.nix | 4 +- modules/plugins/lsp/presets/ols.nix | 4 +- modules/plugins/lsp/presets/openscad-lsp.nix | 4 +- modules/plugins/lsp/presets/phan.nix | 4 +- modules/plugins/lsp/presets/phpactor.nix | 4 +- modules/plugins/lsp/presets/pyrefly.nix | 4 +- modules/plugins/lsp/presets/pyright.nix | 4 +- .../plugins/lsp/presets/python-lsp-server.nix | 4 +- modules/plugins/lsp/presets/qmlls.nix | 4 +- .../plugins/lsp/presets/r-languageserver.nix | 4 +- modules/plugins/lsp/presets/ruby-lsp.nix | 4 +- modules/plugins/lsp/presets/ruff.nix | 4 +- modules/plugins/lsp/presets/rumdl.nix | 4 +- modules/plugins/lsp/presets/solargraph.nix | 4 +- modules/plugins/lsp/presets/sqls.nix | 4 +- modules/plugins/lsp/presets/superhtml.nix | 4 +- .../lsp/presets/svelte-language-server.nix | 4 +- .../presets/tailwindcss-language-server.nix | 118 +++++++++--------- modules/plugins/lsp/presets/taplo.nix | 4 +- modules/plugins/lsp/presets/terraform-ls.nix | 4 +- modules/plugins/lsp/presets/texlab.nix | 4 +- modules/plugins/lsp/presets/tinymist.nix | 4 +- modules/plugins/lsp/presets/tofu-ls.nix | 4 +- modules/plugins/lsp/presets/tombi.nix | 4 +- .../lsp/presets/twig-language-server.nix | 4 +- modules/plugins/lsp/presets/ty.nix | 4 +- modules/plugins/lsp/presets/typescript-go.nix | 4 +- .../presets/typescript-language-server.nix | 4 +- .../lsp/presets/vala-language-server.nix | 4 +- .../presets/vscode-css-language-server.nix | 4 +- .../presets/vscode-json-language-server.nix | 4 +- modules/plugins/lsp/presets/wgsl-analyzer.nix | 4 +- .../lsp/presets/yaml-language-server.nix | 4 +- modules/plugins/lsp/presets/zls.nix | 4 +- modules/plugins/lsp/presets/zuban.nix | 4 +- 75 files changed, 252 insertions(+), 228 deletions(-) create mode 100644 lib/types/lsp.nix diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index b0e53071..0271b4bc 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -270,7 +270,8 @@ [Snoweuph](https://github.com/snoweuph) - Added `vim.lsp.presets.` to contain LSP configurations. This allows for - more flexibility in nvf and reuse of LSPs across languages. + more flexibility in nvf and reuse of LSPs across languages. Dropped + `deprecatedSingleOrListOf` in favor of `listOf` for the affected LSP options. - Fix `vim.lsp.presets.vala-language-server` to be wrapped correctly with `uncrustify`. diff --git a/lib/types/default.nix b/lib/types/default.nix index 66adfbbc..f6c43483 100644 --- a/lib/types/default.nix +++ b/lib/types/default.nix @@ -5,10 +5,12 @@ typesDag = import ./dag.nix {inherit lib;}; typesPlugin = import ./plugins.nix {inherit lib self;}; typesLanguage = import ./languages.nix {inherit lib;}; + typesLsp = import ./lsp.nix {inherit lib;}; customTypes = import ./custom.nix {inherit lib;}; in { inherit (typesDag) dagOf; inherit (typesPlugin) pluginsOpt extraPluginType mkPluginSetupOption luaInline pluginType borderType; inherit (typesLanguage) diagnostics mkGrammarOption; + inherit (typesLsp) mkLspPresetEnableOption; inherit (customTypes) char hexColor mergelessListOf deprecatedSingleOrListOf; } diff --git a/lib/types/lsp.nix b/lib/types/lsp.nix new file mode 100644 index 00000000..d05b8783 --- /dev/null +++ b/lib/types/lsp.nix @@ -0,0 +1,12 @@ +{lib}: let + inherit (lib.options) mkEnableOption; + + mkLspPresetEnableOption = option: display: fileTypes: + mkEnableOption '' + the ${display} Language Server. + Default `filetypes = ${lib.generators.toPretty {} fileTypes}`. + Use {option}`vim.lsp.servers.${option}` for customization + ''; +in { + inherit mkLspPresetEnableOption; +} diff --git a/modules/extra/deprecations.nix b/modules/extra/deprecations.nix index 39c4b96c..91e31404 100644 --- a/modules/extra/deprecations.nix +++ b/modules/extra/deprecations.nix @@ -344,5 +344,11 @@ in { [ (mkRenamedOptionModule ["vim" "treesitter" "foldByDefault"] ["vim" "options" "foldenable"]) ] + + # 2026-13-04 + [ + (mkRenamedOptionModule ["vim" "lsp" "harper-ls" "enable"] ["vim" "lsp" "presets" "harper" "enable"]) + (mkRenamedOptionModule ["vim" "lsp" "harper-ls" "settings"] ["vim" "lsp" "servers" "harper" "settings"]) + ] ]; } diff --git a/modules/plugins/lsp/presets/arduino-language-server.nix b/modules/plugins/lsp/presets/arduino-language-server.nix index 0280f215..af492255 100644 --- a/modules/plugins/lsp/presets/arduino-language-server.nix +++ b/modules/plugins/lsp/presets/arduino-language-server.nix @@ -6,13 +6,13 @@ }: let inherit (lib.meta) getExe getExe'; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; inherit (lib.generators) mkLuaInline; cfg = config.vim.lsp.presets.arduino-language-server; in { options.vim.lsp.presets.arduino-language-server = { - enable = mkEnableOption "the Arduino Language Server"; + enable = mkLspPresetEnableOption "arduino-language-server" "Arduino" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/asm-lsp.nix b/modules/plugins/lsp/presets/asm-lsp.nix index 87e0a268..da2d187e 100644 --- a/modules/plugins/lsp/presets/asm-lsp.nix +++ b/modules/plugins/lsp/presets/asm-lsp.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.asm-lsp; in { options.vim.lsp.presets.asm-lsp = { - enable = mkEnableOption "the Assembly Language Server"; + enable = mkLspPresetEnableOption "asm-lsp" "Assembly" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/astro-language-server.nix b/modules/plugins/lsp/presets/astro-language-server.nix index 8dbd9f35..fdf96ccd 100644 --- a/modules/plugins/lsp/presets/astro-language-server.nix +++ b/modules/plugins/lsp/presets/astro-language-server.nix @@ -6,13 +6,13 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; inherit (lib.generators) mkLuaInline; cfg = config.vim.lsp.presets.astro-language-server; in { options.vim.lsp.presets.astro-language-server = { - enable = mkEnableOption "the Astro Language Server"; + enable = mkLspPresetEnableOption "astro-language-server" "Astro" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/basedpyright.nix b/modules/plugins/lsp/presets/basedpyright.nix index 4e9b5b07..3ea7b547 100644 --- a/modules/plugins/lsp/presets/basedpyright.nix +++ b/modules/plugins/lsp/presets/basedpyright.nix @@ -6,14 +6,14 @@ }: let inherit (lib.meta) getExe'; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; inherit (lib.generators) mkLuaInline; inherit (lib.nvim.dag) entryBefore; cfg = config.vim.lsp.presets.basedpyright; in { options.vim.lsp.presets.basedpyright = { - enable = mkEnableOption "the Based Pyright Language Server"; + enable = mkLspPresetEnableOption "basedpyright" "Based Pyright" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/bash-language-server.nix b/modules/plugins/lsp/presets/bash-language-server.nix index 047e726d..786a1638 100644 --- a/modules/plugins/lsp/presets/bash-language-server.nix +++ b/modules/plugins/lsp/presets/bash-language-server.nix @@ -6,13 +6,13 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; inherit (lib.generators) mkLuaInline; cfg = config.vim.lsp.presets.bash-language-server; in { options.vim.lsp.presets.bash-language-server = { - enable = mkEnableOption "the Bash Language Server"; + enable = mkLspPresetEnableOption "bash-language-server" "Bash" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/ccls.nix b/modules/plugins/lsp/presets/ccls.nix index 47c5643d..5f46a2ba 100644 --- a/modules/plugins/lsp/presets/ccls.nix +++ b/modules/plugins/lsp/presets/ccls.nix @@ -6,13 +6,13 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; inherit (lib.generators) mkLuaInline; cfg = config.vim.lsp.presets.ccls; in { options.vim.lsp.presets.ccls = { - enable = mkEnableOption "the CC Language Server"; + enable = mkLspPresetEnableOption "ccls" "CC" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/clangd.nix b/modules/plugins/lsp/presets/clangd.nix index 0c7943fa..49bffb04 100644 --- a/modules/plugins/lsp/presets/clangd.nix +++ b/modules/plugins/lsp/presets/clangd.nix @@ -6,13 +6,13 @@ }: let inherit (lib.meta) getExe'; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; inherit (lib.generators) mkLuaInline; cfg = config.vim.lsp.presets.clangd; in { options.vim.lsp.presets.clangd = { - enable = mkEnableOption "the Clangd Language Server"; + enable = mkLspPresetEnableOption "clangd" "Clangd" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/clojure-lsp.nix b/modules/plugins/lsp/presets/clojure-lsp.nix index 280a0da6..a51276d5 100644 --- a/modules/plugins/lsp/presets/clojure-lsp.nix +++ b/modules/plugins/lsp/presets/clojure-lsp.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.clojure-lsp; in { options.vim.lsp.presets.clojure-lsp = { - enable = mkEnableOption "the Clojure Language Server"; + enable = mkLspPresetEnableOption "clojure-lsp" "Clojure" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/cue.nix b/modules/plugins/lsp/presets/cue.nix index bf7b73b1..433792f2 100644 --- a/modules/plugins/lsp/presets/cue.nix +++ b/modules/plugins/lsp/presets/cue.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.cue; in { options.vim.lsp.presets.cue = { - enable = mkEnableOption "the CUE Language Server"; + enable = mkLspPresetEnableOption "cue" "Cue" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/dart.nix b/modules/plugins/lsp/presets/dart.nix index e8800abd..f99275ba 100644 --- a/modules/plugins/lsp/presets/dart.nix +++ b/modules/plugins/lsp/presets/dart.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.dart; in { options.vim.lsp.presets.dart = { - enable = mkEnableOption "the Dart Language Server"; + enable = mkLspPresetEnableOption "dart" "Dart" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/deno.nix b/modules/plugins/lsp/presets/deno.nix index 92aa16b6..637d219d 100644 --- a/modules/plugins/lsp/presets/deno.nix +++ b/modules/plugins/lsp/presets/deno.nix @@ -6,13 +6,13 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; inherit (lib.generators) mkLuaInline; cfg = config.vim.lsp.presets.deno; in { options.vim.lsp.presets.deno = { - enable = mkEnableOption "the Deno Language Server"; + enable = mkLspPresetEnableOption "deno" "Deno" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/elixir-ls.nix b/modules/plugins/lsp/presets/elixir-ls.nix index e1749f25..f4b16268 100644 --- a/modules/plugins/lsp/presets/elixir-ls.nix +++ b/modules/plugins/lsp/presets/elixir-ls.nix @@ -6,13 +6,13 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; inherit (lib.generators) mkLuaInline; cfg = config.vim.lsp.presets.elixir-ls; in { options.vim.lsp.presets.elixir-ls = { - enable = mkEnableOption "the Elixir Language Server"; + enable = mkLspPresetEnableOption "elixir-ls" "Elixir" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/elm-language-server.nix b/modules/plugins/lsp/presets/elm-language-server.nix index db7f82d9..ee3c97fb 100644 --- a/modules/plugins/lsp/presets/elm-language-server.nix +++ b/modules/plugins/lsp/presets/elm-language-server.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.elm-language-server; in { options.vim.lsp.presets.elm-language-server = { - enable = mkEnableOption "the Elm Language Server"; + enable = mkLspPresetEnableOption "elm-language-server" "Elm" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/emmet-ls.nix b/modules/plugins/lsp/presets/emmet-ls.nix index 4886115f..42e6fd1f 100644 --- a/modules/plugins/lsp/presets/emmet-ls.nix +++ b/modules/plugins/lsp/presets/emmet-ls.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.emmet-ls; in { options.vim.lsp.presets.emmet-ls = { - enable = mkEnableOption "the Emmet Language Server"; + enable = mkLspPresetEnableOption "emmet-ls" "Emmet" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/fsautocomplete.nix b/modules/plugins/lsp/presets/fsautocomplete.nix index 8fcd5e39..d5b95de1 100644 --- a/modules/plugins/lsp/presets/fsautocomplete.nix +++ b/modules/plugins/lsp/presets/fsautocomplete.nix @@ -6,13 +6,13 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; inherit (lib.generators) mkLuaInline; cfg = config.vim.lsp.presets.fsautocomplete; in { options.vim.lsp.presets.fsautocomplete = { - enable = mkEnableOption "the F# Autocomplete Language Server"; + enable = mkLspPresetEnableOption "fsautocomplete" "F# Autocomplete" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/gleam.nix b/modules/plugins/lsp/presets/gleam.nix index a98c313c..46b21e87 100644 --- a/modules/plugins/lsp/presets/gleam.nix +++ b/modules/plugins/lsp/presets/gleam.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.gleam; in { options.vim.lsp.presets.gleam = { - enable = mkEnableOption "the Gleam Language Server"; + enable = mkLspPresetEnableOption "gleam" "Gleam" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/glsl_analyzer.nix b/modules/plugins/lsp/presets/glsl_analyzer.nix index f548f792..9b7798de 100644 --- a/modules/plugins/lsp/presets/glsl_analyzer.nix +++ b/modules/plugins/lsp/presets/glsl_analyzer.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.glsl_analyzer; in { options.vim.lsp.presets.glsl_analyzer = { - enable = mkEnableOption "the GLSL-Analyzer Language Server"; + enable = mkLspPresetEnableOption "glsl_analyzer" "GLSL Analyzer" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/gopls.nix b/modules/plugins/lsp/presets/gopls.nix index 3a95738f..9432dcd8 100644 --- a/modules/plugins/lsp/presets/gopls.nix +++ b/modules/plugins/lsp/presets/gopls.nix @@ -6,13 +6,13 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; inherit (lib.generators) mkLuaInline; cfg = config.vim.lsp.presets.gopls; in { options.vim.lsp.presets.gopls = { - enable = mkEnableOption "the official Go Language Server"; + enable = mkLspPresetEnableOption "gopls" "Go" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/harper.nix b/modules/plugins/lsp/presets/harper.nix index 3739e937..9fce2230 100644 --- a/modules/plugins/lsp/presets/harper.nix +++ b/modules/plugins/lsp/presets/harper.nix @@ -6,12 +6,41 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.harper; + filetypes = [ + # + "asciidoc" + "c" + "clojure" + "cmake" + "cpp" + "cs" + "daml" + "dart" + "gitcommit" + "go" + "haskell" + "html" + "ink" + "java" + "javascript" + "javascriptreact" + "kotlin" + "lhaskell" + "lua" + "mail" + "markdown" + "nix" + "php" + "python" + "ruby" + "rust" + ]; in { options.vim.lsp.presets.harper = { - enable = mkEnableOption "the Harper grammar checking LSP"; + enable = mkLspPresetEnableOption "harper" "Harper" filetypes; }; config = mkIf cfg.enable { @@ -19,35 +48,7 @@ in { enable = true; cmd = [(getExe pkgs.harper) "--stdio"]; root_markers = [".git" ".harper-dictionary.txt"]; - filetypes = [ - # - "asciidoc" - "c" - "clojure" - "cmake" - "cpp" - "cs" - "daml" - "dart" - "gitcommit" - "go" - "haskell" - "html" - "ink" - "java" - "javascript" - "javascriptreact" - "kotlin" - "lhaskell" - "lua" - "mail" - "markdown" - "nix" - "php" - "python" - "ruby" - "rust" - ]; + inherit filetypes; }; }; } diff --git a/modules/plugins/lsp/presets/helm-ls.nix b/modules/plugins/lsp/presets/helm-ls.nix index 735d7266..e0398f8e 100644 --- a/modules/plugins/lsp/presets/helm-ls.nix +++ b/modules/plugins/lsp/presets/helm-ls.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.helm-ls; in { options.vim.lsp.presets.helm-ls = { - enable = mkEnableOption "the Helm Language Server"; + enable = mkLspPresetEnableOption "helm-ls" "Helm" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/intelephense.nix b/modules/plugins/lsp/presets/intelephense.nix index da0edbbb..a15c039e 100644 --- a/modules/plugins/lsp/presets/intelephense.nix +++ b/modules/plugins/lsp/presets/intelephense.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.intelephense; in { options.vim.lsp.presets.intelephense = { - enable = mkEnableOption "the Intelephense Language Server"; + enable = mkLspPresetEnableOption "intelephense" "Intelephense" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/jdt-language-server.nix b/modules/plugins/lsp/presets/jdt-language-server.nix index fc5e2900..c00125c9 100644 --- a/modules/plugins/lsp/presets/jdt-language-server.nix +++ b/modules/plugins/lsp/presets/jdt-language-server.nix @@ -6,14 +6,14 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; inherit (lib.generators) mkLuaInline; inherit (lib.nvim.dag) entryBefore; cfg = config.vim.lsp.presets.jdt-language-server; in { options.vim.lsp.presets.jdt-language-server = { - enable = mkEnableOption "the Eclipse JDT Language Server"; + enable = mkLspPresetEnableOption "jdt-language-server" "Eclipse JDT" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/jinja-lsp.nix b/modules/plugins/lsp/presets/jinja-lsp.nix index 5d1ce099..a60ea7ef 100644 --- a/modules/plugins/lsp/presets/jinja-lsp.nix +++ b/modules/plugins/lsp/presets/jinja-lsp.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.jinja-lsp; in { options.vim.lsp.presets.jinja-lsp = { - enable = mkEnableOption "the Jinja Language Server"; + enable = mkLspPresetEnableOption "jinja-lsp" "Jinja" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/jq-lsp.nix b/modules/plugins/lsp/presets/jq-lsp.nix index f886f9c6..2f695a68 100644 --- a/modules/plugins/lsp/presets/jq-lsp.nix +++ b/modules/plugins/lsp/presets/jq-lsp.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.jq-lsp; in { options.vim.lsp.presets.jq-lsp = { - enable = mkEnableOption "the JQ Language Server"; + enable = mkLspPresetEnableOption "jq-lsp" "JQ" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/julia-languageserver.nix b/modules/plugins/lsp/presets/julia-languageserver.nix index 0fcd7440..61b5d290 100644 --- a/modules/plugins/lsp/presets/julia-languageserver.nix +++ b/modules/plugins/lsp/presets/julia-languageserver.nix @@ -6,14 +6,14 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; inherit (lib.generators) mkLuaInline; inherit (lib.nvim.dag) entryBefore; cfg = config.vim.lsp.presets.julia-languageserver; in { options.vim.lsp.presets.julia-languageserver = { - enable = mkEnableOption "the Julia Language Server"; + enable = mkLspPresetEnableOption "julia-languageserver" "Julia" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/just-lsp.nix b/modules/plugins/lsp/presets/just-lsp.nix index 509c22d9..acb48c80 100644 --- a/modules/plugins/lsp/presets/just-lsp.nix +++ b/modules/plugins/lsp/presets/just-lsp.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.just-lsp; in { options.vim.lsp.presets.just-lsp = { - enable = mkEnableOption "the Just Language Server"; + enable = mkLspPresetEnableOption "just-lsp" "Just" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/kotlin-language-server.nix b/modules/plugins/lsp/presets/kotlin-language-server.nix index 9d71f316..0c68b3bb 100644 --- a/modules/plugins/lsp/presets/kotlin-language-server.nix +++ b/modules/plugins/lsp/presets/kotlin-language-server.nix @@ -6,13 +6,13 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; inherit (lib.generators) mkLuaInline; cfg = config.vim.lsp.presets.kotlin-language-server; in { options.vim.lsp.presets.kotlin-language-server = { - enable = mkEnableOption "the Kotlin Language Server"; + enable = mkLspPresetEnableOption "kotlin-language-server" "Kotlin" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/lemminx.nix b/modules/plugins/lsp/presets/lemminx.nix index 4d6e9e68..b8cbf0bd 100644 --- a/modules/plugins/lsp/presets/lemminx.nix +++ b/modules/plugins/lsp/presets/lemminx.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.lemminx; in { options.vim.lsp.presets.lemminx = { - enable = mkEnableOption "Lemminx Language Server"; + enable = mkLspPresetEnableOption "lemminx" "Lemminx" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/lua-language-server.nix b/modules/plugins/lsp/presets/lua-language-server.nix index 5c89ad26..f5e13447 100644 --- a/modules/plugins/lsp/presets/lua-language-server.nix +++ b/modules/plugins/lsp/presets/lua-language-server.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.lua-language-server; in { options.vim.lsp.presets.lua-language-server = { - enable = mkEnableOption "the Lua Language Server"; + enable = mkLspPresetEnableOption "lua-language-server" "Lua" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/markdown-oxide.nix b/modules/plugins/lsp/presets/markdown-oxide.nix index 96af3cda..8eadd99b 100644 --- a/modules/plugins/lsp/presets/markdown-oxide.nix +++ b/modules/plugins/lsp/presets/markdown-oxide.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.markdown-oxide; in { options.vim.lsp.presets.markdown-oxide = { - enable = mkEnableOption "the Markdown-Oxide Language Server"; + enable = mkLspPresetEnableOption "markdown-oxide" "Markdown Oxide" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/marksman.nix b/modules/plugins/lsp/presets/marksman.nix index 5bc296dc..ce40190e 100644 --- a/modules/plugins/lsp/presets/marksman.nix +++ b/modules/plugins/lsp/presets/marksman.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.marksman; in { options.vim.lsp.presets.marksman = { - enable = mkEnableOption "the Marksman Language Server"; + enable = mkLspPresetEnableOption "marksman" "Marksman" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/neocmakelsp.nix b/modules/plugins/lsp/presets/neocmakelsp.nix index 31e64769..730857ce 100644 --- a/modules/plugins/lsp/presets/neocmakelsp.nix +++ b/modules/plugins/lsp/presets/neocmakelsp.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.neocmakelsp; in { options.vim.lsp.presets.neocmakelsp = { - enable = mkEnableOption "the Neo CMake Language Server"; + enable = mkLspPresetEnableOption "neocmakelsp" "NeoCmake" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/nil.nix b/modules/plugins/lsp/presets/nil.nix index e59e24fd..f27adedb 100644 --- a/modules/plugins/lsp/presets/nil.nix +++ b/modules/plugins/lsp/presets/nil.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.nil; in { options.vim.lsp.presets.nil = { - enable = mkEnableOption "the Nil Nix Language Server"; + enable = mkLspPresetEnableOption "nil" "Nil" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/nimlsp.nix b/modules/plugins/lsp/presets/nimlsp.nix index e52e9cee..f8f376f8 100644 --- a/modules/plugins/lsp/presets/nimlsp.nix +++ b/modules/plugins/lsp/presets/nimlsp.nix @@ -6,13 +6,13 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; inherit (lib.generators) mkLuaInline; cfg = config.vim.lsp.presets.nimlsp; in { options.vim.lsp.presets.nimlsp = { - enable = mkEnableOption "the Nim Language Server"; + enable = mkLspPresetEnableOption "nimlsp" "Nim" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/nixd.nix b/modules/plugins/lsp/presets/nixd.nix index 6f1326be..a8202c61 100644 --- a/modules/plugins/lsp/presets/nixd.nix +++ b/modules/plugins/lsp/presets/nixd.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.nixd; in { options.vim.lsp.presets.nixd = { - enable = mkEnableOption "the NixD Language Server"; + enable = mkLspPresetEnableOption "nixd" "Nixd" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/nushell.nix b/modules/plugins/lsp/presets/nushell.nix index 1f253825..485d2990 100644 --- a/modules/plugins/lsp/presets/nushell.nix +++ b/modules/plugins/lsp/presets/nushell.nix @@ -6,13 +6,13 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; inherit (lib.generators) mkLuaInline; cfg = config.vim.lsp.presets.nushell; in { options.vim.lsp.presets.nushell = { - enable = mkEnableOption "the NuShell Language Server"; + enable = mkLspPresetEnableOption "nushell" "NuShell" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/ocaml-lsp.nix b/modules/plugins/lsp/presets/ocaml-lsp.nix index 0e9b0952..a98ba8dd 100644 --- a/modules/plugins/lsp/presets/ocaml-lsp.nix +++ b/modules/plugins/lsp/presets/ocaml-lsp.nix @@ -6,13 +6,13 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; inherit (lib.generators) mkLuaInline; cfg = config.vim.lsp.presets.ocaml-lsp; in { options.vim.lsp.presets.ocaml-lsp = { - enable = mkEnableOption "the OCaml Language Server"; + enable = mkLspPresetEnableOption "ocaml-lsp" "OCaml" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/ols.nix b/modules/plugins/lsp/presets/ols.nix index 9eb4e3ad..0f2dc4d0 100644 --- a/modules/plugins/lsp/presets/ols.nix +++ b/modules/plugins/lsp/presets/ols.nix @@ -6,13 +6,13 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; inherit (lib.generators) mkLuaInline; cfg = config.vim.lsp.presets.ols; in { options.vim.lsp.presets.ols = { - enable = mkEnableOption "the Odin Language Server"; + enable = mkLspPresetEnableOption "ols" "Odin" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/openscad-lsp.nix b/modules/plugins/lsp/presets/openscad-lsp.nix index d271c8d3..78392f3e 100644 --- a/modules/plugins/lsp/presets/openscad-lsp.nix +++ b/modules/plugins/lsp/presets/openscad-lsp.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.openscad-lsp; in { options.vim.lsp.presets.openscad-lsp = { - enable = mkEnableOption "the Open SCAD Language Server"; + enable = mkLspPresetEnableOption "openscad-lsp" "Open SCAD" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/phan.nix b/modules/plugins/lsp/presets/phan.nix index 281da772..c259d4fb 100644 --- a/modules/plugins/lsp/presets/phan.nix +++ b/modules/plugins/lsp/presets/phan.nix @@ -6,13 +6,13 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; inherit (lib.generators) mkLuaInline; cfg = config.vim.lsp.presets.phan; in { options.vim.lsp.presets.phan = { - enable = mkEnableOption "the Phan Language Server"; + enable = mkLspPresetEnableOption "phan" "Phan" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/phpactor.nix b/modules/plugins/lsp/presets/phpactor.nix index 57e2ee24..3bcd062f 100644 --- a/modules/plugins/lsp/presets/phpactor.nix +++ b/modules/plugins/lsp/presets/phpactor.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.phpactor; in { options.vim.lsp.presets.phpactor = { - enable = mkEnableOption "the PHPActor Language Server"; + enable = mkLspPresetEnableOption "phpactor" "PHPActor" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/pyrefly.nix b/modules/plugins/lsp/presets/pyrefly.nix index 18db921a..30623c34 100644 --- a/modules/plugins/lsp/presets/pyrefly.nix +++ b/modules/plugins/lsp/presets/pyrefly.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.pyrefly; in { options.vim.lsp.presets.pyrefly = { - enable = mkEnableOption "the Pyrefly Language Server"; + enable = mkLspPresetEnableOption "pyrefly" "Pyrefly" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/pyright.nix b/modules/plugins/lsp/presets/pyright.nix index b7367bc2..69122718 100644 --- a/modules/plugins/lsp/presets/pyright.nix +++ b/modules/plugins/lsp/presets/pyright.nix @@ -6,14 +6,14 @@ }: let inherit (lib.meta) getExe'; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; inherit (lib.generators) mkLuaInline; inherit (lib.nvim.dag) entryBefore; cfg = config.vim.lsp.presets.pyright; in { options.vim.lsp.presets.pyright = { - enable = mkEnableOption "the Pyright Language Server"; + enable = mkLspPresetEnableOption "pyright" "Pyright" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/python-lsp-server.nix b/modules/plugins/lsp/presets/python-lsp-server.nix index 7408a7f3..2d6a41de 100644 --- a/modules/plugins/lsp/presets/python-lsp-server.nix +++ b/modules/plugins/lsp/presets/python-lsp-server.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.python-lsp-server; in { options.vim.lsp.presets.python-lsp-server = { - enable = mkEnableOption "the Python Language Server"; + enable = mkLspPresetEnableOption "python-lsp-server" "Python" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/qmlls.nix b/modules/plugins/lsp/presets/qmlls.nix index 7a3af64f..9c39b9e6 100644 --- a/modules/plugins/lsp/presets/qmlls.nix +++ b/modules/plugins/lsp/presets/qmlls.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe'; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.qmlls; in { options.vim.lsp.presets.qmlls = { - enable = mkEnableOption "the QML Language Server"; + enable = mkLspPresetEnableOption "qmlls" "QML" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/r-languageserver.nix b/modules/plugins/lsp/presets/r-languageserver.nix index 9e83eecd..ed126f05 100644 --- a/modules/plugins/lsp/presets/r-languageserver.nix +++ b/modules/plugins/lsp/presets/r-languageserver.nix @@ -6,13 +6,13 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; inherit (lib.generators) mkLuaInline; cfg = config.vim.lsp.presets.r-languageserver; in { options.vim.lsp.presets.r-languageserver = { - enable = mkEnableOption "the R Language Server"; + enable = mkLspPresetEnableOption "r-languageserver" "R" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/ruby-lsp.nix b/modules/plugins/lsp/presets/ruby-lsp.nix index 2b5f633b..eb9ffb1d 100644 --- a/modules/plugins/lsp/presets/ruby-lsp.nix +++ b/modules/plugins/lsp/presets/ruby-lsp.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.ruby-lsp; in { options.vim.lsp.presets.ruby-lsp = { - enable = mkEnableOption "the Ruby Language Server"; + enable = mkLspPresetEnableOption "ruby-lsp" "Ruby" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/ruff.nix b/modules/plugins/lsp/presets/ruff.nix index 28775b7b..aadabc26 100644 --- a/modules/plugins/lsp/presets/ruff.nix +++ b/modules/plugins/lsp/presets/ruff.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.ruff; in { options.vim.lsp.presets.ruff = { - enable = mkEnableOption "the Ruff Python Language Server"; + enable = mkLspPresetEnableOption "ruff" "Ruff" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/rumdl.nix b/modules/plugins/lsp/presets/rumdl.nix index c616cd94..3486d540 100644 --- a/modules/plugins/lsp/presets/rumdl.nix +++ b/modules/plugins/lsp/presets/rumdl.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.rumdl; in { options.vim.lsp.presets.rumdl = { - enable = mkEnableOption "the Rumdl Language Server"; + enable = mkLspPresetEnableOption "rumdl" "Rumdl" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/solargraph.nix b/modules/plugins/lsp/presets/solargraph.nix index fcd64e4a..131cbfc2 100644 --- a/modules/plugins/lsp/presets/solargraph.nix +++ b/modules/plugins/lsp/presets/solargraph.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.solargraph; in { options.vim.lsp.presets.solargraph = { - enable = mkEnableOption "the Ruby Solargraph Language Server"; + enable = mkLspPresetEnableOption "solargraph" "Solargraph" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/sqls.nix b/modules/plugins/lsp/presets/sqls.nix index 02a411b9..b15df552 100644 --- a/modules/plugins/lsp/presets/sqls.nix +++ b/modules/plugins/lsp/presets/sqls.nix @@ -6,13 +6,13 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; inherit (lib.generators) mkLuaInline; cfg = config.vim.lsp.presets.sqls; in { options.vim.lsp.presets.sqls = { - enable = mkEnableOption "the SQL Language Server"; + enable = mkLspPresetEnableOption "sqls" "SQL" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/superhtml.nix b/modules/plugins/lsp/presets/superhtml.nix index 376c8ddd..e32907ef 100644 --- a/modules/plugins/lsp/presets/superhtml.nix +++ b/modules/plugins/lsp/presets/superhtml.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.superhtml; in { options.vim.lsp.presets.superhtml = { - enable = mkEnableOption "the SuperHTML Language Server"; + enable = mkLspPresetEnableOption "superhtml" "SuperHTML" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/svelte-language-server.nix b/modules/plugins/lsp/presets/svelte-language-server.nix index 423378c4..2ba922af 100644 --- a/modules/plugins/lsp/presets/svelte-language-server.nix +++ b/modules/plugins/lsp/presets/svelte-language-server.nix @@ -6,13 +6,13 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; inherit (lib.generators) mkLuaInline; cfg = config.vim.lsp.presets.svelte-language-server; in { options.vim.lsp.presets.svelte-language-server = { - enable = mkEnableOption "the Svelete Language Server"; + enable = mkLspPresetEnableOption "svelte-language-server" "Svelte" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/tailwindcss-language-server.nix b/modules/plugins/lsp/presets/tailwindcss-language-server.nix index e2dc37de..846a063d 100644 --- a/modules/plugins/lsp/presets/tailwindcss-language-server.nix +++ b/modules/plugins/lsp/presets/tailwindcss-language-server.nix @@ -6,13 +6,70 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; inherit (lib.generators) mkLuaInline; cfg = config.vim.lsp.presets.tailwindcss-language-server; + + filetypes = [ + # html + "aspnetcorerazor" + "astro" + "astro-markdown" + "blade" + "clojure" + "django-html" + "htmldjango" + "edge" + "eelixir" + "elixir" + "ejs" + "erb" + "eruby" + "gohtml" + "gohtmltmpl" + "haml" + "handlebars" + "hbs" + "html" + "htmlangular" + "html-eex" + "heex" + "jade" + "leaf" + "liquid" + "markdown" + "mdx" + "mustache" + "njk" + "nunjucks" + "php" + "razor" + "slim" + "twig" + # css + "css" + "less" + "postcss" + "sass" + "scss" + "stylus" + "sugarss" + # js + "javascript" + "javascriptreact" + "reason" + "rescript" + "typescript" + "typescriptreact" + # mixed + "vue" + "svelte" + "templ" + ]; in { options.vim.lsp.presets.tailwindcss-language-server = { - enable = mkEnableOption "the Tailwind CSS Language Server"; + enable = mkLspPresetEnableOption "tailwindcss-language-server" "Tailwind CSS" filetypes; }; config = mkIf cfg.enable { @@ -20,62 +77,7 @@ in { enable = true; cmd = [(getExe pkgs.tailwindcss-language-server) "--stdio"]; root_markers = [".git"]; - filetypes = [ - # html - "aspnetcorerazor" - "astro" - "astro-markdown" - "blade" - "clojure" - "django-html" - "htmldjango" - "edge" - "eelixir" - "elixir" - "ejs" - "erb" - "eruby" - "gohtml" - "gohtmltmpl" - "haml" - "handlebars" - "hbs" - "html" - "htmlangular" - "html-eex" - "heex" - "jade" - "leaf" - "liquid" - "markdown" - "mdx" - "mustache" - "njk" - "nunjucks" - "php" - "razor" - "slim" - "twig" - # css - "css" - "less" - "postcss" - "sass" - "scss" - "stylus" - "sugarss" - # js - "javascript" - "javascriptreact" - "reason" - "rescript" - "typescript" - "typescriptreact" - # mixed - "vue" - "svelte" - "templ" - ]; + inherit filetypes; settings = { tailwindCSS = { validate = true; diff --git a/modules/plugins/lsp/presets/taplo.nix b/modules/plugins/lsp/presets/taplo.nix index 6cd0aed3..9908b9c6 100644 --- a/modules/plugins/lsp/presets/taplo.nix +++ b/modules/plugins/lsp/presets/taplo.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.taplo; in { options.vim.lsp.presets.taplo = { - enable = mkEnableOption "the Taplo Language Server"; + enable = mkLspPresetEnableOption "taplo" "Taplo" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/terraform-ls.nix b/modules/plugins/lsp/presets/terraform-ls.nix index 26c4c54b..d2814cf7 100644 --- a/modules/plugins/lsp/presets/terraform-ls.nix +++ b/modules/plugins/lsp/presets/terraform-ls.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.terraform-ls; in { options.vim.lsp.presets.terraform-ls = { - enable = mkEnableOption "the Terraform Language Server"; + enable = mkLspPresetEnableOption "terrraform-ls" "Terraform" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/texlab.nix b/modules/plugins/lsp/presets/texlab.nix index 13c6ddf4..5739253e 100644 --- a/modules/plugins/lsp/presets/texlab.nix +++ b/modules/plugins/lsp/presets/texlab.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.texlab; in { options.vim.lsp.presets.texlab = { - enable = mkEnableOption "the TeXLab Language Server"; + enable = mkLspPresetEnableOption "texlab" "TeXLab" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/tinymist.nix b/modules/plugins/lsp/presets/tinymist.nix index e261cd32..8f8684f2 100644 --- a/modules/plugins/lsp/presets/tinymist.nix +++ b/modules/plugins/lsp/presets/tinymist.nix @@ -6,13 +6,13 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; inherit (lib.generators) mkLuaInline; cfg = config.vim.lsp.presets.tinymist; in { options.vim.lsp.presets.tinymist = { - enable = mkEnableOption "Tinymist Language Server"; + enable = mkLspPresetEnableOption "tinymist" "Tinymist" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/tofu-ls.nix b/modules/plugins/lsp/presets/tofu-ls.nix index 0b3d25df..0532471e 100644 --- a/modules/plugins/lsp/presets/tofu-ls.nix +++ b/modules/plugins/lsp/presets/tofu-ls.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.tofu-ls; in { options.vim.lsp.presets.tofu-ls = { - enable = mkEnableOption "the OpenTofu Language Server"; + enable = mkLspPresetEnableOption "tofu-ls" "OpenTofu" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/tombi.nix b/modules/plugins/lsp/presets/tombi.nix index 189ab6d6..868abeb6 100644 --- a/modules/plugins/lsp/presets/tombi.nix +++ b/modules/plugins/lsp/presets/tombi.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.tombi; in { options.vim.lsp.presets.tombi = { - enable = mkEnableOption "the Tombi Language Server (AI Slop)"; + enable = mkLspPresetEnableOption "tombi" "Tombi (AI Slop)" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/twig-language-server.nix b/modules/plugins/lsp/presets/twig-language-server.nix index 6a2c71d3..1668310c 100644 --- a/modules/plugins/lsp/presets/twig-language-server.nix +++ b/modules/plugins/lsp/presets/twig-language-server.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.twig-language-server; in { options.vim.lsp.presets.twig-language-server = { - enable = mkEnableOption "Twig Language Server"; + enable = mkLspPresetEnableOption "twig-language-server" "Twig" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/ty.nix b/modules/plugins/lsp/presets/ty.nix index 869fcb3c..8468dde9 100644 --- a/modules/plugins/lsp/presets/ty.nix +++ b/modules/plugins/lsp/presets/ty.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.ty; in { options.vim.lsp.presets.ty = { - enable = mkEnableOption "the ty Python Language Server"; + enable = mkLspPresetEnableOption "ty" "ty" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/typescript-go.nix b/modules/plugins/lsp/presets/typescript-go.nix index 9be995f8..121fad29 100644 --- a/modules/plugins/lsp/presets/typescript-go.nix +++ b/modules/plugins/lsp/presets/typescript-go.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.typescript-go; in { options.vim.lsp.presets.typescript-go = { - enable = mkEnableOption "the experimental Typescript Go Language Server"; + enable = mkLspPresetEnableOption "typescript-go" "experimental TypeScript Go" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/typescript-language-server.nix b/modules/plugins/lsp/presets/typescript-language-server.nix index bf1dc1f4..efd95cc0 100644 --- a/modules/plugins/lsp/presets/typescript-language-server.nix +++ b/modules/plugins/lsp/presets/typescript-language-server.nix @@ -6,13 +6,13 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; inherit (lib.generators) mkLuaInline; cfg = config.vim.lsp.presets.typescript-language-server; in { options.vim.lsp.presets.typescript-language-server = { - enable = mkEnableOption "the Typescript Language Server"; + enable = mkLspPresetEnableOption "typescript-language-server" "TypeScript" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/vala-language-server.nix b/modules/plugins/lsp/presets/vala-language-server.nix index 0fe5b96e..f7dbc600 100644 --- a/modules/plugins/lsp/presets/vala-language-server.nix +++ b/modules/plugins/lsp/presets/vala-language-server.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.vala-language-server; in { options.vim.lsp.presets.vala-language-server = { - enable = mkEnableOption "the Vala Language Server"; + enable = mkLspPresetEnableOption "vala-language-server" "Vala" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/vscode-css-language-server.nix b/modules/plugins/lsp/presets/vscode-css-language-server.nix index 100d363b..39196aa8 100644 --- a/modules/plugins/lsp/presets/vscode-css-language-server.nix +++ b/modules/plugins/lsp/presets/vscode-css-language-server.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe'; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.vscode-css-language-server; in { options.vim.lsp.presets.vscode-css-language-server = { - enable = mkEnableOption "the VSCode CSS Language Server"; + enable = mkLspPresetEnableOption "vscode-css-language-server" "VSCode CSS" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/vscode-json-language-server.nix b/modules/plugins/lsp/presets/vscode-json-language-server.nix index bcb98291..9a3ff2dd 100644 --- a/modules/plugins/lsp/presets/vscode-json-language-server.nix +++ b/modules/plugins/lsp/presets/vscode-json-language-server.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe'; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.vscode-json-language-server; in { options.vim.lsp.presets.vscode-json-language-server = { - enable = mkEnableOption "the VSCode JSON Language Server"; + enable = mkLspPresetEnableOption "vscode-json-language-server" "VSCode JSON" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/wgsl-analyzer.nix b/modules/plugins/lsp/presets/wgsl-analyzer.nix index 53a3017e..523212c4 100644 --- a/modules/plugins/lsp/presets/wgsl-analyzer.nix +++ b/modules/plugins/lsp/presets/wgsl-analyzer.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.wgsl-analyzer; in { options.vim.lsp.presets.wgsl-analyzer = { - enable = mkEnableOption "the WGSL-Analyzer Language Server"; + enable = mkLspPresetEnableOption "wgsl-analyzer" "WGSL Analyzer" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/yaml-language-server.nix b/modules/plugins/lsp/presets/yaml-language-server.nix index 4ec64603..58204a21 100644 --- a/modules/plugins/lsp/presets/yaml-language-server.nix +++ b/modules/plugins/lsp/presets/yaml-language-server.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.yaml-language-server; in { options.vim.lsp.presets.yaml-language-server = { - enable = mkEnableOption "the YAML Language Server"; + enable = mkLspPresetEnableOption "yaml-language-server" "YAML" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/zls.nix b/modules/plugins/lsp/presets/zls.nix index 9d540928..a9b4d92b 100644 --- a/modules/plugins/lsp/presets/zls.nix +++ b/modules/plugins/lsp/presets/zls.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.zls; in { options.vim.lsp.presets.zls = { - enable = mkEnableOption "the Zig Language Server"; + enable = mkLspPresetEnableOption "zls" "Zig" []; }; config = mkIf cfg.enable { diff --git a/modules/plugins/lsp/presets/zuban.nix b/modules/plugins/lsp/presets/zuban.nix index 3713d912..b7cc7f2d 100644 --- a/modules/plugins/lsp/presets/zuban.nix +++ b/modules/plugins/lsp/presets/zuban.nix @@ -6,12 +6,12 @@ }: let inherit (lib.meta) getExe; inherit (lib.modules) mkIf; - inherit (lib.options) mkEnableOption; + inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.zuban; in { options.vim.lsp.presets.zuban = { - enable = mkEnableOption "the Zuban Python Language Server"; + enable = mkLspPresetEnableOption "zuban" "Zuban" []; }; config = mkIf cfg.enable { From ec8a66bb3c18497af700333c23278f116014c74d Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Tue, 14 Apr 2026 00:51:36 +0200 Subject: [PATCH 128/130] chore: add language..lsp.servers deprecation information --- lib/types/custom.nix | 28 ++++++++++++++++++-- lib/types/default.nix | 2 +- modules/plugins/languages/astro.nix | 9 +++++-- modules/plugins/languages/bash.nix | 9 +++++-- modules/plugins/languages/css.nix | 9 +++++-- modules/plugins/languages/elixir.nix | 9 +++++-- modules/plugins/languages/hcl.nix | 10 +++++-- modules/plugins/languages/java.nix | 11 +++++--- modules/plugins/languages/json.nix | 9 +++++-- modules/plugins/languages/julia.nix | 11 +++++--- modules/plugins/languages/r.nix | 9 +++++-- modules/plugins/languages/ruby.nix | 9 +++++-- modules/plugins/languages/terraform.nix | 10 +++++-- modules/plugins/languages/ts.nix | 11 ++++++-- modules/plugins/languages/vala.nix | 11 +++++--- modules/plugins/lsp/presets/terraform-ls.nix | 2 +- 16 files changed, 126 insertions(+), 33 deletions(-) diff --git a/lib/types/custom.nix b/lib/types/custom.nix index f6905b02..9974070e 100644 --- a/lib/types/custom.nix +++ b/lib/types/custom.nix @@ -1,9 +1,9 @@ {lib}: let - inherit (builtins) toJSON; + inherit (builtins) toJSON attrNames; inherit (lib.options) mergeEqualOption; inherit (lib.lists) singleton; inherit (lib.strings) isString stringLength match; - inherit (lib.types) listOf mkOptionType coercedTo; + inherit (lib.types) listOf mkOptionType coercedTo enum; inherit (lib.trivial) warn; in { mergelessListOf = elemType: @@ -39,4 +39,28 @@ in { '' (singleton x)) (listOf t); + + # Create an enum type for `values`, which additionally accepts deprecated + # values listed in the `renames` attrset as `old = new` pairs. + # + # Example: + # + # vim.languages.typescript.lsp.servers = mkOption { + # type = renamedEnum + # "vim.languages.typescript.lsp.servers" + # ["typescript-language-server" "some-other-server"] + # { ts_ls = "typescript-language-server"; }; + # } + # + # With this option definition, when users enter `ts_ls`, they + # get a warning "`ts_ls` is deprecated, use `typescript-language-server` + # instead", and typescript-language-server is automatically used. + enumWithRename = option: values: renames: + coercedTo (enum (attrNames renames)) ( + old: + warn + "${option}: `${old}` is deprecated, use `${renames.${old}}` instead" + renames.${old} + ) + (enum values); } diff --git a/lib/types/default.nix b/lib/types/default.nix index f6c43483..9b5469db 100644 --- a/lib/types/default.nix +++ b/lib/types/default.nix @@ -12,5 +12,5 @@ in { inherit (typesPlugin) pluginsOpt extraPluginType mkPluginSetupOption luaInline pluginType borderType; inherit (typesLanguage) diagnostics mkGrammarOption; inherit (typesLsp) mkLspPresetEnableOption; - inherit (customTypes) char hexColor mergelessListOf deprecatedSingleOrListOf; + inherit (customTypes) char hexColor mergelessListOf deprecatedSingleOrListOf enumWithRename; } diff --git a/modules/plugins/languages/astro.nix b/modules/plugins/languages/astro.nix index 729e1f69..08dfe17b 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 diagnostics deprecatedSingleOrListOf; + inherit (lib.nvim.types) mkGrammarOption diagnostics deprecatedSingleOrListOf enumWithRename; inherit (lib) genAttrs; cfg = config.vim.languages.astro; @@ -85,7 +85,12 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = listOf (enum servers); + type = listOf (enumWithRename + "vim.languages.astro.lsp.servers" + servers + { + astro = "astro-language-server"; + }); default = defaultServers; description = "Astro LSP server to use"; }; diff --git a/modules/plugins/languages/bash.nix b/modules/plugins/languages/bash.nix index 35e9bda8..be1eaca9 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) diagnostics mkGrammarOption deprecatedSingleOrListOf; + inherit (lib.nvim.types) diagnostics mkGrammarOption deprecatedSingleOrListOf enumWithRename; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.bash; @@ -53,7 +53,12 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = listOf (enum servers); + type = listOf (enumWithRename + "vim.languages.bash.lsp.servers" + servers + { + bash-ls = "bash-language-server"; + }); default = defaultServers; description = "Bash LSP server to use"; }; diff --git a/modules/plugins/languages/css.nix b/modules/plugins/languages/css.nix index fc34ea37..045dd6d5 100644 --- a/modules/plugins/languages/css.nix +++ b/modules/plugins/languages/css.nix @@ -10,7 +10,7 @@ inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; inherit (lib.types) enum listOf; - inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; + inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf enumWithRename; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.css; @@ -56,7 +56,12 @@ in { }; servers = mkOption { - type = listOf (enum servers); + type = listOf (enumWithRename + "vim.languages.css.lsp.servers" + servers + { + cssls = "vscode-css-language-server"; + }); default = defaultServer; description = "CSS LSP server to use"; }; diff --git a/modules/plugins/languages/elixir.nix b/modules/plugins/languages/elixir.nix index 645d4866..4efb5320 100644 --- a/modules/plugins/languages/elixir.nix +++ b/modules/plugins/languages/elixir.nix @@ -9,7 +9,7 @@ inherit (lib.modules) mkIf mkMerge; inherit (lib) genAttrs; inherit (lib.types) enum listOf; - inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; + inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf enumWithRename; inherit (lib.nvim.dag) entryAnywhere; inherit (lib.nvim.attrsets) mapListToAttrs; @@ -48,7 +48,12 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = listOf (enum servers); + type = listOf (enumWithRename + "vim.languages.elixir.lsp.servers" + servers + { + elixirls = "elixir-ls"; + }); default = defaultServers; description = "Elixir LSP server to use"; }; diff --git a/modules/plugins/languages/hcl.nix b/modules/plugins/languages/hcl.nix index 60ad6f5f..32f4945d 100644 --- a/modules/plugins/languages/hcl.nix +++ b/modules/plugins/languages/hcl.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 enumWithRename; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.hcl; @@ -51,7 +51,13 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = listOf (enum servers); + type = listOf (enumWithRename + "vim.languages.hcl.lsp.servers" + servers + { + terraformls-hcl = "terraform-ls"; + tofuls-hcl = "tofu-ls"; + }); default = defaultServers; description = "HCL LSP server to use"; }; diff --git a/modules/plugins/languages/java.nix b/modules/plugins/languages/java.nix index 4f7d0c02..1fad79a3 100644 --- a/modules/plugins/languages/java.nix +++ b/modules/plugins/languages/java.nix @@ -7,8 +7,8 @@ inherit (lib.options) literalExpression mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; inherit (lib) genAttrs; - inherit (lib.types) listOf enum; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.types) listOf; + inherit (lib.nvim.types) mkGrammarOption enumWithRename; cfg = config.vim.languages.java; @@ -36,7 +36,12 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = listOf (enum servers); + type = listOf (enumWithRename + "vim.languages.java.lsp.servers" + servers + { + jdtls = "jdt-language-server"; + }); default = defaultServers; description = "Java LSP server to use"; }; diff --git a/modules/plugins/languages/json.nix b/modules/plugins/languages/json.nix index 5189059c..2c6096f9 100644 --- a/modules/plugins/languages/json.nix +++ b/modules/plugins/languages/json.nix @@ -10,7 +10,7 @@ inherit (lib.modules) mkIf mkMerge; inherit (lib.types) enum listOf; inherit (lib) genAttrs; - inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; + inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf enumWithRename; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.json; @@ -51,7 +51,12 @@ in { }; servers = mkOption { - type = listOf (enum servers); + type = listOf (enumWithRename + "vim.languages.json.lsp.servers" + servers + { + jsonls = "vscode-json-language-server"; + }); default = defaultServers; description = "JSON LSP server to use"; }; diff --git a/modules/plugins/languages/julia.nix b/modules/plugins/languages/julia.nix index d77fc168..51737d2f 100644 --- a/modules/plugins/languages/julia.nix +++ b/modules/plugins/languages/julia.nix @@ -5,10 +5,10 @@ ... }: let inherit (lib.options) literalExpression mkEnableOption mkOption; - inherit (lib.types) enum listOf; + inherit (lib.types) listOf; inherit (lib.modules) mkIf mkMerge; inherit (lib) genAttrs; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.types) mkGrammarOption enumWithRename; cfg = config.vim.languages.julia; @@ -37,7 +37,12 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = listOf (enum servers); + type = listOf (enumWithRename + "vim.languages.julia.lsp.servers" + servers + { + julials = "julia-languageserver"; + }); default = defaultServers; description = '' Julia LSP Server to Use diff --git a/modules/plugins/languages/r.nix b/modules/plugins/languages/r.nix index 240c3334..44addba4 100644 --- a/modules/plugins/languages/r.nix +++ b/modules/plugins/languages/r.nix @@ -9,7 +9,7 @@ inherit (lib.modules) mkIf mkMerge; inherit (lib.types) enum listOf; inherit (lib) genAttrs; - inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; + inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf enumWithRename; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.r; @@ -67,7 +67,12 @@ in { }; servers = mkOption { - type = listOf (enum servers); + type = listOf (enumWithRename + "vim.languages.r.lsp.servers" + servers + { + r_language_server = "r-languageserver"; + }); default = defaultServers; description = "R LSP server to use"; }; diff --git a/modules/plugins/languages/ruby.nix b/modules/plugins/languages/ruby.nix index 392a4bb4..dc6ff702 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 diagnostics deprecatedSingleOrListOf; + inherit (lib.nvim.types) mkGrammarOption diagnostics deprecatedSingleOrListOf enumWithRename; inherit (lib.types) enum listOf; inherit (lib.nvim.attrsets) mapListToAttrs; @@ -56,7 +56,12 @@ in { }; servers = mkOption { - type = listOf (enum servers); + type = listOf (enumWithRename + "vim.languages.ruby.lsp.servers" + servers + { + ruby_lsp = "ruby-lsp"; + }); default = defaultServers; description = "Ruby LSP server to use"; }; diff --git a/modules/plugins/languages/terraform.nix b/modules/plugins/languages/terraform.nix index a3a22048..6269540f 100644 --- a/modules/plugins/languages/terraform.nix +++ b/modules/plugins/languages/terraform.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 enumWithRename; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.terraform; @@ -53,7 +53,13 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = listOf (enum servers); + type = listOf (enumWithRename + "vim.languages.terraform.lsp.servers" + servers + { + terraformls-tf = "terraform-ls"; + tofuls-tf = "tofu-ls"; + }); default = defaultServers; description = "Terraform LSP server to use"; }; diff --git a/modules/plugins/languages/ts.nix b/modules/plugins/languages/ts.nix index 7a91d78e..4c38cba1 100644 --- a/modules/plugins/languages/ts.nix +++ b/modules/plugins/languages/ts.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 diagnostics mkPluginSetupOption deprecatedSingleOrListOf; + inherit (lib.nvim.types) mkGrammarOption diagnostics mkPluginSetupOption deprecatedSingleOrListOf enumWithRename; inherit (lib.nvim.dag) entryAnywhere; cfg = config.vim.languages.ts; @@ -99,7 +99,14 @@ in { }; servers = mkOption { - type = listOf (enum servers); + type = listOf (enumWithRename + "vim.languages.ts.lsp.servers" + servers + { + ts_ls = "typescript-language-server"; + denols = "deno"; + tsgo = "typescript-go"; + }); default = defaultServers; description = "Typescript/Javascript LSP server to use"; }; diff --git a/modules/plugins/languages/vala.nix b/modules/plugins/languages/vala.nix index 4e3eca3d..5defc722 100644 --- a/modules/plugins/languages/vala.nix +++ b/modules/plugins/languages/vala.nix @@ -7,8 +7,8 @@ inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.modules) mkIf mkMerge; inherit (lib) genAttrs; - inherit (lib.types) enum listOf; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.types) listOf; + inherit (lib.nvim.types) mkGrammarOption enumWithRename; cfg = config.vim.languages.vala; @@ -36,7 +36,12 @@ in { defaultText = literalExpression "config.vim.lsp.enable"; }; servers = mkOption { - type = listOf (enum servers); + type = listOf (enumWithRename + "vim.languages.vala.lsp.servers" + servers + { + vala_ls = "vala-language-server"; + }); default = defaultServers; description = "Vala LSP server to use"; }; diff --git a/modules/plugins/lsp/presets/terraform-ls.nix b/modules/plugins/lsp/presets/terraform-ls.nix index d2814cf7..fce5d2fe 100644 --- a/modules/plugins/lsp/presets/terraform-ls.nix +++ b/modules/plugins/lsp/presets/terraform-ls.nix @@ -11,7 +11,7 @@ cfg = config.vim.lsp.presets.terraform-ls; in { options.vim.lsp.presets.terraform-ls = { - enable = mkLspPresetEnableOption "terrraform-ls" "Terraform" []; + enable = mkLspPresetEnableOption "terraform-ls" "Terraform" []; }; config = mkIf cfg.enable { From 6e31cd0d5eaf1a6c7c8c1344f743e8a151b3ffe4 Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Wed, 15 Apr 2026 19:45:14 +0200 Subject: [PATCH 129/130] docs: fix links --- docs/manual/configuring/dag-entries.md | 4 ++-- docs/manual/hacking.md | 2 +- docs/manual/release-notes/rl-0.7.md | 2 +- docs/manual/release-notes/rl-0.9.md | 2 +- docs/manual/tips/offline-docs.md | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/manual/configuring/dag-entries.md b/docs/manual/configuring/dag-entries.md index 88c580be..500638e6 100644 --- a/docs/manual/configuring/dag-entries.md +++ b/docs/manual/configuring/dag-entries.md @@ -18,8 +18,8 @@ entries in nvf: 6. `lazyConfigs` - `lz.n` and `lzn-auto-require` configs. If `vim.lazy.enable` is false, this will contain each plugin's config instead. 7. `pluginConfigs` - the result of the nested `vim.pluginRC` (internal option, - see the [Custom Plugins](/index.xhtml#ch-custom-plugins) page for adding your - own plugins) DAG, used to set up internal plugins + see the [Custom Plugins](./configuring.html#ch-custom-plugins) page for + adding your own plugins) DAG, used to set up internal plugins 8. `extraPluginConfigs` - the result of `vim.extraPlugins`, which is not a direct DAG, but is converted to, and resolved as one internally 9. `mappings` - the result of `vim.maps` diff --git a/docs/manual/hacking.md b/docs/manual/hacking.md index 37430e67..7a6e150d 100644 --- a/docs/manual/hacking.md +++ b/docs/manual/hacking.md @@ -91,7 +91,7 @@ consistency and to avoid clashing opinions on how formatters should behave, we are very opinionated on how those files should be formatted. - Nix files **must** be formatted with the Alejandra formatter, following some - specific tips found in [Nix style section](#nix-sec-code-style-nix). + specific tips found in [Nix style section](#sec-code-style-nix). - Markdown files **must** be formatted with the `deno fmt` command, as described in the [Markdown style section](#sec-code-style-markdown). diff --git a/docs/manual/release-notes/rl-0.7.md b/docs/manual/release-notes/rl-0.7.md index 36d61105..098d77ac 100644 --- a/docs/manual/release-notes/rl-0.7.md +++ b/docs/manual/release-notes/rl-0.7.md @@ -10,7 +10,7 @@ In v0.7 we are removing `vim.configRC` in favor of making `vim.luaConfigRC` the top-level DAG, and thereby making the entire configuration Lua based. This change introduces a few breaking changes: -[DAG entries in nvf manual]: /index.xhtml#ch-dag-entries +[DAG entries in nvf manual]: ./configuring.html#ch-dag-entries - `vim.configRC` has been removed, which means that you have to convert all of your custom vimscript-based configuration to Lua. As for how to do that, you diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index 0271b4bc..50b6e3a2 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -249,7 +249,7 @@ - Added [Pyrefly](https://pyrefly.org/) and [zuban](https://zubanls.com/) support to `languages.python` -- Added TOML support via {option}`languages.toml` and the +- Added TOML support via {option}`vim.languages.toml.enable` and the [Tombi](https://tombi-toml.github.io/tombi/) language server, linter, and formatter. diff --git a/docs/manual/tips/offline-docs.md b/docs/manual/tips/offline-docs.md index ed11d965..d8c6f021 100644 --- a/docs/manual/tips/offline-docs.md +++ b/docs/manual/tips/offline-docs.md @@ -1,11 +1,11 @@ # Offline Documentation {#sec-offline-documentation} -[https://notashelf.github.io/nvf/options.html]: https://notashelf.github.io/nvf/options.html +[https://nvf.notashelf.dev/options.html]: https://nvf.notashelf.dev/options.html The manpages provided by nvf contains an offline version of the option search -normally available at [https://notashelf.github.io/nvf/options.html]. You may -use the `man 5 nvf` command to view option documentation from the comfort of -your terminal. +normally available at [https://nvf.notashelf.dev/options.html]. You may use the +`man 5 nvf` command to view option documentation from the comfort of your +terminal. Note that this is only available for NixOS and Home-Manager module installations. From fc9e9a6f2794391ca7070408a6e4cde5b9328b5b Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Wed, 15 Apr 2026 20:27:48 +0200 Subject: [PATCH 130/130] chore: add missing nix deprecation for tailwind change in #1514 --- modules/extra/deprecations.nix | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/extra/deprecations.nix b/modules/extra/deprecations.nix index 91e31404..3edd23c8 100644 --- a/modules/extra/deprecations.nix +++ b/modules/extra/deprecations.nix @@ -349,6 +349,9 @@ in { [ (mkRenamedOptionModule ["vim" "lsp" "harper-ls" "enable"] ["vim" "lsp" "presets" "harper" "enable"]) (mkRenamedOptionModule ["vim" "lsp" "harper-ls" "settings"] ["vim" "lsp" "servers" "harper" "settings"]) + (mkRenamedOptionModule ["vim" "languages" "tailwind" "enable"] ["vim" "lsp" "presets" "tailwindcss-language-server" "enable"]) + (mkRenamedOptionModule ["vim" "languages" "tailwind" "lsp" "enable"] ["vim" "lsp" "presets" "tailwindcss-language-server" "enable"]) + (mkRenamedOptionModule ["vim" "languages" "tailwind" "lsp" "servers"] ["vim" "lsp" "presets" "tailwindcss-language-server" "enable"]) ] ]; }