From 852c378bf98a41339b383149618f487433e7284e Mon Sep 17 00:00:00 2001 From: sjcobb Date: Thu, 15 May 2025 13:49:25 +0100 Subject: [PATCH 001/109] new options perhaps? --- modules/plugins/languages/nix.nix | 131 +++++++++++++++--------------- 1 file changed, 67 insertions(+), 64 deletions(-) diff --git a/modules/plugins/languages/nix.nix b/modules/plugins/languages/nix.nix index aceee70d..29715162 100644 --- a/modules/plugins/languages/nix.nix +++ b/modules/plugins/languages/nix.nix @@ -12,9 +12,10 @@ inherit (lib.modules) mkIf mkMerge; inherit (lib.lists) isList; inherit (lib.strings) optionalString; - inherit (lib.types) anything attrsOf enum either listOf nullOr package str; + inherit (lib.types) anything attrsOf enum either listOf nullOr package str oneOf; inherit (lib.nvim.types) mkGrammarOption diagnostics; inherit (lib.nvim.lua) expToLua toLuaObject; + inherit (lib.nvim.languages) lspOptions; cfg = config.vim.languages.nix; @@ -30,70 +31,70 @@ nil = { package = inputs.nil.packages.${pkgs.stdenv.system}.nil; internalFormatter = true; - lspConfig = '' - lspconfig.nil_ls.setup{ - capabilities = capabilities, - ${ - if cfg.format.enable - then useFormat - else noFormat - }, - cmd = ${packageToCmd cfg.lsp.package "nil"}, - ${optionalString cfg.format.enable '' - settings = { - ["nil"] = { - ${optionalString (cfg.format.type == "alejandra") - '' - formatting = { - command = {"${cfg.format.package}/bin/alejandra", "--quiet"}, - }, - ''} - ${optionalString (cfg.format.type == "nixfmt") - '' - formatting = { - command = {"${cfg.format.package}/bin/nixfmt"}, - }, - ''} - }, - }, - ''} - } - ''; + # lspConfig = '' + # lspconfig.nil_ls.setup{ + # capabilities = capabilities, + # ${ + # if cfg.format.enable + # then useFormat + # else noFormat + # }, + # cmd = ${packageToCmd cfg.lsp.package "nil"}, + # ${optionalString cfg.format.enable '' + # settings = { + # ["nil"] = { + # ${optionalString (cfg.format.type == "alejandra") + # '' + # formatting = { + # command = {"${cfg.format.package}/bin/alejandra", "--quiet"}, + # }, + # ''} + # ${optionalString (cfg.format.type == "nixfmt") + # '' + # formatting = { + # command = {"${cfg.format.package}/bin/nixfmt"}, + # }, + # ''} + # }, + # }, + # ''} + # } + # ''; }; nixd = { package = pkgs.nixd; internalFormatter = true; - lspConfig = '' - lspconfig.nixd.setup{ - capabilities = capabilities, - ${ - if cfg.format.enable - then useFormat - else noFormat - }, - cmd = ${packageToCmd cfg.lsp.package "nixd"}, - ${optionalString cfg.format.enable '' - settings = { - nixd = { - ${optionalString (cfg.format.type == "alejandra") - '' - formatting = { - command = {"${cfg.format.package}/bin/alejandra", "--quiet"}, - }, - ''} - ${optionalString (cfg.format.type == "nixfmt") - '' - formatting = { - command = {"${cfg.format.package}/bin/nixfmt"}, - }, - ''} - options = ${toLuaObject cfg.lsp.options}, - }, - }, - ''} - } - ''; + # lspConfig = '' + # lspconfig.nixd.setup{ + # capabilities = capabilities, + # ${ + # if cfg.format.enable + # then useFormat + # else noFormat + # }, + # cmd = ${packageToCmd cfg.lsp.package "nixd"}, + # ${optionalString cfg.format.enable '' + # settings = { + # nixd = { + # ${optionalString (cfg.format.type == "alejandra") + # '' + # formatting = { + # command = {"${cfg.format.package}/bin/alejandra", "--quiet"}, + # }, + # ''} + # ${optionalString (cfg.format.type == "nixfmt") + # '' + # formatting = { + # command = {"${cfg.format.package}/bin/nixfmt"}, + # }, + # ''} + # options = ${toLuaObject cfg.lsp.options}, + # }, + # }, + # ''} + # } + # ''; }; }; @@ -146,8 +147,11 @@ in { lsp = { enable = mkEnableOption "Nix LSP support" // {default = config.vim.lsp.enable;}; server = mkOption { - description = "Nix LSP server to use"; - type = enum (attrNames servers); + description = "Nix LSP server(s) to use"; + type = listOf oneOf [ + (attrsOf lspOptions) + (enum (attrNames servers)) + ]; default = defaultServer; }; @@ -218,8 +222,7 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.nix-lsp = servers.${cfg.lsp.server}.lspConfig; + vim.lsp.servers = cfg.lsp.server; }) (mkIf (cfg.format.enable && (!cfg.lsp.enable || !servers.${cfg.lsp.server}.internalFormatter)) { From bc93d67416d2a8d125828e092f6c70304404ed40 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Tue, 20 May 2025 15:44:57 +0100 Subject: [PATCH 002/109] Initialize changes for nix --- lib/languages.nix | 41 ++++++++- modules/neovim/init/lsp.nix | 47 ++++++++-- modules/plugins/languages/nix.nix | 140 ++++++++---------------------- 3 files changed, 116 insertions(+), 112 deletions(-) diff --git a/lib/languages.nix b/lib/languages.nix index c4074144..556c38cf 100644 --- a/lib/languages.nix +++ b/lib/languages.nix @@ -1,9 +1,13 @@ {lib}: let inherit (builtins) isString getAttr; inherit (lib.options) mkOption; - inherit (lib.types) listOf bool str submodule attrsOf anything either nullOr; + inherit (lib.strings) concatStringsSep; + inherit (lib.types) listOf bool str submodule attrsOf anything either nullOr oneOf enum; + inherit (lib.attrsets) attrNames; inherit (lib.nvim.attrsets) mapListToAttrs; inherit (lib.nvim.types) luaInline; + inherit (lib.lists) isList; + inherit (lib) genAttrs recursiveUpdate; in { # TODO: remove diagnosticsToLua = { @@ -34,6 +38,18 @@ in { description = "Turn on ${desc} for enabled languages by default"; }; + # resolveLspOptions + # servers: AttrsOf lspOptions + # selected: AttrsOf lspOptions | List of string keys from servers + # Returns: AttrsOf lspOptions + resolveLspOptions = { + servers, + selected, + }: + if isList selected + then genAttrs selected (name: servers.${name}) + else selected; + lspOptions = submodule { freeformType = attrsOf anything; options = { @@ -77,4 +93,27 @@ in { }; }; }; + + mkLspOption = {servers, ...} @ args: let + serverNames = attrNames servers; + defaultAttrs = { + type = oneOf [ + (attrsOf lib.nvim.languages.lspOptions) + (listOf (enum serverNames)) + ]; + description = '' + Either a full set of selected LSP options as an attribute set, + or a list of server names from: ${concatStringsSep ", " serverNames}. + ''; + default = {}; + example = { + clangd = { + filetypes = ["c"]; + root_markers = ["CMakeLists.txt"]; + }; + }; + }; + cleanedArgs = removeAttrs args ["servers"]; + in + mkOption (recursiveUpdate defaultAttrs cleanedArgs); } diff --git a/modules/neovim/init/lsp.nix b/modules/neovim/init/lsp.nix index b89c3fde..1b22388c 100644 --- a/modules/neovim/init/lsp.nix +++ b/modules/neovim/init/lsp.nix @@ -18,12 +18,36 @@ lspConfigurations = mapAttrsToList ( - name: value: '' - vim.lsp.config["${name}"] = ${toLuaObject value} - '' + # TODO: Determine the best thing to do about merging in lspconfig + name: value: + /* + lua + */ + ''vim.lsp.config["${name}"] = ${toLuaObject value}'' ) cfg.servers; + # Approach 1: + # Create function perhaps called mkLspConfig + # mkLspConfig servers; + # that expands to something like + # vim.lsp.servers = cfg.lsp.servers...... + # vim.luaConfigRC.lspconfigMerge = entryAfter ["lsp-servers"] ''vim.lsp.config["${name}"] = vim.tbl_deep_extend("force", lspconfig.${name}, vim.lsp.config["${name}"])'' + + + # Approach 2: + # lspConfigurations = + # mapAttrsToList ( + # name: value: ''vim.lsp.config["${name}"] = vim.tbl_deep_extend("force", lspconfig.${name}, ${toLuaObject value})'' + # ) + # (filterAttrs (n: _: n != "*") cfg.servers); + # Then also need to configure global * settings + # globalConfiguration = + # mapAttrsToList ( + # name: value: ''vim.lsp.config["${name}"] = ${toLuaObject value}'' + # ) + # (filterAttrs (n: _: n == "*") cfg.servers); + enabledServers = filterAttrs (_: u: u.enable) cfg.servers; in { options = { @@ -81,13 +105,18 @@ in { } (mkIf (cfg.servers != {}) { - vim.luaConfigRC.lsp-servers = entryAnywhere '' - -- Individual LSP configurations managed by nvf. - ${concatLines lspConfigurations} + vim.luaConfigRC.lsp-servers = + entryAnywhere + # Or entryAfter ["lspconfig"] if we go with the second approach + /* + lua + */ + '' + ${concatLines lspConfigurations} - -- Enable configured LSPs explicitly - vim.lsp.enable(${toLuaObject (filter (name: name != "*") (attrNames enabledServers))}) - ''; + -- Enable configured LSPs explicitly + vim.lsp.enable(${toLuaObject (filter (name: name != "*") (attrNames enabledServers))}); + ''; }) ]; } diff --git a/modules/plugins/languages/nix.nix b/modules/plugins/languages/nix.nix index 29715162..39f2a76b 100644 --- a/modules/plugins/languages/nix.nix +++ b/modules/plugins/languages/nix.nix @@ -2,99 +2,54 @@ config, pkgs, lib, - inputs, ... }: let inherit (builtins) attrNames; inherit (lib) concatStringsSep; + inherit (lib.generators) mkLuaInline; inherit (lib.meta) getExe; inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; inherit (lib.lists) isList; - inherit (lib.strings) optionalString; - inherit (lib.types) anything attrsOf enum either listOf nullOr package str oneOf; + inherit (lib.types) enum package; inherit (lib.nvim.types) mkGrammarOption diagnostics; - inherit (lib.nvim.lua) expToLua toLuaObject; - inherit (lib.nvim.languages) lspOptions; + inherit (lib.nvim.lua) expToLua; + inherit (lib.nvim.languages) resolveLspOptions mkLspOption; cfg = config.vim.languages.nix; - useFormat = "on_attach = default_on_attach"; - noFormat = "on_attach = attach_keymaps"; - - defaultServer = "nil"; packageToCmd = package: defaultCmd: if isList package then expToLua package else ''{"${package}/bin/${defaultCmd}"}''; + + formattingCmd = lib.mkIf (cfg.format.enable && cfg.lsp.enable) { + formatting = lib.mkMerge [ + (lib.mkIf (cfg.format.type == "alejandra") { + command = ["${cfg.format.package}/bin/alejandra" "--quiet"]; + }) + (lib.mkIf (cfg.format.type == "nixfmt") { + command = ["${cfg.format.package}/bin/nixfmt"]; + }) + ]; + }; + + defaultServers = ["nil_ls"] servers = { - nil = { - package = inputs.nil.packages.${pkgs.stdenv.system}.nil; - internalFormatter = true; - # lspConfig = '' - # lspconfig.nil_ls.setup{ - # capabilities = capabilities, - # ${ - # if cfg.format.enable - # then useFormat - # else noFormat - # }, - # cmd = ${packageToCmd cfg.lsp.package "nil"}, - # ${optionalString cfg.format.enable '' - # settings = { - # ["nil"] = { - # ${optionalString (cfg.format.type == "alejandra") - # '' - # formatting = { - # command = {"${cfg.format.package}/bin/alejandra", "--quiet"}, - # }, - # ''} - # ${optionalString (cfg.format.type == "nixfmt") - # '' - # formatting = { - # command = {"${cfg.format.package}/bin/nixfmt"}, - # }, - # ''} - # }, - # }, - # ''} - # } - # ''; + nil_ls = { + enable = true; + cmd = ["${pkgs.nil}/bin/nil"]; + settings = { + nil = formattingCmd; + }; }; nixd = { - package = pkgs.nixd; - internalFormatter = true; - # lspConfig = '' - # lspconfig.nixd.setup{ - # capabilities = capabilities, - # ${ - # if cfg.format.enable - # then useFormat - # else noFormat - # }, - # cmd = ${packageToCmd cfg.lsp.package "nixd"}, - # ${optionalString cfg.format.enable '' - # settings = { - # nixd = { - # ${optionalString (cfg.format.type == "alejandra") - # '' - # formatting = { - # command = {"${cfg.format.package}/bin/alejandra", "--quiet"}, - # }, - # ''} - # ${optionalString (cfg.format.type == "nixfmt") - # '' - # formatting = { - # command = {"${cfg.format.package}/bin/nixfmt"}, - # }, - # ''} - # options = ${toLuaObject cfg.lsp.options}, - # }, - # }, - # ''} - # } - # ''; + enable = true; + cmd = ["${pkgs.nixd}/bin/nixd"]; + settings = { + nixd = formattingCmd; + }; }; }; @@ -146,26 +101,9 @@ in { lsp = { enable = mkEnableOption "Nix LSP support" // {default = config.vim.lsp.enable;}; - server = mkOption { - description = "Nix LSP server(s) to use"; - type = listOf oneOf [ - (attrsOf lspOptions) - (enum (attrNames servers)) - ]; - default = defaultServer; - }; - - package = mkOption { - description = "Nix LSP server package, or the command to run as a list of strings"; - example = ''[lib.getExe pkgs.jdt-language-server "-data" "~/.cache/jdtls/workspace"]''; - type = either package (listOf str); - default = servers.${cfg.lsp.server}.package; - }; - - options = mkOption { - type = nullOr (attrsOf anything); - default = null; - description = "Options to pass to nixd LSP server"; + servers = mkLspOption { + inherit servers; + default = defaultServers; }; }; @@ -206,13 +144,6 @@ in { ${concatStringsSep ", " (attrNames formats)} ''; } - { - assertion = cfg.lsp.server != "rnix"; - message = '' - rnix-lsp has been archived upstream. Please use one of the following available language servers: - ${concatStringsSep ", " (attrNames servers)} - ''; - } ]; } @@ -222,10 +153,15 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = cfg.lsp.server; + # TODO: Map this to include lspconfig stuff so that we can do + vim.lsp.servers = resolveLspOptions { + inherit servers; + selected = cfg.lsp.servers; + }; }) - (mkIf (cfg.format.enable && (!cfg.lsp.enable || !servers.${cfg.lsp.server}.internalFormatter)) { + # TODO: Figure out what do here. This is not necessarily correct as other lsps might not have formatting by default + (mkIf (cfg.format.enable && !cfg.lsp.enable) { vim.formatter.conform-nvim = { enable = true; setupOpts.formatters_by_ft.nix = [cfg.format.type]; From 7ae81ca51b45b20be295cfcdd78ce6ff9531389d Mon Sep 17 00:00:00 2001 From: sjcobb Date: Thu, 22 May 2025 14:48:14 +0100 Subject: [PATCH 003/109] simplify and remove unnecessary stuff --- lib/languages.nix | 41 +-------------------------- modules/neovim/init/lsp.nix | 47 ++++++------------------------- modules/plugins/languages/nix.nix | 33 +++++++++++----------- 3 files changed, 27 insertions(+), 94 deletions(-) diff --git a/lib/languages.nix b/lib/languages.nix index 556c38cf..c4074144 100644 --- a/lib/languages.nix +++ b/lib/languages.nix @@ -1,13 +1,9 @@ {lib}: let inherit (builtins) isString getAttr; inherit (lib.options) mkOption; - inherit (lib.strings) concatStringsSep; - inherit (lib.types) listOf bool str submodule attrsOf anything either nullOr oneOf enum; - inherit (lib.attrsets) attrNames; + inherit (lib.types) listOf bool str submodule attrsOf anything either nullOr; inherit (lib.nvim.attrsets) mapListToAttrs; inherit (lib.nvim.types) luaInline; - inherit (lib.lists) isList; - inherit (lib) genAttrs recursiveUpdate; in { # TODO: remove diagnosticsToLua = { @@ -38,18 +34,6 @@ in { description = "Turn on ${desc} for enabled languages by default"; }; - # resolveLspOptions - # servers: AttrsOf lspOptions - # selected: AttrsOf lspOptions | List of string keys from servers - # Returns: AttrsOf lspOptions - resolveLspOptions = { - servers, - selected, - }: - if isList selected - then genAttrs selected (name: servers.${name}) - else selected; - lspOptions = submodule { freeformType = attrsOf anything; options = { @@ -93,27 +77,4 @@ in { }; }; }; - - mkLspOption = {servers, ...} @ args: let - serverNames = attrNames servers; - defaultAttrs = { - type = oneOf [ - (attrsOf lib.nvim.languages.lspOptions) - (listOf (enum serverNames)) - ]; - description = '' - Either a full set of selected LSP options as an attribute set, - or a list of server names from: ${concatStringsSep ", " serverNames}. - ''; - default = {}; - example = { - clangd = { - filetypes = ["c"]; - root_markers = ["CMakeLists.txt"]; - }; - }; - }; - cleanedArgs = removeAttrs args ["servers"]; - in - mkOption (recursiveUpdate defaultAttrs cleanedArgs); } diff --git a/modules/neovim/init/lsp.nix b/modules/neovim/init/lsp.nix index 1b22388c..b89c3fde 100644 --- a/modules/neovim/init/lsp.nix +++ b/modules/neovim/init/lsp.nix @@ -18,36 +18,12 @@ lspConfigurations = mapAttrsToList ( - # TODO: Determine the best thing to do about merging in lspconfig - name: value: - /* - lua - */ - ''vim.lsp.config["${name}"] = ${toLuaObject value}'' + name: value: '' + vim.lsp.config["${name}"] = ${toLuaObject value} + '' ) cfg.servers; - # Approach 1: - # Create function perhaps called mkLspConfig - # mkLspConfig servers; - # that expands to something like - # vim.lsp.servers = cfg.lsp.servers...... - # vim.luaConfigRC.lspconfigMerge = entryAfter ["lsp-servers"] ''vim.lsp.config["${name}"] = vim.tbl_deep_extend("force", lspconfig.${name}, vim.lsp.config["${name}"])'' - - - # Approach 2: - # lspConfigurations = - # mapAttrsToList ( - # name: value: ''vim.lsp.config["${name}"] = vim.tbl_deep_extend("force", lspconfig.${name}, ${toLuaObject value})'' - # ) - # (filterAttrs (n: _: n != "*") cfg.servers); - # Then also need to configure global * settings - # globalConfiguration = - # mapAttrsToList ( - # name: value: ''vim.lsp.config["${name}"] = ${toLuaObject value}'' - # ) - # (filterAttrs (n: _: n == "*") cfg.servers); - enabledServers = filterAttrs (_: u: u.enable) cfg.servers; in { options = { @@ -105,18 +81,13 @@ in { } (mkIf (cfg.servers != {}) { - vim.luaConfigRC.lsp-servers = - entryAnywhere - # Or entryAfter ["lspconfig"] if we go with the second approach - /* - lua - */ - '' - ${concatLines lspConfigurations} + vim.luaConfigRC.lsp-servers = entryAnywhere '' + -- Individual LSP configurations managed by nvf. + ${concatLines lspConfigurations} - -- Enable configured LSPs explicitly - vim.lsp.enable(${toLuaObject (filter (name: name != "*") (attrNames enabledServers))}); - ''; + -- Enable configured LSPs explicitly + vim.lsp.enable(${toLuaObject (filter (name: name != "*") (attrNames enabledServers))}) + ''; }) ]; } diff --git a/modules/plugins/languages/nix.nix b/modules/plugins/languages/nix.nix index 39f2a76b..9edf5637 100644 --- a/modules/plugins/languages/nix.nix +++ b/modules/plugins/languages/nix.nix @@ -6,15 +6,14 @@ }: let inherit (builtins) attrNames; inherit (lib) concatStringsSep; - inherit (lib.generators) mkLuaInline; inherit (lib.meta) getExe; inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; inherit (lib.lists) isList; - inherit (lib.types) enum package; + inherit (lib.types) enum package listOf; inherit (lib.nvim.types) mkGrammarOption diagnostics; + inherit (lib.nvim.attrsets) mapListToAttrs; inherit (lib.nvim.lua) expToLua; - inherit (lib.nvim.languages) resolveLspOptions mkLspOption; cfg = config.vim.languages.nix; @@ -23,18 +22,18 @@ then expToLua package else ''{"${package}/bin/${defaultCmd}"}''; - formattingCmd = lib.mkIf (cfg.format.enable && cfg.lsp.enable) { - formatting = lib.mkMerge [ - (lib.mkIf (cfg.format.type == "alejandra") { + formattingCmd = mkIf (cfg.format.enable && cfg.lsp.enable) { + formatting = mkMerge [ + (mkIf (cfg.format.type == "alejandra") { command = ["${cfg.format.package}/bin/alejandra" "--quiet"]; }) - (lib.mkIf (cfg.format.type == "nixfmt") { + (mkIf (cfg.format.type == "nixfmt") { command = ["${cfg.format.package}/bin/nixfmt"]; }) ]; }; - defaultServers = ["nil_ls"] + defaultServers = ["nil_ls"]; servers = { nil_ls = { enable = true; @@ -101,9 +100,11 @@ in { lsp = { enable = mkEnableOption "Nix LSP support" // {default = config.vim.lsp.enable;}; - servers = mkLspOption { - inherit servers; + servers = mkOption { + description = "Nix LSP server to use"; + type = listOf (enum (attrNames servers)); default = defaultServers; + example = ["nixd"]; }; }; @@ -153,14 +154,14 @@ in { }) (mkIf cfg.lsp.enable { - # TODO: Map this to include lspconfig stuff so that we can do - vim.lsp.servers = resolveLspOptions { - inherit servers; - selected = cfg.lsp.servers; - }; + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; }) - # TODO: Figure out what do here. This is not necessarily correct as other lsps might not have formatting by default (mkIf (cfg.format.enable && !cfg.lsp.enable) { vim.formatter.conform-nvim = { enable = true; From 96f3524a4ddd8229da0c61cfef8f701259fcbe51 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Thu, 22 May 2025 16:11:38 +0100 Subject: [PATCH 004/109] add markdown as well --- modules/neovim/init/lsp.nix | 6 ++-- modules/plugins/languages/markdown.nix | 42 +++++++++----------------- 2 files changed, 19 insertions(+), 29 deletions(-) diff --git a/modules/neovim/init/lsp.nix b/modules/neovim/init/lsp.nix index b89c3fde..712f88f9 100644 --- a/modules/neovim/init/lsp.nix +++ b/modules/neovim/init/lsp.nix @@ -11,7 +11,7 @@ inherit (lib.attrsets) mapAttrsToList attrNames filterAttrs; inherit (lib.generators) mkLuaInline; inherit (lib.nvim.languages) lspOptions; - inherit (lib.nvim.dag) entryAnywhere; + inherit (lib.nvim.dag) entryAfter; inherit (lib.nvim.lua) toLuaObject; cfg = config.vim.lsp; @@ -81,7 +81,9 @@ in { } (mkIf (cfg.servers != {}) { - vim.luaConfigRC.lsp-servers = entryAnywhere '' + # Enable lspconfig in order to merge in the predefined opts + vim.lsp.lspconfig.enable = true; + vim.luaConfigRC.lsp-servers = entryAfter ["lspconfig"] '' -- Individual LSP configurations managed by nvf. ${concatLines lspConfigurations} diff --git a/modules/plugins/languages/markdown.nix b/modules/plugins/languages/markdown.nix index 23848835..32c16240 100644 --- a/modules/plugins/languages/markdown.nix +++ b/modules/plugins/languages/markdown.nix @@ -9,27 +9,18 @@ inherit (lib.modules) mkIf mkMerge; inherit (lib.options) mkEnableOption mkOption; inherit (lib.lists) isList; - inherit (lib.types) bool enum either package listOf str nullOr; - inherit (lib.nvim.lua) expToLua toLuaObject; + inherit (lib.types) bool enum package listOf str nullOr; + inherit (lib.nvim.lua) toLuaObject; inherit (lib.nvim.types) diagnostics mkGrammarOption mkPluginSetupOption; inherit (lib.nvim.dag) entryAnywhere; + inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.markdown; - defaultServer = "marksman"; + defaultServers = ["marksman"]; servers = { marksman = { - package = pkgs.marksman; - lspConfig = '' - lspconfig.marksman.setup{ - capabilities = capabilities; - on_attach = default_on_attach; - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else ''{"${cfg.lsp.package}/bin/marksman", "server"}'' - }, - } - ''; + enable = true; + cmd = ["${pkgs.marksman}/bin/marksman" "server"]; }; }; @@ -69,17 +60,10 @@ in { lsp = { enable = mkEnableOption "Enable Markdown LSP support" // {default = config.vim.lsp.enable;}; - server = mkOption { - type = enum (attrNames servers); - default = defaultServer; + servers = mkOption { description = "Markdown LSP server to use"; - }; - - package = mkOption { - type = either package (listOf str); - default = servers.${cfg.lsp.server}.package; - example = ''[lib.getExe pkgs.jdt-language-server " - data " " ~/.cache/jdtls/workspace "]''; - description = "Markdown LSP server package, or the command to run as a list of strings"; + type = listOf (enum (attrNames servers)); + default = defaultServers; }; }; @@ -161,8 +145,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.markdown-lsp = servers.${cfg.lsp.server}.lspConfig; + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; }) (mkIf cfg.format.enable { From 59f89ff96fc61f46f90f994152b82114abec2752 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Fri, 30 May 2025 13:27:07 +0100 Subject: [PATCH 005/109] enable lua function calls in cmd definition --- lib/languages.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/languages.nix b/lib/languages.nix index c4074144..c4709442 100644 --- a/lib/languages.nix +++ b/lib/languages.nix @@ -1,7 +1,7 @@ {lib}: let inherit (builtins) isString getAttr; inherit (lib.options) mkOption; - inherit (lib.types) listOf bool str submodule attrsOf anything either nullOr; + inherit (lib.types) listOf bool str submodule attrsOf anything either nullOr oneOf; inherit (lib.nvim.attrsets) mapListToAttrs; inherit (lib.nvim.types) luaInline; in { @@ -62,7 +62,7 @@ in { }; cmd = mkOption { - type = nullOr (listOf str); + type = nullOr (listOf (oneOf [str luaInline])); default = null; description = "Command used to start the LSP server"; }; From b00b999f1db3ca68b7a0fe02db5742db81313b68 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Fri, 30 May 2025 13:27:44 +0100 Subject: [PATCH 006/109] entryAnywhere for lspconfig --- modules/neovim/init/lsp.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/neovim/init/lsp.nix b/modules/neovim/init/lsp.nix index 712f88f9..b2e5d14a 100644 --- a/modules/neovim/init/lsp.nix +++ b/modules/neovim/init/lsp.nix @@ -11,7 +11,7 @@ inherit (lib.attrsets) mapAttrsToList attrNames filterAttrs; inherit (lib.generators) mkLuaInline; inherit (lib.nvim.languages) lspOptions; - inherit (lib.nvim.dag) entryAfter; + inherit (lib.nvim.dag) entryAnywhere; inherit (lib.nvim.lua) toLuaObject; cfg = config.vim.lsp; @@ -83,7 +83,7 @@ in { (mkIf (cfg.servers != {}) { # Enable lspconfig in order to merge in the predefined opts vim.lsp.lspconfig.enable = true; - vim.luaConfigRC.lsp-servers = entryAfter ["lspconfig"] '' + vim.luaConfigRC.lsp-servers = entryAnywhere '' -- Individual LSP configurations managed by nvf. ${concatLines lspConfigurations} From e08fd4dc9fb9b4eb2284ce08f14f37368627e459 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Fri, 30 May 2025 13:28:34 +0100 Subject: [PATCH 007/109] do not auto enable lspconfig with lang module --- modules/neovim/init/lsp.nix | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/neovim/init/lsp.nix b/modules/neovim/init/lsp.nix index b2e5d14a..0bc2dea8 100644 --- a/modules/neovim/init/lsp.nix +++ b/modules/neovim/init/lsp.nix @@ -82,7 +82,6 @@ in { (mkIf (cfg.servers != {}) { # Enable lspconfig in order to merge in the predefined opts - vim.lsp.lspconfig.enable = true; vim.luaConfigRC.lsp-servers = entryAnywhere '' -- Individual LSP configurations managed by nvf. ${concatLines lspConfigurations} From 385793a2ea8317dd8b35d57f2b9a7e20d3f7bc31 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Fri, 30 May 2025 13:29:04 +0100 Subject: [PATCH 008/109] specify lsp configuration in lang module --- modules/plugins/languages/markdown.nix | 4 +++- modules/plugins/languages/nix.nix | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/modules/plugins/languages/markdown.nix b/modules/plugins/languages/markdown.nix index 32c16240..5750d544 100644 --- a/modules/plugins/languages/markdown.nix +++ b/modules/plugins/languages/markdown.nix @@ -20,7 +20,9 @@ servers = { marksman = { enable = true; - cmd = ["${pkgs.marksman}/bin/marksman" "server"]; + cmd = [(getExe pkgs.marksman) "server"]; + filetypes = ["markdown" "markdown.mdx"]; + root_markers = [".marksman.toml" ".git"]; }; }; diff --git a/modules/plugins/languages/nix.nix b/modules/plugins/languages/nix.nix index 9edf5637..61bc5abb 100644 --- a/modules/plugins/languages/nix.nix +++ b/modules/plugins/languages/nix.nix @@ -41,6 +41,8 @@ settings = { nil = formattingCmd; }; + filetypes = ["nix"]; + root_markers = [".git" "flake.nix"]; }; nixd = { @@ -49,6 +51,8 @@ settings = { nixd = formattingCmd; }; + filetypes = ["nix"]; + root_markers = [".git" "flake.nix"]; }; }; From 4ca117e7281906187a0bfaec68b040977c2b0093 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Sun, 1 Jun 2025 17:20:08 +0100 Subject: [PATCH 009/109] cleanup --- modules/plugins/languages/markdown.nix | 1 - modules/plugins/languages/nix.nix | 11 ++--------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/modules/plugins/languages/markdown.nix b/modules/plugins/languages/markdown.nix index 5750d544..5b6a5e58 100644 --- a/modules/plugins/languages/markdown.nix +++ b/modules/plugins/languages/markdown.nix @@ -8,7 +8,6 @@ inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; inherit (lib.options) mkEnableOption mkOption; - inherit (lib.lists) isList; inherit (lib.types) bool enum package listOf str nullOr; inherit (lib.nvim.lua) toLuaObject; inherit (lib.nvim.types) diagnostics mkGrammarOption mkPluginSetupOption; diff --git a/modules/plugins/languages/nix.nix b/modules/plugins/languages/nix.nix index 61bc5abb..1efbdcf2 100644 --- a/modules/plugins/languages/nix.nix +++ b/modules/plugins/languages/nix.nix @@ -9,19 +9,12 @@ inherit (lib.meta) getExe; inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; - inherit (lib.lists) isList; inherit (lib.types) enum package listOf; inherit (lib.nvim.types) mkGrammarOption diagnostics; inherit (lib.nvim.attrsets) mapListToAttrs; - inherit (lib.nvim.lua) expToLua; cfg = config.vim.languages.nix; - packageToCmd = package: defaultCmd: - if isList package - then expToLua package - else ''{"${package}/bin/${defaultCmd}"}''; - formattingCmd = mkIf (cfg.format.enable && cfg.lsp.enable) { formatting = mkMerge [ (mkIf (cfg.format.type == "alejandra") { @@ -37,7 +30,7 @@ servers = { nil_ls = { enable = true; - cmd = ["${pkgs.nil}/bin/nil"]; + cmd = [(getExe pkgs.nil)]; settings = { nil = formattingCmd; }; @@ -47,7 +40,7 @@ nixd = { enable = true; - cmd = ["${pkgs.nixd}/bin/nixd"]; + cmd = [(getExe pkgs.nixd)]; settings = { nixd = formattingCmd; }; From 21894cf58e49acfca7479706b69fe04d09404006 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Mon, 2 Jun 2025 09:18:23 +0100 Subject: [PATCH 010/109] cleanup markdown --- modules/plugins/languages/markdown.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/plugins/languages/markdown.nix b/modules/plugins/languages/markdown.nix index 5b6a5e58..78e9d67b 100644 --- a/modules/plugins/languages/markdown.nix +++ b/modules/plugins/languages/markdown.nix @@ -59,7 +59,7 @@ in { }; lsp = { - enable = mkEnableOption "Enable Markdown LSP support" // {default = config.vim.lsp.enable;}; + enable = mkEnableOption "Markdown LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { description = "Markdown LSP server to use"; From 8c8d250768acbf00ff3c58c0d89745be48a11ca9 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Mon, 2 Jun 2025 09:18:40 +0100 Subject: [PATCH 011/109] move asm to new module type --- modules/plugins/languages/asm.nix | 40 +++++++++++++++++++------------ 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/modules/plugins/languages/asm.nix b/modules/plugins/languages/asm.nix index 9fe58a76..273cb9db 100644 --- a/modules/plugins/languages/asm.nix +++ b/modules/plugins/languages/asm.nix @@ -4,12 +4,24 @@ lib, ... }: let + inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) package; + inherit (lib.types) package enum listOf; inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.meta) getExe; + inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.assembly; + defaultServers = ["asm-lsp"]; + servers = { + asm-lsp = { + enable = true; + cmd = [(getExe pkgs.asm-lsp)]; + filetypes = ["asm" "vmasm"]; + root_markers = [".asm-lsp.toml" ".git"]; + }; + }; in { options.vim.languages.assembly = { enable = mkEnableOption "Assembly support"; @@ -20,12 +32,12 @@ in { }; lsp = { - enable = mkEnableOption "Assembly LSP support (asm-lsp)" // {default = config.vim.lsp.enable;}; - - package = mkOption { - type = package; - default = pkgs.asm-lsp; - description = "asm-lsp package"; + enable = mkEnableOption "Assembly LSP support" // {default = config.vim.lsp.enable;}; + servers = mkOption { + description = "Assembly LSP server to use"; + type = listOf (enum (attrNames servers)); + default = defaultServers; + example = ["asm-lsp"]; }; }; }; @@ -36,14 +48,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.asm-lsp = '' - lspconfig.asm_lsp.setup { - capabilities = capabilities, - on_attach = default_on_attach, - cmd = {"${cfg.lsp.package}/bin/asm-lsp"}, - } - ''; + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; }) ]); } From 0bf69126260972b114266fa24188ccc4795b2eb9 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Mon, 2 Jun 2025 23:48:27 +0100 Subject: [PATCH 012/109] asm module overhaul --- modules/plugins/languages/asm.nix | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/plugins/languages/asm.nix b/modules/plugins/languages/asm.nix index 273cb9db..2a5a2843 100644 --- a/modules/plugins/languages/asm.nix +++ b/modules/plugins/languages/asm.nix @@ -37,7 +37,6 @@ in { description = "Assembly LSP server to use"; type = listOf (enum (attrNames servers)); default = defaultServers; - example = ["asm-lsp"]; }; }; }; From 72d129f69aff62233655bd9261108e2826959c0d Mon Sep 17 00:00:00 2001 From: sjcobb Date: Mon, 2 Jun 2025 23:48:36 +0100 Subject: [PATCH 013/109] astro module overhaul --- modules/plugins/languages/astro.nix | 69 ++++++++++++++++++----------- 1 file changed, 43 insertions(+), 26 deletions(-) diff --git a/modules/plugins/languages/astro.nix b/modules/plugins/languages/astro.nix index b7a69bda..1f3f3003 100644 --- a/modules/plugins/languages/astro.nix +++ b/modules/plugins/languages/astro.nix @@ -12,25 +12,46 @@ inherit (lib.types) enum either listOf package str; inherit (lib.generators) mkLuaInline; inherit (lib.nvim.lua) expToLua; + inherit (lib.nvim.attrsets) mapListToAttrs; inherit (lib.nvim.types) mkGrammarOption diagnostics; cfg = config.vim.languages.astro; - defaultServer = "astro"; + defaultServers = ["astro"]; servers = { astro = { - package = pkgs.astro-language-server; - lspConfig = '' - lspconfig.astro.setup { - capabilities = capabilities, - on_attach = attach_keymaps, - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else ''{"${cfg.lsp.package}/bin/astro-ls", "--stdio"}'' - } - } - ''; + 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) + -- TODO: Make this a shared util function + local get_typescript_server_path = function(root_dir) + local project_roots = vim.fs.find('node_modules', { path = root_dir, upward = true, limit = math.huge }) + for _, project_root in ipairs(project_roots) do + local typescript_path = project_root .. '/typescript' + local stat = vim.loop.fs_stat(typescript_path) + if stat and stat.type == 'directory' then + return typescript_path .. '/lib' + end + end + return ''' + end + + if config.init_options and config.init_options.typescript and not config.init_options.typescript.tsdk then + config.init_options.typescript.tsdk = get_typescript_server_path(config.root_dir) + end + end + ''; }; }; @@ -82,18 +103,10 @@ in { lsp = { enable = mkEnableOption "Astro LSP support" // {default = config.vim.lsp.enable;}; - - server = mkOption { - type = enum (attrNames servers); - default = defaultServer; + servers = mkOption { description = "Astro LSP server to use"; - }; - - package = mkOption { - type = either package (listOf str); - default = servers.${cfg.lsp.server}.package; - example = ''[lib.getExe pkgs.astro-language-server "--minify" "--stdio"]''; - description = "Astro LSP server package, or the command to run as a list of strings"; + type = listOf (enum (attrNames servers)); + default = defaultServers; }; }; @@ -131,8 +144,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.astro-lsp = servers.${cfg.lsp.server}.lspConfig; + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; }) (mkIf cfg.format.enable { From 77ab1152cbb2ebb42bc31f8f653cdd4fdc84704f Mon Sep 17 00:00:00 2001 From: sjcobb Date: Mon, 2 Jun 2025 23:49:27 +0100 Subject: [PATCH 014/109] cleanup nix moduke --- modules/plugins/languages/nix.nix | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/plugins/languages/nix.nix b/modules/plugins/languages/nix.nix index 1efbdcf2..97272131 100644 --- a/modules/plugins/languages/nix.nix +++ b/modules/plugins/languages/nix.nix @@ -101,7 +101,6 @@ in { description = "Nix LSP server to use"; type = listOf (enum (attrNames servers)); default = defaultServers; - example = ["nixd"]; }; }; From 52136af0073d2850f54b802bd5d6b5bb36c79811 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Mon, 2 Jun 2025 23:56:40 +0100 Subject: [PATCH 015/109] convert bash module --- modules/plugins/languages/bash.nix | 46 +++++++++++++----------------- 1 file changed, 20 insertions(+), 26 deletions(-) diff --git a/modules/plugins/languages/bash.nix b/modules/plugins/languages/bash.nix index e02596cf..1072a0fe 100644 --- a/modules/plugins/languages/bash.nix +++ b/modules/plugins/languages/bash.nix @@ -10,26 +10,24 @@ inherit (lib.modules) mkIf mkMerge; inherit (lib.lists) isList; inherit (lib.types) enum either package listOf str bool; + inherit (lib.generators) mkLuaInline; inherit (lib.nvim.types) diagnostics mkGrammarOption; inherit (lib.nvim.lua) expToLua; cfg = config.vim.languages.bash; - defaultServer = "bash-ls"; + defaultServers = ["bash-ls"]; servers = { bash-ls = { - package = pkgs.bash-language-server; - lspConfig = '' - lspconfig.bashls.setup{ - capabilities = capabilities; - on_attach = default_on_attach; - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else ''{"${cfg.lsp.package}/bin/bash-language-server", "start"}'' + 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)'"; }; - } - ''; + }; }; }; @@ -56,19 +54,11 @@ in { }; lsp = { - enable = mkEnableOption "Enable Bash LSP support" // {default = config.vim.lsp.enable;}; - - server = mkOption { + enable = mkEnableOption "Bash LSP support" // {default = config.vim.lsp.enable;}; + servers = mkOption { description = "Bash LSP server to use"; - type = enum (attrNames servers); - default = defaultServer; - }; - - package = mkOption { - description = "bash-language-server package, or the command to run as a list of strings"; - example = literalExpression ''[lib.getExe pkgs.nodePackages.bash-language-server "start"]''; - type = either package (listOf str); - default = pkgs.bash-language-server; + type = listOf (enum (attrNames servers)); + default = defaultServers; }; }; @@ -108,8 +98,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.bash-lsp = servers.${cfg.lsp.server}.lspConfig; + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; }) (mkIf cfg.format.enable { From 13819623265686706b36308ede8d107e74ed1b37 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Tue, 3 Jun 2025 00:03:28 +0100 Subject: [PATCH 016/109] convert clojure module --- modules/plugins/languages/clojure.nix | 36 +++++++++++++++------------ 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/modules/plugins/languages/clojure.nix b/modules/plugins/languages/clojure.nix index 0b932708..cba3bcf7 100644 --- a/modules/plugins/languages/clojure.nix +++ b/modules/plugins/languages/clojure.nix @@ -13,6 +13,16 @@ inherit (lib.nvim.lua) expToLua; 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"]; + }; + }; in { options.vim.languages.clojure = { enable = mkEnableOption "Clojure language support"; @@ -24,28 +34,22 @@ in { lsp = { enable = mkEnableOption "Clojure LSP support" // {default = config.vim.lsp.enable;}; - package = mkOption { - type = either package (listOf str); - default = pkgs.clojure-lsp; - description = "Clojure LSP"; + servers = mkOption { + description = "Clojure LSP server to use"; + type = listOf (enum (attrNames servers)); + default = defaultServers; }; }; }; config = mkIf cfg.enable (mkMerge [ (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.clojure-lsp = '' - lspconfig.clojure_lsp.setup { - capabilities = capabilities; - on_attach = default_on_attach; - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else ''{"${getExe cfg.lsp.package}"}'' - }; - } - ''; + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; }) (mkIf cfg.treesitter.enable { From 9021e4d021845ce86c021e676877217f78a1b217 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Thu, 5 Jun 2025 09:40:56 +0100 Subject: [PATCH 017/109] update cmd spec --- lib/languages.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/languages.nix b/lib/languages.nix index c4709442..f4ab1cca 100644 --- a/lib/languages.nix +++ b/lib/languages.nix @@ -62,7 +62,7 @@ in { }; cmd = mkOption { - type = nullOr (listOf (oneOf [str luaInline])); + type = nullOr (either luaInline (listOf str)); default = null; description = "Command used to start the LSP server"; }; From 91d78e9acd7adeaf2786b3959afffec0f458a09d Mon Sep 17 00:00:00 2001 From: sjcobb Date: Thu, 5 Jun 2025 09:42:05 +0100 Subject: [PATCH 018/109] fix bash imports --- modules/plugins/languages/bash.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/plugins/languages/bash.nix b/modules/plugins/languages/bash.nix index 1072a0fe..e0e28bd7 100644 --- a/modules/plugins/languages/bash.nix +++ b/modules/plugins/languages/bash.nix @@ -13,6 +13,7 @@ inherit (lib.generators) mkLuaInline; inherit (lib.nvim.types) diagnostics mkGrammarOption; inherit (lib.nvim.lua) expToLua; + inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.bash; From aa35ef0319e63f12d9a90458fea807b5e77224be Mon Sep 17 00:00:00 2001 From: sjcobb Date: Thu, 5 Jun 2025 09:42:27 +0100 Subject: [PATCH 019/109] fix clojure imports --- modules/plugins/languages/clojure.nix | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/plugins/languages/clojure.nix b/modules/plugins/languages/clojure.nix index cba3bcf7..31062ba7 100644 --- a/modules/plugins/languages/clojure.nix +++ b/modules/plugins/languages/clojure.nix @@ -4,13 +4,15 @@ lib, ... }: let + inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; inherit (lib.meta) getExe; inherit (lib.lists) isList; - inherit (lib.types) either listOf package str; + inherit (lib.types) enum either listOf package str; inherit (lib.nvim.types) mkGrammarOption; inherit (lib.nvim.lua) expToLua; + inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.clojure; From e970eac1af256692830f0607cc7107a5960c8326 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Thu, 5 Jun 2025 09:45:50 +0100 Subject: [PATCH 020/109] convert dart module --- modules/plugins/languages/dart.nix | 72 +++++++++++++++--------------- 1 file changed, 35 insertions(+), 37 deletions(-) diff --git a/modules/plugins/languages/dart.nix b/modules/plugins/languages/dart.nix index c2a1810d..61f52abb 100644 --- a/modules/plugins/languages/dart.nix +++ b/modules/plugins/languages/dart.nix @@ -6,6 +6,7 @@ }: let inherit (builtins) attrNames; inherit (lib.modules) mkIf mkMerge; + inherit (lib.meta) getExe; inherit (lib.trivial) boolToString; inherit (lib.lists) isList; inherit (lib.options) mkEnableOption mkOption; @@ -14,26 +15,31 @@ inherit (lib.nvim.lua) expToLua; inherit (lib.nvim.types) mkGrammarOption; inherit (lib.nvim.dag) entryAfter; + inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.dart; ftcfg = cfg.flutter-tools; - defaultServer = "dart"; + defaultServers = ["dart"]; servers = { dart = { - package = pkgs.dart; - lspConfig = '' - lspconfig.dartls.setup{ - capabilities = capabilities; - on_attach=default_on_attach; - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else ''{"${cfg.lsp.package}/bin/dart", "language-server", "--protocol=lsp"}'' + 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; }; - ${optionalString (cfg.lsp.opts != null) "init_options = ${cfg.lsp.dartOpts}"} - } - ''; + }; }; }; in { @@ -46,23 +52,11 @@ in { }; lsp = { - enable = mkEnableOption "Dart LSP support"; - server = mkOption { - description = "The Dart LSP server to use"; - type = enum (attrNames servers); - default = defaultServer; - }; - package = mkOption { - type = either package (listOf str); - default = servers.${cfg.lsp.server}.package; - example = ''[lib.getExe pkgs.jdt-language-server "-data" "~/.cache/jdtls/workspace"]''; - description = "Dart LSP server package, or the command to run as a list of strings"; - }; - - opts = mkOption { - type = nullOr str; - default = null; - description = "Options to pass to Dart LSP server"; + enable = mkEnableOption "Dart LSP support" // {default = config.vim.lsp.enable;}; + servers = mkOption { + description = "Dart LSP server to use"; + type = listOf (enum (attrNames servers)); + default = defaultServers; }; }; @@ -131,19 +125,23 @@ in { }; }; - config.vim = mkIf cfg.enable (mkMerge [ + config = mkIf cfg.enable (mkMerge [ (mkIf cfg.treesitter.enable { - treesitter.enable = true; - treesitter.grammars = [cfg.treesitter.package]; + vim.treesitter.enable = true; + vim.treesitter.grammars = [cfg.treesitter.package]; }) (mkIf cfg.lsp.enable { - lsp.lspconfig.enable = true; - lsp.lspconfig.sources.dart-lsp = servers.${cfg.lsp.server}.lspConfig; + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; }) (mkIf ftcfg.enable { - startPlugins = [ + vim.startPlugins = [ ( if ftcfg.enableNoResolvePatch then "flutter-tools-patched" @@ -152,7 +150,7 @@ in { "plenary-nvim" ]; - pluginRC.flutter-tools = entryAfter ["lsp-setup"] '' + vim.pluginRC.flutter-tools = entryAfter ["lsp-servers"] '' require('flutter-tools').setup { ${optionalString (ftcfg.flutterPackage != null) "flutter_path = \"${ftcfg.flutterPackage}/bin/flutter\","} lsp = { From 161235da30d37c2274d096fdd52b54fccd0cfbc9 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Thu, 5 Jun 2025 09:46:09 +0100 Subject: [PATCH 021/109] convert elixir module --- modules/plugins/languages/elixir.nix | 58 +++++++++++++++------------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/modules/plugins/languages/elixir.nix b/modules/plugins/languages/elixir.nix index 241efd8e..2164b469 100644 --- a/modules/plugins/languages/elixir.nix +++ b/modules/plugins/languages/elixir.nix @@ -8,29 +8,37 @@ inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; inherit (lib.lists) isList; + inherit (lib.meta) getExe; inherit (lib.types) enum either listOf package str; + inherit (lib.generators) mkLuaInline; inherit (lib.nvim.types) mkGrammarOption; inherit (lib.nvim.lua) expToLua; inherit (lib.nvim.dag) entryAnywhere; + inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.elixir; - defaultServer = "elixirls"; + defaultServers = ["elixirls"]; servers = { elixirls = { - package = pkgs.elixir-ls; - lspConfig = '' - -- elixirls setup - lspconfig.elixirls.setup { - capabilities = capabilities, - on_attach = default_on_attach, - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else ''{"${cfg.lsp.package}/bin/elixir-ls"}'' - } - } - ''; + 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 + ''; }; }; @@ -54,18 +62,10 @@ in { lsp = { enable = mkEnableOption "Elixir LSP support" // {default = config.vim.lsp.enable;}; - - server = mkOption { + servers = mkOption { description = "Elixir LSP server to use"; - type = enum (attrNames servers); - default = defaultServer; - }; - - package = mkOption { - description = "Elixir LSP server package, or the command to run as a list of strings"; - example = ''[lib.getExe pkgs.jdt-language-server " - data " " ~/.cache/jdtls/workspace "]''; - type = either package (listOf str); - default = servers.${cfg.lsp.server}.package; + type = listOf (enum (attrNames servers)); + default = defaultServers; }; }; @@ -97,8 +97,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.elixir-lsp = servers.${cfg.lsp.server}.lspConfig; + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; }) (mkIf cfg.format.enable { From ac54848ecd25a55b03d9839fe2eec1bf9caa9489 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Thu, 5 Jun 2025 09:46:45 +0100 Subject: [PATCH 022/109] convert gleam module --- modules/plugins/languages/gleam.nix | 41 +++++++++++------------------ 1 file changed, 16 insertions(+), 25 deletions(-) diff --git a/modules/plugins/languages/gleam.nix b/modules/plugins/languages/gleam.nix index 272ef51e..3397a469 100644 --- a/modules/plugins/languages/gleam.nix +++ b/modules/plugins/languages/gleam.nix @@ -8,27 +8,21 @@ inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; inherit (lib.lists) isList; + inherit (lib.meta) getExe; inherit (lib.types) enum either listOf package str; inherit (lib.nvim.lua) expToLua; inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.gleam; - defaultServer = "gleam"; + defaultServers = ["gleam"]; servers = { gleam = { - package = pkgs.gleam; - lspConfig = '' - lspconfig.gleam.setup{ - capabilities = capabilities, - on_attach = default_on_attach, - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else ''{"${cfg.lsp.package}/bin/gleam", "lsp"}'' - } - } - ''; + enable = true; + cmd = [(getExe pkgs.gleam) "lsp"]; + filetypes = ["gleam"]; + root_markers = [ "gleam.toml" ".git" ]; }; }; in { @@ -42,17 +36,10 @@ in { lsp = { enable = mkEnableOption "Gleam LSP support" // {default = config.vim.lsp.enable;}; - - server = mkOption { - type = enum (attrNames servers); - default = defaultServer; + servers = mkOption { description = "Gleam LSP server to use"; - }; - - package = mkOption { - type = either package (listOf str); - default = servers.${cfg.lsp.server}.package; - description = "Gleam LSP server package, or the command to run as a list of strings"; + type = listOf (enum (attrNames servers)); + default = defaultServers; }; }; }; @@ -64,8 +51,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.gleam-lsp = servers.${cfg.lsp.server}.lspConfig; + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; }) ]); } From 39efdc7990350000ee2ce327bcc87435ef0308f7 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Fri, 6 Jun 2025 11:01:06 +0100 Subject: [PATCH 023/109] convert haskell module --- modules/plugins/languages/haskell.nix | 113 ++++++++++++++++++++------ 1 file changed, 86 insertions(+), 27 deletions(-) diff --git a/modules/plugins/languages/haskell.nix b/modules/plugins/languages/haskell.nix index f50c9f09..5a5cb142 100644 --- a/modules/plugins/languages/haskell.nix +++ b/modules/plugins/languages/haskell.nix @@ -9,12 +9,80 @@ inherit (lib.options) mkEnableOption mkOption; inherit (lib.strings) optionalString; inherit (lib.modules) mkIf mkMerge; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.types) mkGrammarOption enum attrNames; inherit (lib.nvim.dag) entryAfter; inherit (lib.nvim.lua) expToLua; + inherit (lib.meta) getExe; + inherit (lib.generators) mkLuaInline; + inherit (lib.nvim.attrsets) mapListToAttrs; inherit (pkgs) haskellPackages; cfg = config.vim.languages.haskell; + + defaultServers = ["hls"]; + servers = { + hls = { + enable = true; + cmd = [(getExe pkgs.haskellPackages.haskell-language-server) "--debug"]; + filetypes = ["haskell" "lhaskell"]; + on_attach = + mkLuaInline + /* + lua + */ + '' + function(client, bufnr, ht) + default_on_attach(client, bufnr, ht) + local opts = { noremap = true, silent = true, buffer = bufnr } + vim.keymap.set('n', 'cl', vim.lsp.codelens.run, opts) + vim.keymap.set('n', 'hs', ht.hoogle.hoogle_signature, opts) + vim.keymap.set('n', 'ea', ht.lsp.buf_eval_all, opts) + vim.keymap.set('n', 'rr', ht.repl.toggle, opts) + vim.keymap.set('n', 'rf', function() + ht.repl.toggle(vim.api.nvim_buf_get_name(0)) + end, opts) + vim.keymap.set('n', 'rq', ht.repl.quit, opts) + end, + ''; + root_dir = + mkLuaInline + /* + lua + */ + '' + function(bufnr, on_dir) + local root_pattern = function(...) + local patterns = M.tbl_flatten { ... } + return function(startpath) + startpath = M.strip_archive_subpath(startpath) + for _, pattern in ipairs(patterns) do + local match = M.search_ancestors(startpath, function(path) + for _, p in ipairs(vim.fn.glob(table.concat({ escape_wildcards(path), pattern }, '/'), true, true)) do + if vim.uv.fs_stat(p) then + return path + end + end + end) + + if match ~= nil then + return match + end + end + end + end + + local fname = vim.api.nvim_buf_get_name(bufnr) + on_dir(root_pattern('hie.yaml', 'stack.yaml', 'cabal.project', '*.cabal', 'package.yaml')(fname)) + end + ''; + settings = { + haskell = { + formattingProvider = "ormolu"; + cabalFormattingProvider = "cabalfmt"; + }; + }; + }; + }; in { options.vim.languages.haskell = { enable = mkEnableOption "Haskell support"; @@ -25,12 +93,11 @@ in { }; lsp = { - enable = mkEnableOption "LSP support for Haskell" // {default = config.vim.lsp.enable;}; - package = mkOption { - description = "Haskell LSP package or command to run the Haskell LSP"; - example = ''[ (lib.getExe pkgs.haskellPackages.haskell-language-server) "--debug" ]''; - default = haskellPackages.haskell-language-server; - type = either package (listOf str); + enable = mkEnableOption "Haskell LSP support" // {default = config.vim.lsp.enable;}; + servers = mkOption { + description = "Haskell LSP server to use"; + type = listOf (enum (attrNames servers)); + default = defaultServers; }; }; @@ -52,12 +119,21 @@ in { }; }) + (mkIf cfg.lsp.enable { + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; + }) + (mkIf (cfg.dap.enable || cfg.lsp.enable) { vim = { startPlugins = ["haskell-tools-nvim"]; luaConfigRC.haskell-tools-nvim = entryAfter - ["lsp-setup"] + ["lsp-servers"] '' vim.g.haskell_tools = { ${optionalString cfg.lsp.enable '' @@ -67,25 +143,8 @@ in { enable = true, }, }, - hls = { - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else ''{"${cfg.lsp.package}/bin/haskell-language-server-wrapper", "--lsp"}'' - }, - on_attach = function(client, bufnr, ht) - default_on_attach(client, bufnr, ht) - local opts = { noremap = true, silent = true, buffer = bufnr } - vim.keymap.set('n', 'cl', vim.lsp.codelens.run, opts) - vim.keymap.set('n', 'hs', ht.hoogle.hoogle_signature, opts) - vim.keymap.set('n', 'ea', ht.lsp.buf_eval_all, opts) - vim.keymap.set('n', 'rr', ht.repl.toggle, opts) - vim.keymap.set('n', 'rf', function() - ht.repl.toggle(vim.api.nvim_buf_get_name(0)) - end, opts) - vim.keymap.set('n', 'rq', ht.repl.quit, opts) - end, - }, + -- Configured through vim.lsp.config + hls = {}, ''} ${optionalString cfg.dap.enable '' dap = { From c4bf1b63ccd5a0ff712df9d18374ba8658a912e7 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Fri, 6 Jun 2025 11:01:32 +0100 Subject: [PATCH 024/109] convert hcl module --- modules/plugins/languages/hcl.nix | 37 ++++++++++++++++++------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/modules/plugins/languages/hcl.nix b/modules/plugins/languages/hcl.nix index e702170c..10378383 100644 --- a/modules/plugins/languages/hcl.nix +++ b/modules/plugins/languages/hcl.nix @@ -8,22 +8,19 @@ inherit (lib.options) mkEnableOption mkOption; inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) package bool enum; + inherit (lib.types) package bool enum listOf; inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.hcl; - defaultServer = "terraform-ls"; + defaultServers = ["terraform-ls"]; servers = { terraform-ls = { - package = pkgs.terraform-ls; - lspConfig = '' - lspconfig.terraformls.setup { - capabilities = capabilities, - on_attach=default_on_attach, - cmd = {"${lib.getExe cfg.lsp.package}", "serve"}, - } - ''; + enable = true; + cmd = [(getExe pkgs.terraform-ls) "serve"]; + filetypes = ["terraform" "terraform-vars"]; + root_markers = [".terraform" ".git"]; }; }; @@ -43,12 +40,11 @@ in { }; lsp = { - enable = mkEnableOption "HCL LSP support (terraform-ls)" // {default = config.vim.lsp.enable;}; - # TODO: (maybe, is it better?) it would be cooler to use vscode-extensions.hashicorp.hcl probably, shouldn't be too hard - package = mkOption { - type = package; - default = servers.${defaultServer}.package; - description = "HCL language server package (terraform-ls)"; + enable = mkEnableOption "HCL LSP support" // {default = config.vim.lsp.enable;}; + servers = mkOption { + description = "HCL LSP server to use"; + type = listOf (enum (attrNames servers)); + default = defaultServers; }; }; @@ -95,6 +91,15 @@ in { vim.treesitter.grammars = [cfg.treesitter.package]; }) + (mkIf cfg.lsp.enable { + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; + }) + (mkIf cfg.lsp.enable { vim.lsp.lspconfig.enable = true; vim.lsp.lspconfig.sources = lib.optionalAttrs (! config.vim.languages.terraform.lsp.enable) { From a45cd326ec2d01a82d58a3d90e1389f0cbf83c5e Mon Sep 17 00:00:00 2001 From: sjcobb Date: Sun, 15 Jun 2025 22:31:25 +0100 Subject: [PATCH 025/109] nvim util --- modules/neovim/init/default.nix | 1 + modules/neovim/init/lsp.nix | 2 +- modules/neovim/init/util.nix | 178 ++++++++++++++++++++++++++++++++ 3 files changed, 180 insertions(+), 1 deletion(-) create mode 100644 modules/neovim/init/util.nix diff --git a/modules/neovim/init/default.nix b/modules/neovim/init/default.nix index 30a481a1..3f195085 100644 --- a/modules/neovim/init/default.nix +++ b/modules/neovim/init/default.nix @@ -8,5 +8,6 @@ ./highlight.nix ./lsp.nix ./spellcheck.nix + ./util.nix ]; } diff --git a/modules/neovim/init/lsp.nix b/modules/neovim/init/lsp.nix index 0bc2dea8..6c18b98e 100644 --- a/modules/neovim/init/lsp.nix +++ b/modules/neovim/init/lsp.nix @@ -16,6 +16,7 @@ cfg = config.vim.lsp; + # TODO: lspConfigurations filter on enabledServers instead of cfg.servers? lspConfigurations = mapAttrsToList ( name: value: '' @@ -81,7 +82,6 @@ in { } (mkIf (cfg.servers != {}) { - # Enable lspconfig in order to merge in the predefined opts vim.luaConfigRC.lsp-servers = entryAnywhere '' -- Individual LSP configurations managed by nvf. ${concatLines lspConfigurations} diff --git a/modules/neovim/init/util.nix b/modules/neovim/init/util.nix new file mode 100644 index 00000000..cc98d10a --- /dev/null +++ b/modules/neovim/init/util.nix @@ -0,0 +1,178 @@ +{ + config, + lib, + ... +}: let + inherit (builtins) filter; + inherit (lib.modules) mkIf mkMerge; + inherit (lib.nvim.dag) entryBefore; + + cfg = config.vim.lsp; +in { + config = mkMerge [ + (mkIf (cfg.servers != {}) { + vim.luaConfigRC.lsp-util = + entryBefore ["lsp-servers"] + /* + lua + */ + '' + -- Port of nvim-lspconfig util + local util = { path = {} } + + util.default_config = { + log_level = vim.lsp.protocol.MessageType.Warning, + message_level = vim.lsp.protocol.MessageType.Warning, + settings = vim.empty_dict(), + init_options = vim.empty_dict(), + handlers = {}, + autostart = true, + capabilities = vim.lsp.protocol.make_client_capabilities(), + } + + -- global on_setup hook + util.on_setup = nil + + do + local validate = vim.validate + local api = vim.api + local lsp = vim.lsp + local nvim_eleven = vim.fn.has 'nvim-0.11' == 1 + + local iswin = vim.uv.os_uname().version:match 'Windows' + + local function escape_wildcards(path) + return path:gsub('([%[%]%?%*])', '\\%1') + end + + local function is_fs_root(path) + if iswin then + return path:match '^%a:$' + else + return path == '/' + end + end + + local function traverse_parents(path, cb) + path = vim.uv.fs_realpath(path) + local dir = path + -- Just in case our algo is buggy, don't infinite loop. + for _ = 1, 100 do + dir = vim.fs.dirname(dir) + if not dir then + return + end + -- If we can't ascend further, then stop looking. + if cb(dir, path) then + return dir, path + end + if is_fs_root(dir) then + break + end + end + end + + util.root_pattern = function(...) + local patterns = util.tbl_flatten { ... } + return function(startpath) + startpath = util.strip_archive_subpath(startpath) + for _, pattern in ipairs(patterns) do + local match = util.search_ancestors(startpath, function(path) + for _, p in ipairs(vim.fn.glob(table.concat({ escape_wildcards(path), pattern }, '/'), true, true)) do + if vim.uv.fs_stat(p) then + return path + end + end + end) + + if match ~= nil then + return match + end + end + end + end + + util.root_markers_with_field = function(root_files, new_names, field, fname) + local path = vim.fn.fnamemodify(fname, ':h') + local found = vim.fs.find(new_names, { path = path, upward = true }) + + for _, f in ipairs(found or {}) do + -- Match the given `field`. + for line in io.lines(f) do + if line:find(field) then + root_files[#root_files + 1] = vim.fs.basename(f) + break + end + end + end + + return root_files + end + + util.insert_package_json = function(root_files, field, fname) + return util.root_markers_with_field(root_files, { 'package.json', 'package.json5' }, field, fname) + end + + util.strip_archive_subpath = function(path) + -- Matches regex from zip.vim / tar.vim + path = vim.fn.substitute(path, 'zipfile://\\(.\\{-}\\)::[^\\\\].*$', '\\1', ''') + path = vim.fn.substitute(path, 'tarfile:\\(.\\{-}\\)::.*$', '\\1', ''') + return path + end + + util.get_typescript_server_path = function(root_dir) + local project_roots = vim.fs.find('node_modules', { path = root_dir, upward = true, limit = math.huge }) + for _, project_root in ipairs(project_roots) do + local typescript_path = project_root .. '/typescript' + local stat = vim.loop.fs_stat(typescript_path) + if stat and stat.type == 'directory' then + return typescript_path .. '/lib' + end + end + return ''' + end + + util.search_ancestors = function(startpath, func) + if nvim_eleven then + validate('func', func, 'function') + end + if func(startpath) then + return startpath + end + local guard = 100 + for path in vim.fs.parents(startpath) do + -- Prevent infinite recursion if our algorithm breaks + guard = guard - 1 + if guard == 0 then + return + end + + if func(path) then + return path + end + end + end + + util.path.is_descendant = function(root, path) + if not path then + return false + end + + local function cb(dir, _) + return dir == root + end + + local dir, _ = traverse_parents(path, cb) + + return dir == root + end + + util.tbl_flatten = function(t) + --- @diagnostic disable-next-line:deprecated + return nvim_eleven and vim.iter(t):flatten(math.huge):totable() or vim.tbl_flatten(t) + end + end + ''; + }) + ]; +} From acf3cca302914f09e29e601255c8c004127a70ef Mon Sep 17 00:00:00 2001 From: sjcobb Date: Sun, 15 Jun 2025 22:31:43 +0100 Subject: [PATCH 026/109] use new util --- modules/plugins/languages/astro.nix | 14 +------------- modules/plugins/languages/haskell.nix | 26 +++----------------------- 2 files changed, 4 insertions(+), 36 deletions(-) diff --git a/modules/plugins/languages/astro.nix b/modules/plugins/languages/astro.nix index 1f3f3003..54bb47a6 100644 --- a/modules/plugins/languages/astro.nix +++ b/modules/plugins/languages/astro.nix @@ -35,20 +35,8 @@ '' function(_, config) -- TODO: Make this a shared util function - local get_typescript_server_path = function(root_dir) - local project_roots = vim.fs.find('node_modules', { path = root_dir, upward = true, limit = math.huge }) - for _, project_root in ipairs(project_roots) do - local typescript_path = project_root .. '/typescript' - local stat = vim.loop.fs_stat(typescript_path) - if stat and stat.type == 'directory' then - return typescript_path .. '/lib' - end - end - return ''' - end - if config.init_options and config.init_options.typescript and not config.init_options.typescript.tsdk then - config.init_options.typescript.tsdk = get_typescript_server_path(config.root_dir) + config.init_options.typescript.tsdk = util.get_typescript_server_path(config.root_dir) end end ''; diff --git a/modules/plugins/languages/haskell.nix b/modules/plugins/languages/haskell.nix index 5a5cb142..13344486 100644 --- a/modules/plugins/languages/haskell.nix +++ b/modules/plugins/languages/haskell.nix @@ -23,7 +23,7 @@ servers = { hls = { enable = true; - cmd = [(getExe pkgs.haskellPackages.haskell-language-server) "--debug"]; + cmd = [(getExe pkgs.haskellPackages.haskell-language-server) "--lsp"]; filetypes = ["haskell" "lhaskell"]; on_attach = mkLuaInline @@ -51,29 +51,9 @@ */ '' function(bufnr, on_dir) - local root_pattern = function(...) - local patterns = M.tbl_flatten { ... } - return function(startpath) - startpath = M.strip_archive_subpath(startpath) - for _, pattern in ipairs(patterns) do - local match = M.search_ancestors(startpath, function(path) - for _, p in ipairs(vim.fn.glob(table.concat({ escape_wildcards(path), pattern }, '/'), true, true)) do - if vim.uv.fs_stat(p) then - return path - end - end - end) - - if match ~= nil then - return match - end - end - end - end - local fname = vim.api.nvim_buf_get_name(bufnr) - on_dir(root_pattern('hie.yaml', 'stack.yaml', 'cabal.project', '*.cabal', 'package.yaml')(fname)) - end + on_dir(util.root_pattern('hie.yaml', 'stack.yaml', 'cabal.project', '*.cabal', 'package.yaml')(fname)) + end ''; settings = { haskell = { From 41d79532fc62b0a0c9f11f1a8690deeecd76f9a2 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Sun, 15 Jun 2025 22:32:17 +0100 Subject: [PATCH 027/109] convert hcl module --- modules/plugins/languages/hcl.nix | 7 ------- 1 file changed, 7 deletions(-) diff --git a/modules/plugins/languages/hcl.nix b/modules/plugins/languages/hcl.nix index 10378383..a98498ee 100644 --- a/modules/plugins/languages/hcl.nix +++ b/modules/plugins/languages/hcl.nix @@ -100,13 +100,6 @@ in { cfg.lsp.servers; }) - (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources = lib.optionalAttrs (! config.vim.languages.terraform.lsp.enable) { - terraform-ls = servers.${cfg.lsp.server}.lspConfig; - }; - }) - (mkIf cfg.format.enable { vim.formatter.conform-nvim = { enable = true; From 171d96077eb9007b46d762e6835e4e0d647dd6e3 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Sun, 15 Jun 2025 22:32:34 +0100 Subject: [PATCH 028/109] add helm and yaml --- modules/plugins/languages/helm.nix | 72 +++++++++++++----------------- modules/plugins/languages/yaml.nix | 60 ++++++++++++------------- 2 files changed, 59 insertions(+), 73 deletions(-) diff --git a/modules/plugins/languages/helm.nix b/modules/plugins/languages/helm.nix index ffe115c9..b3ca8dc6 100644 --- a/modules/plugins/languages/helm.nix +++ b/modules/plugins/languages/helm.nix @@ -4,44 +4,37 @@ lib, ... }: let - inherit (builtins) attrNames; + inherit (builtins) attrNames head; inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; - inherit (lib.lists) isList; - inherit (lib.types) enum either listOf package str; + inherit (lib.meta) getExe; + inherit (lib.types) enum listOf; inherit (lib.nvim.types) mkGrammarOption; - inherit (lib.nvim.lua) expToLua; + inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.helm; yamlCfg = config.vim.languages.yaml; - helmCmd = - if isList cfg.lsp.package - then cfg.lsp.package - else ["${cfg.lsp.package}/bin/helm_ls" "serve"]; - yamlCmd = - if isList yamlCfg.lsp.package - then builtins.elemAt yamlCfg.lsp.package 0 - else "${yamlCfg.lsp.package}/bin/yaml-language-server"; - - defaultServer = "helm-ls"; + defaultServers = ["helm-ls"]; servers = { helm-ls = { - package = pkgs.helm-ls; - lspConfig = '' - lspconfig.helm_ls.setup { - capabilities = capabilities, - on_attach = default_on_attach, - cmd = ${expToLua helmCmd}, - settings = { - ['helm-ls'] = { - yamlls = { - path = "${yamlCmd}" - } - } - } - } - ''; + enable = true; + cmd = [(getExe pkgs.helm-ls) "serve"]; + filetypes = ["helm" "yaml.helm-values"]; + root_markers = ["Chart.yaml"]; + capabilities = { + didChangeWatchedFiles = { + dynamicRegistration = true; + }; + }; + # TODO: Reconsider this? Not sure if that necessary. + settings = { + helm-ls = { + yamlls = { + path = (head yamlCfg.lsp.servers).cmd; + }; + }; + }; }; }; in { @@ -55,17 +48,10 @@ in { lsp = { enable = mkEnableOption "Helm LSP support" // {default = config.vim.lsp.enable;}; - - server = mkOption { + servers = mkOption { description = "Helm LSP server to use"; - type = enum (attrNames servers); - default = defaultServer; - }; - - package = mkOption { - description = "Helm LSP server package"; - type = either package (listOf str); - default = servers.${cfg.lsp.server}.package; + type = listOf (enum (attrNames servers)); + default = defaultServers; }; }; }; @@ -77,8 +63,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.helm-lsp = servers.${cfg.lsp.server}.lspConfig; + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; }) { diff --git a/modules/plugins/languages/yaml.nix b/modules/plugins/languages/yaml.nix index 7a1a4552..4fd5ae29 100644 --- a/modules/plugins/languages/yaml.nix +++ b/modules/plugins/languages/yaml.nix @@ -7,10 +7,10 @@ inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; - inherit (lib.lists) isList; - inherit (lib.types) enum either listOf package str; + inherit (lib.meta) getExe; + inherit (lib.types) enum listOf; inherit (lib.nvim.types) mkGrammarOption; - inherit (lib.nvim.lua) expToLua; + inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.yaml; @@ -25,23 +25,22 @@ end'' else "on_attach = default_on_attach"; - defaultServer = "yaml-language-server"; + defaultServers = ["yaml-language-server"]; servers = { yaml-language-server = { - package = pkgs.nodePackages.yaml-language-server; - lspConfig = '' - - - lspconfig.yamlls.setup { - capabilities = capabilities, - ${onAttach}, - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else ''{"${cfg.lsp.package}/bin/yaml-language-server", "--stdio"}'' - }, - } - ''; + enable = true; + cmd = [(getExe pkgs.nodePackages.yaml-language-server) "--stdio"]; + filetypes = ["yaml" "yaml.docker-compose" "yaml.gitlab" "yaml.helm-values"]; + root_markers = [".git"]; + on_attach = onAttach; + # -- https://github.com/redhat-developer/vscode-redhat-telemetry#how-to-disable-telemetry-reporting + settings = { + redhat = { + telemetry = { + enabled = false; + }; + }; + }; }; }; in { @@ -55,18 +54,11 @@ in { }; lsp = { - enable = mkEnableOption "YAML LSP support" // {default = config.vim.lsp.enable;}; - - server = mkOption { - type = enum (attrNames servers); - default = defaultServer; - description = "YAML LSP server to use"; - }; - - package = mkOption { - type = either package (listOf str); - default = servers.${cfg.lsp.server}.package; - description = "YAML LSP server package"; + enable = mkEnableOption "Yaml LSP support" // {default = config.vim.lsp.enable;}; + servers = mkOption { + description = "Yaml LSP server to use"; + type = listOf (enum (attrNames servers)); + default = defaultServers; }; }; }; @@ -78,8 +70,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.yaml-lsp = servers.${cfg.lsp.server}.lspConfig; + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; }) ]); } From e24383e556cf5968e9a80570474db70db92df507 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Mon, 16 Jun 2025 15:23:40 +0100 Subject: [PATCH 029/109] update haskell-tools --- configuration.nix | 3 +- modules/plugins/languages/haskell.nix | 53 ++++++++++++--------------- 2 files changed, 26 insertions(+), 30 deletions(-) diff --git a/configuration.nix b/configuration.nix index dee5001f..55154f1a 100644 --- a/configuration.nix +++ b/configuration.nix @@ -82,7 +82,8 @@ isMaximal: { dart.enable = false; ocaml.enable = false; elixir.enable = false; - haskell.enable = false; + haskell.enable = true; + hcl.enable = true; ruby.enable = false; fsharp.enable = false; diff --git a/modules/plugins/languages/haskell.nix b/modules/plugins/languages/haskell.nix index 13344486..e397baf4 100644 --- a/modules/plugins/languages/haskell.nix +++ b/modules/plugins/languages/haskell.nix @@ -4,46 +4,28 @@ pkgs, ... }: let - inherit (builtins) isList; - inherit (lib.types) either package listOf str; + inherit (builtins) isList attrNames; + inherit (lib.types) either package enum listOf str; inherit (lib.options) mkEnableOption mkOption; inherit (lib.strings) optionalString; inherit (lib.modules) mkIf mkMerge; - inherit (lib.nvim.types) mkGrammarOption enum attrNames; - inherit (lib.nvim.dag) entryAfter; + inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.dag) entryAfter entryBefore; inherit (lib.nvim.lua) expToLua; - inherit (lib.meta) getExe; + inherit (lib.meta) getExe'; inherit (lib.generators) mkLuaInline; inherit (lib.nvim.attrsets) mapListToAttrs; inherit (pkgs) haskellPackages; + inherit (lib.nvim.lua) toLuaObject; cfg = config.vim.languages.haskell; - defaultServers = ["hls"]; + defaultServers = ["haskell-tools"]; servers = { - hls = { - enable = true; - cmd = [(getExe pkgs.haskellPackages.haskell-language-server) "--lsp"]; + haskell-tools = { + enable = false; + cmd = [(getExe' pkgs.haskellPackages.haskell-language-server "haskell-language-server-wrapper") "--lsp"]; filetypes = ["haskell" "lhaskell"]; - on_attach = - mkLuaInline - /* - lua - */ - '' - function(client, bufnr, ht) - default_on_attach(client, bufnr, ht) - local opts = { noremap = true, silent = true, buffer = bufnr } - vim.keymap.set('n', 'cl', vim.lsp.codelens.run, opts) - vim.keymap.set('n', 'hs', ht.hoogle.hoogle_signature, opts) - vim.keymap.set('n', 'ea', ht.lsp.buf_eval_all, opts) - vim.keymap.set('n', 'rr', ht.repl.toggle, opts) - vim.keymap.set('n', 'rf', function() - ht.repl.toggle(vim.api.nvim_buf_get_name(0)) - end, opts) - vim.keymap.set('n', 'rq', ht.repl.quit, opts) - end, - ''; root_dir = mkLuaInline /* @@ -124,7 +106,20 @@ in { }, }, -- Configured through vim.lsp.config - hls = {}, + hls = { + on_attach = function(client, bufnr, ht) + default_on_attach(client, bufnr, ht) + local opts = { noremap = true, silent = true, buffer = bufnr } + vim.keymap.set('n', 'cl', vim.lsp.codelens.run, opts) + vim.keymap.set('n', 'hs', ht.hoogle.hoogle_signature, opts) + vim.keymap.set('n', 'ea', ht.lsp.buf_eval_all, opts) + vim.keymap.set('n', 'rr', ht.repl.toggle, opts) + vim.keymap.set('n', 'rf', function() + ht.repl.toggle(vim.api.nvim_buf_get_name(0)) + end, opts) + vim.keymap.set('n', 'rq', ht.repl.quit, opts) + end, + } ''} ${optionalString cfg.dap.enable '' dap = { From 5436cbf4e788e3cc44d0fbc5153e412d9c113ef9 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Mon, 16 Jun 2025 16:41:38 +0100 Subject: [PATCH 030/109] update astro --- modules/plugins/languages/astro.nix | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/plugins/languages/astro.nix b/modules/plugins/languages/astro.nix index 54bb47a6..c20f5cd2 100644 --- a/modules/plugins/languages/astro.nix +++ b/modules/plugins/languages/astro.nix @@ -34,7 +34,6 @@ */ '' function(_, config) - -- TODO: Make this a shared util function 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 From abec738d2ab3e17557048663db4436e3d7cfbe6d Mon Sep 17 00:00:00 2001 From: sjcobb Date: Mon, 16 Jun 2025 16:41:45 +0100 Subject: [PATCH 031/109] hacky but working haskell --- modules/plugins/languages/haskell.nix | 49 +++++++++++++-------------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/modules/plugins/languages/haskell.nix b/modules/plugins/languages/haskell.nix index e397baf4..0fd39b5e 100644 --- a/modules/plugins/languages/haskell.nix +++ b/modules/plugins/languages/haskell.nix @@ -20,12 +20,32 @@ cfg = config.vim.languages.haskell; - defaultServers = ["haskell-tools"]; + defaultServers = ["hls"]; servers = { - haskell-tools = { + hls = { enable = false; cmd = [(getExe' pkgs.haskellPackages.haskell-language-server "haskell-language-server-wrapper") "--lsp"]; filetypes = ["haskell" "lhaskell"]; + on_attach = + mkLuaInline + /* + lua + */ + '' + function(client, bufnr) + local ht = require("haskell-tools") + default_on_attach(client, bufnr, ht) + local opts = { noremap = true, silent = true, buffer = bufnr } + vim.keymap.set('n', 'cl', vim.lsp.codelens.run, opts) + vim.keymap.set('n', 'hs', ht.hoogle.hoogle_signature, opts) + vim.keymap.set('n', 'ea', ht.lsp.buf_eval_all, opts) + vim.keymap.set('n', 'rr', ht.repl.toggle, opts) + vim.keymap.set('n', 'rf', function() + ht.repl.toggle(vim.api.nvim_buf_get_name(0)) + end, opts) + vim.keymap.set('n', 'rq', ht.repl.quit, opts) + end + ''; root_dir = mkLuaInline /* @@ -81,15 +101,6 @@ in { }; }) - (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; - }) - (mkIf (cfg.dap.enable || cfg.lsp.enable) { vim = { startPlugins = ["haskell-tools-nvim"]; @@ -105,21 +116,7 @@ in { enable = true, }, }, - -- Configured through vim.lsp.config - hls = { - on_attach = function(client, bufnr, ht) - default_on_attach(client, bufnr, ht) - local opts = { noremap = true, silent = true, buffer = bufnr } - vim.keymap.set('n', 'cl', vim.lsp.codelens.run, opts) - vim.keymap.set('n', 'hs', ht.hoogle.hoogle_signature, opts) - vim.keymap.set('n', 'ea', ht.lsp.buf_eval_all, opts) - vim.keymap.set('n', 'rr', ht.repl.toggle, opts) - vim.keymap.set('n', 'rf', function() - ht.repl.toggle(vim.api.nvim_buf_get_name(0)) - end, opts) - vim.keymap.set('n', 'rq', ht.repl.quit, opts) - end, - } + hls = ${toLuaObject servers.hls} ''} ${optionalString cfg.dap.enable '' dap = { From c157e71ebcd2870a410028720de0f6a916226cf6 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Thu, 26 Jun 2025 20:49:07 +0100 Subject: [PATCH 032/109] update todo comment --- modules/plugins/languages/helm.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/plugins/languages/helm.nix b/modules/plugins/languages/helm.nix index b3ca8dc6..a339a3a0 100644 --- a/modules/plugins/languages/helm.nix +++ b/modules/plugins/languages/helm.nix @@ -27,10 +27,10 @@ dynamicRegistration = true; }; }; - # TODO: Reconsider this? Not sure if that necessary. settings = { helm-ls = { yamlls = { + # TODO: Determine if this is a good enough solution path = (head yamlCfg.lsp.servers).cmd; }; }; From 0df2afa52057f08e710fd249093926b165aa0638 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Thu, 26 Jun 2025 20:49:21 +0100 Subject: [PATCH 033/109] implement java module --- modules/plugins/languages/java.nix | 164 +++++++++++++++++++++++++---- 1 file changed, 145 insertions(+), 19 deletions(-) diff --git a/modules/plugins/languages/java.nix b/modules/plugins/languages/java.nix index 2e26feea..0f17a557 100644 --- a/modules/plugins/languages/java.nix +++ b/modules/plugins/languages/java.nix @@ -8,11 +8,60 @@ inherit (lib.modules) mkIf mkMerge; inherit (lib.meta) getExe; inherit (lib.lists) isList; - inherit (lib.types) either listOf package str; + inherit (builtins) attrNames; + inherit (lib.types) either listOf package str enum; inherit (lib.nvim.types) mkGrammarOption; inherit (lib.nvim.lua) expToLua; + 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)"; + }; + }; + }; in { options.vim.languages.java = { enable = mkEnableOption "Java language support"; @@ -23,30 +72,107 @@ in { }; lsp = { - enable = mkEnableOption "Java LSP support (java-language-server)" // {default = config.vim.lsp.enable;}; - package = mkOption { - description = "java language server package, or the command to run as a list of strings"; - example = ''[lib.getExe pkgs.jdt-language-server "-data" "~/.cache/jdtls/workspace"]''; - type = either package (listOf str); - default = pkgs.jdt-language-server; + enable = mkEnableOption "Java LSP support" // {default = config.vim.lsp.enable;}; + servers = mkOption { + description = "Java LSP server to use"; + type = listOf (enum (attrNames servers)); + default = defaultServers; }; }; }; config = mkIf cfg.enable (mkMerge [ (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.jdtls = '' - lspconfig.jdtls.setup { - capabilities = capabilities, - on_attach = default_on_attach, - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else ''{"${getExe cfg.lsp.package}", "-data", vim.fn.stdpath("cache").."/jdtls/workspace"}'' - }, - } - ''; + vim.luaConfigRC.java-stuff = + 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; }) (mkIf cfg.treesitter.enable { From 64c750dfbebb6d137b4b8bcd677ae3dc61cecc7d Mon Sep 17 00:00:00 2001 From: sjcobb Date: Thu, 26 Jun 2025 21:09:50 +0100 Subject: [PATCH 034/109] clean java inherits --- modules/plugins/languages/java.nix | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/modules/plugins/languages/java.nix b/modules/plugins/languages/java.nix index 0f17a557..4428b7cc 100644 --- a/modules/plugins/languages/java.nix +++ b/modules/plugins/languages/java.nix @@ -7,11 +7,9 @@ inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; inherit (lib.meta) getExe; - inherit (lib.lists) isList; inherit (builtins) attrNames; - inherit (lib.types) either listOf package str enum; + inherit (lib.types) listOf enum; inherit (lib.nvim.types) mkGrammarOption; - inherit (lib.nvim.lua) expToLua; inherit (lib.nvim.attrsets) mapListToAttrs; inherit (lib.nvim.dag) entryBefore; inherit (lib.generators) mkLuaInline; @@ -83,7 +81,7 @@ in { config = mkIf cfg.enable (mkMerge [ (mkIf cfg.lsp.enable { - vim.luaConfigRC.java-stuff = + vim.luaConfigRC.jdtls-util = entryBefore ["lsp-servers"] /* lua From e47f268b776a95b80cd0e55599f3647f949b1749 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Thu, 26 Jun 2025 21:09:59 +0100 Subject: [PATCH 035/109] convert julia module --- modules/plugins/languages/julia.nix | 213 ++++++++++++++++++---------- 1 file changed, 140 insertions(+), 73 deletions(-) diff --git a/modules/plugins/languages/julia.nix b/modules/plugins/languages/julia.nix index 8c48b070..16c3164f 100644 --- a/modules/plugins/languages/julia.nix +++ b/modules/plugins/languages/julia.nix @@ -4,63 +4,82 @@ config, ... }: let - inherit (builtins) attrNames isList; + inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption; - inherit (lib.types) either listOf package str enum bool nullOr; + inherit (lib.types) listOf enum; inherit (lib.modules) mkIf mkMerge; - inherit (lib.strings) optionalString; + inherit (lib.meta) getExe; inherit (lib.nvim.types) mkGrammarOption; - inherit (lib.nvim.lua) expToLua; + inherit (lib.generators) mkLuaInline; + inherit (lib.nvim.attrsets) mapListToAttrs; + inherit (lib.nvim.dag) entryBefore; - defaultServer = "julials"; + defaultServers = ["jdtls"]; servers = { - julials = { - package = pkgs.julia.withPackages ["LanguageServer"]; - internalFormatter = true; - lspConfig = '' - lspconfig.julials.setup { - capabilities = capabilities, - on_attach = default_on_attach, - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else '' - { - "${optionalString (cfg.lsp.package != null) "${cfg.lsp.package}/bin/"}julia", - "--startup-file=no", - "--history-file=no", - "--eval", - [[ - using LanguageServer - - 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) - ]] - } - '' - } - } - ''; + jdtls = { + 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 + ''; }; }; @@ -76,11 +95,10 @@ in { }; lsp = { - enable = mkOption { - type = bool; - default = config.vim.lsp.enable; + enable = mkEnableOption "Java LSP support" // {default = config.vim.lsp.enable;}; + servers = mkOption { description = '' - Whether to enable Julia LSP support. + Julia LSP Server to Use ::: {.note} The entirety of Julia is bundled with nvf, if you enable this @@ -92,21 +110,8 @@ in { Julia in your devshells. ::: ''; - }; - - server = mkOption { - type = enum (attrNames servers); - default = defaultServer; - description = "Julia LSP server to use"; - }; - - package = mkOption { - description = '' - Julia LSP server package, `null` to use the Julia binary in {env}`PATH`, or - the command to run as a list of strings. - ''; - type = nullOr (either package (listOf str)); - default = servers.${cfg.lsp.server}.package; + type = listOf (enum (attrNames servers)); + default = defaultServers; }; }; }; @@ -119,8 +124,70 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.julia-lsp = servers.${cfg.lsp.server}.lspConfig; + 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; }) ]); } From a2f1efdc300ecfe19614dacb7395de9ab0f28cce Mon Sep 17 00:00:00 2001 From: sjcobb Date: Fri, 27 Jun 2025 10:24:44 +0100 Subject: [PATCH 036/109] convert kotlin module --- modules/plugins/languages/kotlin.nix | 80 ++++++++++++++++------------ 1 file changed, 45 insertions(+), 35 deletions(-) diff --git a/modules/plugins/languages/kotlin.nix b/modules/plugins/languages/kotlin.nix index 1118afdf..1e454b77 100644 --- a/modules/plugins/languages/kotlin.nix +++ b/modules/plugins/languages/kotlin.nix @@ -6,14 +6,47 @@ }: let inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.modules) mkIf mkMerge; - inherit (lib.meta) getExe; - inherit (lib.types) either package listOf str; + inherit (lib.meta) getExe' getExe; + inherit (builtins) attrNames; + inherit (lib.types) either enum package listOf str; inherit (lib.nvim.types) mkGrammarOption diagnostics; inherit (lib.lists) isList; inherit (lib.nvim.lua) expToLua; + 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 + } + )"; + }; + }; + }; + defaultDiagnosticsProvider = ["ktlint"]; diagnosticsProviders = { ktlint = { @@ -31,22 +64,10 @@ in { lsp = { enable = mkEnableOption "Kotlin LSP support" // {default = config.vim.lsp.enable;}; - - package = mkOption { - description = "kotlin_language_server package with Kotlin runtime"; - type = either package (listOf str); - example = literalExpression '' - pkgs.symlinkJoin { - name = "kotlin-language-server-wrapped"; - paths = [pkgs.kotlin-language-server]; - nativeBuildInputs = [pkgs.makeBinaryWrapper]; - postBuild = ''' - wrapProgram $out/bin/kotlin-language-server \ - --prefix PATH : ''${pkgs.kotlin}/bin - '''; - }; - ''; - default = pkgs.kotlin-language-server; + servers = mkOption { + description = "Kotlin LSP server to use"; + type = listOf (enum (attrNames servers)); + default = defaultServers; }; }; @@ -78,23 +99,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.kotlin_language_server = '' - lspconfig.kotlin_language_server.setup { - capabilities = capabilities, - root_dir = lspconfig.util.root_pattern("main.kt", ".git"), - on_attach=default_on_attach, - init_options = { - -- speeds up the startup time for the LSP - storagePath = vim.fn.stdpath('state') .. '/kotlin', - }, - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else ''{"${cfg.lsp.package}/bin/kotlin-language-server"}'' - }, - } - ''; + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; }) ]); } From 0894b13b2fae307085c3e20118981e011859f56f Mon Sep 17 00:00:00 2001 From: sjcobb Date: Tue, 1 Jul 2025 15:50:48 +0100 Subject: [PATCH 037/109] clean kotlin --- modules/plugins/languages/kotlin.nix | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/modules/plugins/languages/kotlin.nix b/modules/plugins/languages/kotlin.nix index 1e454b77..27875336 100644 --- a/modules/plugins/languages/kotlin.nix +++ b/modules/plugins/languages/kotlin.nix @@ -4,14 +4,12 @@ lib, ... }: let - inherit (lib.options) mkEnableOption mkOption literalExpression; + inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; inherit (lib.meta) getExe' getExe; inherit (builtins) attrNames; - inherit (lib.types) either enum package listOf str; + inherit (lib.types) enum listOf; inherit (lib.nvim.types) mkGrammarOption diagnostics; - inherit (lib.lists) isList; - inherit (lib.nvim.lua) expToLua; inherit (lib.generators) mkLuaInline; inherit (lib.nvim.attrsets) mapListToAttrs; From 7afe8674d4ecadf884e80e4490f059fb85eae82d Mon Sep 17 00:00:00 2001 From: sjcobb Date: Tue, 1 Jul 2025 15:50:58 +0100 Subject: [PATCH 038/109] convert lua module --- modules/plugins/languages/lua.nix | 56 +++++++++++++++++++------------ 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/modules/plugins/languages/lua.nix b/modules/plugins/languages/lua.nix index 9f56cbea..6bc9941e 100644 --- a/modules/plugins/languages/lua.nix +++ b/modules/plugins/languages/lua.nix @@ -8,13 +8,32 @@ inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; inherit (lib.meta) getExe; - inherit (lib.lists) isList; - inherit (lib.types) bool either enum listOf package str; + inherit (lib.types) bool enum listOf package; inherit (lib.nvim.types) diagnostics mkGrammarOption; - inherit (lib.nvim.lua) expToLua; inherit (lib.nvim.dag) entryBefore; + inherit (lib.nvim.attrsets) mapListToAttrs; 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" + ]; + }; + }; + defaultFormat = "stylua"; formats = { stylua = { @@ -43,12 +62,11 @@ in { }; lsp = { - enable = mkEnableOption "Lua LSP support via LuaLS" // {default = config.vim.lsp.enable;}; - - package = mkOption { - description = "LuaLS package, or the command to run as a list of strings"; - type = either package (listOf str); - default = pkgs.lua-language-server; + enable = mkEnableOption "Lua LSP support" // {default = config.vim.lsp.enable;}; + servers = mkOption { + description = "Lua LSP server to use"; + type = listOf (enum (attrNames servers)); + default = defaultServers; }; lazydev.enable = mkEnableOption "lazydev.nvim integration, useful for neovim plugin developers"; @@ -91,23 +109,17 @@ in { (mkIf cfg.enable (mkMerge [ (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.lua-lsp = '' - lspconfig.lua_ls.setup { - capabilities = capabilities; - on_attach = default_on_attach; - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else ''{"${getExe cfg.lsp.package}"}'' - }; - } - ''; + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; }) (mkIf cfg.lsp.lazydev.enable { vim.startPlugins = ["lazydev-nvim"]; - vim.pluginRC.lazydev = entryBefore ["lua-lsp"] '' + vim.pluginRC.lazydev = entryBefore ["lsp-servers"] '' require("lazydev").setup({ enabled = function(root_dir) return not vim.uv.fs_stat(root_dir .. "/.luarc.json") From 1f3b417469b4c56af9a0108f89f8f3d1c46f6c86 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Wed, 2 Jul 2025 00:15:21 +0100 Subject: [PATCH 039/109] convert lua module --- modules/plugins/languages/lua.nix | 56 ++++++++++++------------------- 1 file changed, 22 insertions(+), 34 deletions(-) diff --git a/modules/plugins/languages/lua.nix b/modules/plugins/languages/lua.nix index 6bc9941e..9f56cbea 100644 --- a/modules/plugins/languages/lua.nix +++ b/modules/plugins/languages/lua.nix @@ -8,32 +8,13 @@ inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; inherit (lib.meta) getExe; - inherit (lib.types) bool enum listOf package; + inherit (lib.lists) isList; + inherit (lib.types) bool either enum listOf package str; inherit (lib.nvim.types) diagnostics mkGrammarOption; + inherit (lib.nvim.lua) expToLua; inherit (lib.nvim.dag) entryBefore; - inherit (lib.nvim.attrsets) mapListToAttrs; 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" - ]; - }; - }; - defaultFormat = "stylua"; formats = { stylua = { @@ -62,11 +43,12 @@ in { }; lsp = { - enable = mkEnableOption "Lua LSP support" // {default = config.vim.lsp.enable;}; - servers = mkOption { - description = "Lua LSP server to use"; - type = listOf (enum (attrNames servers)); - default = defaultServers; + enable = mkEnableOption "Lua LSP support via LuaLS" // {default = config.vim.lsp.enable;}; + + package = mkOption { + description = "LuaLS package, or the command to run as a list of strings"; + type = either package (listOf str); + default = pkgs.lua-language-server; }; lazydev.enable = mkEnableOption "lazydev.nvim integration, useful for neovim plugin developers"; @@ -109,17 +91,23 @@ in { (mkIf cfg.enable (mkMerge [ (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim.lsp.lspconfig.enable = true; + vim.lsp.lspconfig.sources.lua-lsp = '' + lspconfig.lua_ls.setup { + capabilities = capabilities; + on_attach = default_on_attach; + cmd = ${ + if isList cfg.lsp.package + then expToLua cfg.lsp.package + else ''{"${getExe cfg.lsp.package}"}'' + }; + } + ''; }) (mkIf cfg.lsp.lazydev.enable { vim.startPlugins = ["lazydev-nvim"]; - vim.pluginRC.lazydev = entryBefore ["lsp-servers"] '' + vim.pluginRC.lazydev = entryBefore ["lua-lsp"] '' require("lazydev").setup({ enabled = function(root_dir) return not vim.uv.fs_stat(root_dir .. "/.luarc.json") From 16c7c28ba105dd7834e66a713f57143070df91f3 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Wed, 2 Jul 2025 00:15:37 +0100 Subject: [PATCH 040/109] convert nim module --- modules/plugins/languages/nim.nix | 62 +++++++++++++++---------------- modules/plugins/languages/nu.nix | 57 ++++++++++++++-------------- 2 files changed, 60 insertions(+), 59 deletions(-) diff --git a/modules/plugins/languages/nim.nix b/modules/plugins/languages/nim.nix index d9a29e37..571f0761 100644 --- a/modules/plugins/languages/nim.nix +++ b/modules/plugins/languages/nim.nix @@ -6,32 +6,34 @@ }: let inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption; - inherit (lib.meta) getExe; + inherit (lib.meta) getExe'; inherit (lib.modules) mkIf mkMerge; - inherit (lib.lists) isList; - inherit (lib.types) enum either listOf package str; + inherit (lib.types) enum listOf package; inherit (lib.nvim.types) mkGrammarOption; - inherit (lib.nvim.lua) expToLua; + inherit (lib.generators) mkLuaInline; + inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.nim; - defaultServer = "nimlsp"; + defaultServers = ["nimlsp"]; servers = { nimlsp = { - package = pkgs.nimlsp; - lspConfig = '' - lspconfig.nimls.setup{ - capabilities = capabilities; - on_attach = default_on_attach; - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else '' - {"${cfg.lsp.package}/bin/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 + ''; }; }; @@ -55,17 +57,11 @@ in { lsp = { enable = mkEnableOption "Nim LSP support" // {default = config.vim.lsp.enable;}; - server = mkOption { - description = "Nim LSP server to use"; - type = str; - default = defaultServer; - }; - package = mkOption { - description = "Nim LSP server package, or the command to run as a list of strings"; - example = ''[lib.getExe pkgs.nimlsp]''; - type = either package (listOf str); - default = servers.${cfg.lsp.server}.package; + servers = mkOption { + description = "Nim LSP server to use"; + type = listOf (enum (attrNames servers)); + default = defaultServers; }; }; @@ -101,8 +97,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.nim-lsp = servers.${cfg.lsp.server}.lspConfig; + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; }) (mkIf cfg.format.enable { diff --git a/modules/plugins/languages/nu.nix b/modules/plugins/languages/nu.nix index bd007fc8..21acccb3 100644 --- a/modules/plugins/languages/nu.nix +++ b/modules/plugins/languages/nu.nix @@ -5,27 +5,30 @@ ... }: let inherit (lib.options) mkEnableOption mkOption; - inherit (lib.types) str either package listOf; + inherit (lib.types) enum listOf; inherit (lib.modules) mkIf mkMerge; - inherit (lib.nvim.lua) expToLua; inherit (lib.nvim.types) mkGrammarOption; - inherit (builtins) isList; + inherit (lib.meta) getExe; + inherit (lib.generators) mkLuaInline; + inherit (lib.nvim.attrsets) mapListToAttrs; + inherit (builtins) attrNames; - defaultServer = "nushell"; + defaultServers = ["nushell"]; servers = { nushell = { - package = pkgs.nushell; - lspConfig = '' - lspconfig.nushell.setup{ - capabilities = capabilities, - on_attach = default_on_attach, - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else ''{"${cfg.lsp.package}/bin/nu", "--no-config-file", "--lsp"}'' - } - } - ''; + 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 + ''; }; }; @@ -41,17 +44,11 @@ in { lsp = { enable = mkEnableOption "Nu LSP support" // {default = config.vim.lsp.enable;}; - server = mkOption { - type = str; - default = defaultServer; - description = "Nu LSP server to use"; - }; - package = mkOption { - type = either package (listOf str); - default = servers.${cfg.lsp.server}.package; - example = ''[(lib.getExe pkgs.nushell) "--lsp"]''; - description = "Nu LSP server package, or the command to run as a list of strings"; + servers = mkOption { + description = "Nu LSP server to use"; + type = listOf (enum (attrNames servers)); + default = defaultServers; }; }; }; @@ -63,8 +60,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.nu-lsp = servers.${cfg.lsp.server}.lspConfig; + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; }) ]); } From c743bca93f34d8830ef4e61502ff90797b82a6b3 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Wed, 2 Jul 2025 00:19:05 +0100 Subject: [PATCH 041/109] convert lua module --- modules/plugins/languages/lua.nix | 56 +++++++++++++++++++------------ 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/modules/plugins/languages/lua.nix b/modules/plugins/languages/lua.nix index 9f56cbea..6bc9941e 100644 --- a/modules/plugins/languages/lua.nix +++ b/modules/plugins/languages/lua.nix @@ -8,13 +8,32 @@ inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; inherit (lib.meta) getExe; - inherit (lib.lists) isList; - inherit (lib.types) bool either enum listOf package str; + inherit (lib.types) bool enum listOf package; inherit (lib.nvim.types) diagnostics mkGrammarOption; - inherit (lib.nvim.lua) expToLua; inherit (lib.nvim.dag) entryBefore; + inherit (lib.nvim.attrsets) mapListToAttrs; 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" + ]; + }; + }; + defaultFormat = "stylua"; formats = { stylua = { @@ -43,12 +62,11 @@ in { }; lsp = { - enable = mkEnableOption "Lua LSP support via LuaLS" // {default = config.vim.lsp.enable;}; - - package = mkOption { - description = "LuaLS package, or the command to run as a list of strings"; - type = either package (listOf str); - default = pkgs.lua-language-server; + enable = mkEnableOption "Lua LSP support" // {default = config.vim.lsp.enable;}; + servers = mkOption { + description = "Lua LSP server to use"; + type = listOf (enum (attrNames servers)); + default = defaultServers; }; lazydev.enable = mkEnableOption "lazydev.nvim integration, useful for neovim plugin developers"; @@ -91,23 +109,17 @@ in { (mkIf cfg.enable (mkMerge [ (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.lua-lsp = '' - lspconfig.lua_ls.setup { - capabilities = capabilities; - on_attach = default_on_attach; - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else ''{"${getExe cfg.lsp.package}"}'' - }; - } - ''; + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; }) (mkIf cfg.lsp.lazydev.enable { vim.startPlugins = ["lazydev-nvim"]; - vim.pluginRC.lazydev = entryBefore ["lua-lsp"] '' + vim.pluginRC.lazydev = entryBefore ["lsp-servers"] '' require("lazydev").setup({ enabled = function(root_dir) return not vim.uv.fs_stat(root_dir .. "/.luarc.json") From 3210c00340046ecf6fdb42853f1861066642c375 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Tue, 8 Jul 2025 09:18:18 +0100 Subject: [PATCH 042/109] format gleam module --- modules/plugins/languages/gleam.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/plugins/languages/gleam.nix b/modules/plugins/languages/gleam.nix index 3397a469..5f4e4b4f 100644 --- a/modules/plugins/languages/gleam.nix +++ b/modules/plugins/languages/gleam.nix @@ -22,7 +22,7 @@ enable = true; cmd = [(getExe pkgs.gleam) "lsp"]; filetypes = ["gleam"]; - root_markers = [ "gleam.toml" ".git" ]; + root_markers = ["gleam.toml" ".git"]; }; }; in { From a0f396aa286466cc33e388112264fc972470eb2b Mon Sep 17 00:00:00 2001 From: sjcobb Date: Tue, 8 Jul 2025 09:18:47 +0100 Subject: [PATCH 043/109] convert ocaml module --- modules/plugins/languages/ocaml.nix | 78 ++++++++++++++++++----------- 1 file changed, 50 insertions(+), 28 deletions(-) diff --git a/modules/plugins/languages/ocaml.nix b/modules/plugins/languages/ocaml.nix index 995ca04d..f0976048 100644 --- a/modules/plugins/languages/ocaml.nix +++ b/modules/plugins/languages/ocaml.nix @@ -8,28 +8,50 @@ inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; inherit (lib.meta) getExe; - inherit (lib.lists) isList; - inherit (lib.types) either enum listOf package str; + inherit (lib.types) enum listOf package; inherit (lib.nvim.types) mkGrammarOption; - inherit (lib.nvim.lua) expToLua; + inherit (lib.generators) mkLuaInline; + inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.ocaml; - defaultServer = "ocaml-lsp"; + defaultServers = ["ocaml-lsp"]; servers = { ocaml-lsp = { - package = pkgs.ocamlPackages.ocaml-lsp; - lspConfig = '' - lspconfig.ocamllsp.setup { - capabilities = capabilities, - on_attach = default_on_attach, - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else ''{"${getExe cfg.lsp.package}"}'' - }; - } - ''; + 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 + ''; }; }; @@ -49,16 +71,12 @@ in { }; lsp = { - enable = mkEnableOption "OCaml LSP support (ocaml-lsp)" // {default = config.vim.lsp.enable;}; - server = mkOption { - description = "OCaml LSP server to user"; - type = enum (attrNames servers); - default = defaultServer; - }; - package = mkOption { - description = "OCaml language server package, or the command to run as a list of strings"; - type = either package (listOf str); - default = servers.${cfg.lsp.server}.package; + enable = mkEnableOption "OCaml LSP support" // {default = config.vim.lsp.enable;}; + + servers = mkOption { + description = "OCaml LSP server to use"; + type = listOf (enum (attrNames servers)); + default = defaultServers; }; }; @@ -79,8 +97,12 @@ in { config = mkIf cfg.enable (mkMerge [ (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.ocaml-lsp = servers.${cfg.lsp.server}.lspConfig; + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; }) (mkIf cfg.treesitter.enable { From 2083f7d87fb20291a547065ebfe61b2221eed7f4 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Tue, 8 Jul 2025 09:58:50 +0100 Subject: [PATCH 044/109] format and post merge fixes --- modules/plugins/languages/astro.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/plugins/languages/astro.nix b/modules/plugins/languages/astro.nix index 75aac02c..f2c8517a 100644 --- a/modules/plugins/languages/astro.nix +++ b/modules/plugins/languages/astro.nix @@ -13,6 +13,7 @@ inherit (lib.nvim.lua) expToLua; inherit (lib.nvim.attrsets) mapListToAttrs; inherit (lib.nvim.types) mkGrammarOption diagnostics; + inherit (lib.generators) mkLuaInline; cfg = config.vim.languages.astro; From e95f57a8b396d6864bffc744b2a75b441a6e9f79 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Tue, 8 Jul 2025 12:37:44 +0100 Subject: [PATCH 045/109] convert odin module --- modules/plugins/languages/odin.nix | 54 +++++++++++++++--------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/modules/plugins/languages/odin.nix b/modules/plugins/languages/odin.nix index 6d20351c..9b82bcb8 100644 --- a/modules/plugins/languages/odin.nix +++ b/modules/plugins/languages/odin.nix @@ -7,26 +7,28 @@ inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; - inherit (lib.lists) isList; - inherit (lib.types) either listOf package str enum; - inherit (lib.nvim.lua) expToLua; + inherit (lib.types) listOf enum; + inherit (lib.meta) getExe; inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.generators) mkLuaInline; + inherit (lib.nvim.attrsets) mapListToAttrs; - defaultServer = "ols"; + defaultServers = ["ols"]; servers = { ols = { - package = pkgs.ols; - lspConfig = '' - lspconfig.ols.setup { - capabilities = capabilities, - on_attach = default_on_attach, - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else "{'${cfg.lsp.package}/bin/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''; }; }; @@ -43,16 +45,10 @@ in { lsp = { enable = mkEnableOption "Odin LSP support" // {default = config.vim.lsp.enable;}; - server = mkOption { - type = enum (attrNames servers); - default = defaultServer; + servers = mkOption { description = "Odin LSP server to use"; - }; - - package = mkOption { - description = "Ols package, or the command to run as a list of strings"; - type = either package (listOf str); - default = pkgs.ols; + type = listOf (enum (attrNames servers)); + default = defaultServers; }; }; }; @@ -64,8 +60,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.odin-lsp = servers.${cfg.lsp.server}.lspConfig; + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; }) ]); } From 36146ca31df8139861f6a15413da4ab73d580f3b Mon Sep 17 00:00:00 2001 From: sjcobb Date: Tue, 8 Jul 2025 15:26:45 +0100 Subject: [PATCH 046/109] convert php module --- modules/plugins/languages/php.nix | 129 ++++++++++++------------------ 1 file changed, 52 insertions(+), 77 deletions(-) diff --git a/modules/plugins/languages/php.nix b/modules/plugins/languages/php.nix index 61ff0425..0818a5eb 100644 --- a/modules/plugins/languages/php.nix +++ b/modules/plugins/languages/php.nix @@ -8,81 +8,60 @@ inherit (lib.options) mkEnableOption mkOption; inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; - inherit (lib.lists) isList; - inherit (lib.types) enum either listOf package str; + inherit (lib.types) enum listOf; inherit (lib.nvim.types) mkGrammarOption; - inherit (lib.nvim.lua) expToLua; + inherit (lib.nvim.attrsets) mapListToAttrs; + inherit (lib.generators) mkLuaInline; cfg = config.vim.languages.php; - defaultServer = "phpactor"; + defaultServers = ["phpactor"]; servers = { phpactor = { - package = pkgs.phpactor; - lspConfig = '' - lspconfig.phpactor.setup{ - capabilities = capabilities, - on_attach = default_on_attach, - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else '' - { - "${getExe cfg.lsp.package}", - "language-server" - }, - '' - } - } - ''; + enable = true; + cmd = [(getExe pkgs.phpactor) "language-server"]; + filetypes = ["php"]; + root_markers = [".git" "composer.json" ".phpactor.json" ".phpactor.yml"]; + workspace_required = true; }; phan = { - package = pkgs.php81Packages.phan; - lspConfig = '' - lspconfig.phan.setup{ - capabilities = capabilities, - on_attach = default_on_attach, - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else '' - { - "${getExe cfg.lsp.package}", - "-m", - "json", - "--no-color", - "--no-progress-bar", - "-x", - "-u", - "-S", - "--language-server-on-stdin", - "--allow-polyfill-parser" - }, - '' - } - } - ''; + 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 = { - package = pkgs.intelephense; - lspConfig = '' - lspconfig.intelephense.setup{ - capabilities = capabilities, - on_attach = default_on_attach, - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else '' - { - "${getExe cfg.lsp.package}", - "--stdio" - }, - '' - } - } - ''; + enable = true; + cmd = [(getExe pkgs.intelephense) "--stdio"]; + filetypes = ["php"]; + root_markers = ["composer.json" ".git"]; }; }; in { @@ -97,17 +76,10 @@ in { lsp = { enable = mkEnableOption "PHP LSP support" // {default = config.vim.lsp.enable;}; - server = mkOption { + servers = mkOption { description = "PHP LSP server to use"; - type = enum (attrNames servers); - default = defaultServer; - }; - - package = mkOption { - description = "PHP LSP server package, or the command to run as a list of strings"; - example = ''[lib.getExe pkgs.jdt-language-server " - data " " ~/.cache/jdtls/workspace "]''; - type = either package (listOf str); - default = servers.${cfg.lsp.server}.package; + type = listOf (enum (attrNames servers)); + default = defaultServers; }; }; }; @@ -117,11 +89,14 @@ in { vim.treesitter.enable = true; vim.treesitter.grammars = [cfg.treesitter.package]; }) + (mkIf cfg.lsp.enable { - vim.lsp.lspconfig = { - enable = true; - sources.php-lsp = servers.${cfg.lsp.server}.lspConfig; - }; + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; }) ]); } From cbd8b66669af8060c4366000dec3810dcdef7d12 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Wed, 9 Jul 2025 09:44:29 +0100 Subject: [PATCH 047/109] convert python module --- modules/plugins/languages/python.nix | 176 +++++++++++++++++++-------- 1 file changed, 126 insertions(+), 50 deletions(-) diff --git a/modules/plugins/languages/python.nix b/modules/plugins/languages/python.nix index bec7ec8b..1fc26e40 100644 --- a/modules/plugins/languages/python.nix +++ b/modules/plugins/languages/python.nix @@ -8,57 +8,114 @@ inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; - inherit (lib.lists) isList; - inherit (lib.types) enum either listOf package str bool; - inherit (lib.nvim.lua) expToLua; + inherit (lib.types) enum listOf package str bool; + inherit (lib.nvim.attrsets) mapListToAttrs; + inherit (lib.generators) mkLuaInline; + inherit (lib.nvim.dag) entryBefore; cfg = config.vim.languages.python; - defaultServer = "basedpyright"; + defaultServers = ["basedpyright"]; servers = { pyright = { - package = pkgs.pyright; - lspConfig = '' - lspconfig.pyright.setup{ - capabilities = capabilities; - on_attach = default_on_attach; - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else ''{"${cfg.lsp.package}/bin/pyright-langserver", "--stdio"}'' - } - } + enable = true; + cmd = [(getExe pkgs.pyright) "--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() + client:exec_cmd({ + command = 'pyright.organizeimports', + arguments = { vim.uri_from_bufnr(bufnr) }, + }) + end, { + desc = 'Organize Imports', + }) + vim.api.nvim_buf_create_user_command(bufnr, 'LspPyrightSetPythonPath', function(opts) + set_python_path('pyright', opts.args) + end, { + desc = 'Reconfigure pyright with the provided python path', + nargs = 1, + complete = 'file', + }) + end ''; }; basedpyright = { - package = pkgs.basedpyright; - lspConfig = '' - lspconfig.basedpyright.setup{ - capabilities = capabilities; - on_attach = default_on_attach; - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else ''{"${cfg.lsp.package}/bin/basedpyright-langserver", "--stdio"}'' - } - } + enable = true; + cmd = [(getExe pkgs.basedpyright) "--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() + client:exec_cmd({ + command = 'basedpyright.organizeimports', + arguments = { vim.uri_from_bufnr(bufnr) }, + }) + end, { + desc = 'Organize Imports', + }) + + vim.api.nvim_buf_create_user_command(bufnr, 'LspPyrightSetPythonPath', function(opts) + set_python_path('basedpyright', opts.args) + end, { + desc = 'Reconfigure basedpyright with the provided python path', + nargs = 1, + complete = 'file', + }) + end ''; }; python-lsp-server = { - package = pkgs.python3Packages.python-lsp-server; - lspConfig = '' - lspconfig.pylsp.setup{ - capabilities = capabilities; - on_attach = default_on_attach; - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else ''{"${cfg.lsp.package}/bin/pylsp"}'' - } - } - ''; + enable = true; + cmd = [(getExe pkgs.python3Packages.python-lsp-server)]; + filetypes = ["python"]; + root_markers = [ + "pyproject.toml" + "setup.py" + "setup.cfg" + "requirements.txt" + "Pipfile" + ".git" + ]; }; }; @@ -171,17 +228,10 @@ in { lsp = { enable = mkEnableOption "Python LSP support" // {default = config.vim.lsp.enable;}; - server = mkOption { + servers = mkOption { description = "Python LSP server to use"; - type = enum (attrNames servers); - default = defaultServer; - }; - - package = mkOption { - description = "python LSP server package, or the command to run as a list of strings"; - example = ''[lib.getExe pkgs.jdt-language-server "-data" "~/.cache/jdtls/workspace"]''; - type = either package (listOf str); - default = servers.${cfg.lsp.server}.package; + type = listOf (enum (attrNames servers)); + default = defaultServers; }; }; @@ -234,8 +284,34 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.python-lsp = servers.${cfg.lsp.server}.lspConfig; + vim.luaConfigRC.python-util = + entryBefore ["lsp-servers"] + /* + lua + */ + '' + local function set_python_path(server_name, path) + 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; }) (mkIf cfg.format.enable { From 11bb5982c5aae221a6f5e7c9643150810e8bf29a Mon Sep 17 00:00:00 2001 From: sjcobb Date: Wed, 9 Jul 2025 10:19:19 +0100 Subject: [PATCH 048/109] convert r module --- modules/plugins/languages/r.nix | 50 ++++++++++++++------------------- 1 file changed, 21 insertions(+), 29 deletions(-) diff --git a/modules/plugins/languages/r.nix b/modules/plugins/languages/r.nix index 894c63f6..7f5ffc95 100644 --- a/modules/plugins/languages/r.nix +++ b/modules/plugins/languages/r.nix @@ -7,10 +7,11 @@ inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.modules) mkIf mkMerge; - inherit (lib.lists) isList; - inherit (lib.types) enum either listOf package str; - inherit (lib.nvim.lua) expToLua; + inherit (lib.types) enum listOf package; + inherit (lib.meta) getExe; inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.attrsets) mapListToAttrs; + inherit (lib.generators) mkLuaInline; cfg = config.vim.languages.r; @@ -50,22 +51,16 @@ }; }; - defaultServer = "r_language_server"; + defaultServers = ["r_language_server"]; servers = { r_language_server = { - package = pkgs.writeShellScriptBin "r_lsp" '' - ${r-with-languageserver}/bin/R --slave -e "languageserver::run()" - ''; - lspConfig = '' - lspconfig.r_language_server.setup{ - capabilities = capabilities; - on_attach = default_on_attach; - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else ''{"${lib.getExe cfg.lsp.package}"}'' - } - } + 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 ''; }; }; @@ -81,17 +76,10 @@ in { lsp = { enable = mkEnableOption "R LSP support" // {default = config.vim.lsp.enable;}; - server = mkOption { + servers = mkOption { description = "R LSP server to use"; - type = enum (attrNames servers); - default = defaultServer; - }; - - package = mkOption { - description = "R LSP server package, or the command to run as a list of strings"; - example = literalExpression "[ (lib.getExe pkgs.jdt-language-server) \"-data\" \"~/.cache/jdtls/workspace\" ]"; - type = either package (listOf str); - default = servers.${cfg.lsp.server}.package; + type = listOf (enum (attrNames servers)); + default = defaultServers; }; }; @@ -127,8 +115,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.r-lsp = servers.${cfg.lsp.server}.lspConfig; + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; }) ]); } From d0e8de0951f7728024b1ecbb7582ddf081db2ca7 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Fri, 11 Jul 2025 14:01:35 +0100 Subject: [PATCH 049/109] convert ruby module --- modules/plugins/languages/ruby.nix | 83 ++++++++++++++---------------- 1 file changed, 39 insertions(+), 44 deletions(-) diff --git a/modules/plugins/languages/ruby.nix b/modules/plugins/languages/ruby.nix index 1f3ce82f..46892df6 100644 --- a/modules/plugins/languages/ruby.nix +++ b/modules/plugins/languages/ruby.nix @@ -9,44 +9,41 @@ inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; inherit (lib.nvim.types) mkGrammarOption diagnostics; - inherit (lib.nvim.lua) expToLua; - inherit (lib.lists) isList; - inherit (lib.types) either listOf package str enum; + inherit (lib.types) listOf package enum; + inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.ruby; - defaultServer = "rubyserver"; + defaultServers = ["solargraph"]; servers = { - rubyserver = { - package = pkgs.rubyPackages.solargraph; - lspConfig = '' - lspconfig.solargraph.setup { - capabilities = capabilities, - on_attach = attach_keymaps, - flags = { - debounce_text_changes = 150, - }, - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else ''{ "${cfg.lsp.package}/bin/solargraph", "stdio" }'' - } - } - ''; + ruby_lsp = { + enable = true; + cmd = [(getExe pkgs.ruby-lsp)]; + filetypes = ["ruby" "eruby"]; + root_markers = ["Gemfile" ".git"]; + init_options = { + formatter = "auto"; + }; }; - rubylsp = { - package = pkgs.ruby-lsp; - lspConfig = '' - lspconfig.ruby_lsp.setup { - capabilities = capabilities, - on_attach = default_on_attach, - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else ''{ "${cfg.lsp.package}/bin/ruby-lsp" }'' - } - } - ''; + + 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; + }; }; }; @@ -79,17 +76,11 @@ in { lsp = { enable = mkEnableOption "Ruby LSP support" // {default = config.vim.lsp.enable;}; - server = mkOption { - type = enum (attrNames servers); - default = defaultServer; + servers = mkOption { + type = listOf (enum (attrNames servers)); default = defaultServers; + default = defaultServers; description = "Ruby LSP server to use"; }; - - package = mkOption { - type = either package (listOf str); - default = servers.${cfg.lsp.server}.package; - description = "Ruby LSP server package, or the command to run as a list of strings"; - }; }; format = { @@ -128,8 +119,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.ruby-lsp = servers.${cfg.lsp.server}.lspConfig; + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; }) (mkIf cfg.format.enable { From 7e4a58b6f8079bcb63c2b6cb5760ab34be523744 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Fri, 11 Jul 2025 14:03:51 +0100 Subject: [PATCH 050/109] convert sql module --- modules/plugins/languages/sql.nix | 55 +++++++++++++------------------ 1 file changed, 23 insertions(+), 32 deletions(-) diff --git a/modules/plugins/languages/sql.nix b/modules/plugins/languages/sql.nix index add46c15..bbe7ffc2 100644 --- a/modules/plugins/languages/sql.nix +++ b/modules/plugins/languages/sql.nix @@ -8,31 +8,27 @@ inherit (lib.options) mkEnableOption mkOption; inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; - inherit (lib.lists) isList; - inherit (lib.types) enum either listOf package str; - inherit (lib.nvim.lua) expToLua; + inherit (lib.types) enum listOf package str; inherit (lib.nvim.types) diagnostics; + inherit (lib.nvim.attrsets) mapListToAttrs; + inherit (lib.generators) mkLuaInline; cfg = config.vim.languages.sql; sqlfluffDefault = pkgs.sqlfluff; - defaultServer = "sqls"; + defaultServers = ["sqls"]; servers = { sqls = { - package = pkgs.sqls; - lspConfig = '' - lspconfig.sqls.setup { - on_attach = function(client) - client.server_capabilities.execute_command = true - on_attach_keymaps(client, bufnr) - require'sqls'.setup{} - end, - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else ''{ "${cfg.lsp.package}/bin/sqls", "-config", string.format("%s/config.yml", vim.fn.getcwd()) }'' - } - } + 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 ''; }; }; @@ -81,17 +77,10 @@ in { lsp = { enable = mkEnableOption "SQL LSP support" // {default = config.vim.lsp.enable;}; - server = mkOption { + servers = mkOption { description = "SQL LSP server to use"; - type = enum (attrNames servers); - default = defaultServer; - }; - - package = mkOption { - description = "SQL LSP server package, or the command to run as a list of strings"; - example = ''[lib.getExe pkgs.jdt-language-server "-data" "~/.cache/jdtls/workspace"]''; - type = either package (listOf str); - default = servers.${cfg.lsp.server}.package; + type = listOf (enum (attrNames servers)); + default = defaultServers; }; }; @@ -132,10 +121,12 @@ in { vim = { startPlugins = ["sqls-nvim"]; - lsp.lspconfig = { - enable = true; - sources.sql-lsp = servers.${cfg.lsp.server}.lspConfig; - }; + lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; }; }) From 632e60736f47f26ff19de5f2e64b6ea4fe1a32d7 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Fri, 11 Jul 2025 14:05:16 +0100 Subject: [PATCH 051/109] convert svelte module --- modules/plugins/languages/svelte.nix | 62 ++++++++++++++++------------ 1 file changed, 35 insertions(+), 27 deletions(-) diff --git a/modules/plugins/languages/svelte.nix b/modules/plugins/languages/svelte.nix index 4cc9ffe9..dd0bbc21 100644 --- a/modules/plugins/languages/svelte.nix +++ b/modules/plugins/languages/svelte.nix @@ -7,28 +7,39 @@ inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; - inherit (lib.lists) isList; inherit (lib.meta) getExe; - inherit (lib.types) enum either listOf package str; - inherit (lib.nvim.lua) expToLua; + inherit (lib.types) enum listOf package; inherit (lib.nvim.types) mkGrammarOption diagnostics; + inherit (lib.nvim.attrsets) mapListToAttrs; + inherit (lib.generators) mkLuaInline; cfg = config.vim.languages.svelte; - defaultServer = "svelte"; + defaultServers = ["svelte"]; servers = { svelte = { - package = pkgs.svelte-language-server; - lspConfig = '' - lspconfig.svelte.setup { - capabilities = capabilities; - on_attach = attach_keymaps, - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else ''{"${cfg.lsp.package}/bin/svelteserver", "--stdio"}'' - } - } + 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_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 ''; }; }; @@ -78,17 +89,10 @@ in { lsp = { enable = mkEnableOption "Svelte LSP support" // {default = config.vim.lsp.enable;}; - server = mkOption { + servers = mkOption { description = "Svelte LSP server to use"; - type = enum (attrNames servers); - default = defaultServer; - }; - - package = mkOption { - description = "Svelte LSP server package, or the command to run as a list of strings"; - example = ''[lib.getExe pkgs.jdt-language-server "-data" "~/.cache/jdtls/workspace"]''; - type = either package (listOf str); - default = servers.${cfg.lsp.server}.package; + type = listOf (enum (attrNames servers)); + default = defaultServers; }; }; @@ -126,8 +130,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.svelte-lsp = servers.${cfg.lsp.server}.lspConfig; + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; }) (mkIf cfg.format.enable { From 3937b2af6438516ce72c3bd1c0859ab8f8720447 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Fri, 11 Jul 2025 14:07:12 +0100 Subject: [PATCH 052/109] convert tailwind module --- modules/plugins/languages/tailwind.nix | 169 +++++++++++++++++++++---- 1 file changed, 141 insertions(+), 28 deletions(-) diff --git a/modules/plugins/languages/tailwind.nix b/modules/plugins/languages/tailwind.nix index fbe707ba..be895387 100644 --- a/modules/plugins/languages/tailwind.nix +++ b/modules/plugins/languages/tailwind.nix @@ -7,26 +7,142 @@ inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; - inherit (lib.lists) isList; - inherit (lib.types) enum either listOf package str; - inherit (lib.nvim.lua) expToLua; + inherit (lib.meta) getExe; + inherit (lib.types) enum listOf; + inherit (lib.nvim.attrsets) mapListToAttrs; + inherit (lib.generators) mkLuaInline; cfg = config.vim.languages.tailwind; - defaultServer = "tailwindcss-language-server"; + defaultServers = ["tailwindcss"]; servers = { - tailwindcss-language-server = { - package = pkgs.tailwindcss-language-server; - lspConfig = '' - lspconfig.tailwindcss.setup { - capabilities = capabilities; - on_attach = default_on_attach; - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else ''{"${cfg.lsp.package}/bin/tailwindcss-language-server", "--stdio"}'' - } - } + 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 + 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 util = require 'lspconfig.util' + 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 ''; }; }; @@ -37,25 +153,22 @@ in { lsp = { enable = mkEnableOption "Tailwindcss LSP support" // {default = config.vim.lsp.enable;}; - server = mkOption { + servers = mkOption { description = "Tailwindcss LSP server to use"; - type = enum (attrNames servers); - default = defaultServer; - }; - - package = mkOption { - description = "Tailwindcss LSP server package, or the command to run as a list of strings"; - example = ''[lib.getExe pkgs.jdt-language-server " - data " " ~/.cache/jdtls/workspace "]''; - type = either package (listOf str); - default = servers.${cfg.lsp.server}.package; + type = listOf (enum (attrNames servers)); + default = defaultServers; }; }; }; config = mkIf cfg.enable (mkMerge [ (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.tailwindcss-lsp = servers.${cfg.lsp.server}.lspConfig; + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; }) ]); } From 76af21eb41dd0ae5c5d8af31cf6af42eeca1f7e8 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Fri, 11 Jul 2025 14:08:31 +0100 Subject: [PATCH 053/109] convert terraform module --- modules/plugins/languages/terraform.nix | 37 ++++++++++++++++--------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/modules/plugins/languages/terraform.nix b/modules/plugins/languages/terraform.nix index 095da072..4e13ecf0 100644 --- a/modules/plugins/languages/terraform.nix +++ b/modules/plugins/languages/terraform.nix @@ -4,12 +4,25 @@ lib, ... }: let + inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) package; + inherit (lib.meta) getExe; + inherit (lib.types) enum listOf; inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.terraform; + + defaultServers = ["terraformls"]; + servers = { + terraformls = { + enable = true; + cmd = [(getExe pkgs.terraform-ls) "serve"]; + filetypes = ["terraform" "terraform-vars"]; + root_markers = [".terraform" ".git"]; + }; + }; in { options.vim.languages.terraform = { enable = mkEnableOption "Terraform/HCL support"; @@ -22,10 +35,10 @@ in { lsp = { enable = mkEnableOption "Terraform LSP support (terraform-ls)" // {default = config.vim.lsp.enable;}; - package = mkOption { - description = "terraform-ls package"; - type = package; - default = pkgs.terraform-ls; + servers = mkOption { + description = "Terraform LSP server to use"; + type = listOf (enum (attrNames servers)); + default = defaultServers; }; }; }; @@ -36,14 +49,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.terraform-ls = '' - lspconfig.terraformls.setup { - capabilities = capabilities, - on_attach=default_on_attach, - cmd = {"${cfg.lsp.package}/bin/terraform-ls", "serve"}, - } - ''; + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; }) ]); } From eb60648df2a15918102fba151b2947e277091c0d Mon Sep 17 00:00:00 2001 From: sjcobb Date: Fri, 11 Jul 2025 14:11:00 +0100 Subject: [PATCH 054/109] remove accidental silly duplication --- modules/plugins/languages/ruby.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/plugins/languages/ruby.nix b/modules/plugins/languages/ruby.nix index 46892df6..6b2e63da 100644 --- a/modules/plugins/languages/ruby.nix +++ b/modules/plugins/languages/ruby.nix @@ -77,7 +77,7 @@ in { enable = mkEnableOption "Ruby LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - type = listOf (enum (attrNames servers)); default = defaultServers; + type = listOf (enum (attrNames servers)); default = defaultServers; description = "Ruby LSP server to use"; }; From 510fae6730a73816b631ee10ff82515719ad838d Mon Sep 17 00:00:00 2001 From: sjcobb Date: Fri, 11 Jul 2025 14:11:40 +0100 Subject: [PATCH 055/109] convert typst module --- modules/plugins/languages/typst.nix | 126 +++++++++++++++++----------- 1 file changed, 79 insertions(+), 47 deletions(-) diff --git a/modules/plugins/languages/typst.nix b/modules/plugins/languages/typst.nix index 08a2252b..720b3f7a 100644 --- a/modules/plugins/languages/typst.nix +++ b/modules/plugins/languages/typst.nix @@ -6,52 +6,87 @@ }: let inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; - inherit (lib.lists) isList; - inherit (lib.types) nullOr enum either attrsOf listOf package str; + inherit (lib.types) nullOr enum attrsOf listOf package str; inherit (lib.attrsets) attrNames; inherit (lib.meta) getExe; - inherit (lib.nvim.lua) expToLua toLuaObject; inherit (lib.nvim.types) mkGrammarOption mkPluginSetupOption; inherit (lib.nvim.dag) entryAnywhere; + inherit (lib.nvim.lua) toLuaObject; + inherit (lib.nvim.attrsets) mapListToAttrs; + inherit (lib.generators) mkLuaInline; cfg = config.vim.languages.typst; - defaultServer = "tinymist"; + defaultServers = ["tinymist"]; servers = { - typst-lsp = { - package = pkgs.typst-lsp; - lspConfig = '' - lspconfig.typst_lsp.setup { - capabilities = capabilities, - on_attach = 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, - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else ''{"${cfg.lsp.package}/bin/typst-lsp"}'' - }, - } + 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 = { - package = pkgs.tinymist; - lspConfig = '' - lspconfig.tinymist.setup { - capabilities = capabilities, - single_file_support = true, - on_attach = 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, - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else ''{"${cfg.lsp.package}/bin/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 ''; }; }; @@ -78,17 +113,10 @@ in { lsp = { enable = mkEnableOption "Typst LSP support (typst-lsp)" // {default = config.vim.lsp.enable;}; - server = mkOption { + servers = mkOption { description = "Typst LSP server to use"; - type = enum (attrNames servers); - default = defaultServer; - }; - - package = mkOption { - description = "typst-lsp package, or the command to run as a list of strings"; - example = ''[lib.getExe pkgs.jdt-language-server "-data" "~/.cache/jdtls/workspace"]''; - type = either package (listOf str); - default = servers.${cfg.lsp.server}.package; + type = listOf (enum (attrNames servers)); + default = defaultServers; }; }; @@ -131,7 +159,7 @@ in { dependencies_bin = mkOption { type = attrsOf str; default = { - "tinymist" = getExe servers.tinymist.package; + "tinymist" = getExe pkgs.tinymist; "websocat" = getExe pkgs.websocat; }; @@ -169,8 +197,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.typst-lsp = servers.${cfg.lsp.server}.lspConfig; + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; }) # Extensions From ea2094b89d0004224e13e739e214b4e7a356ebdf Mon Sep 17 00:00:00 2001 From: sjcobb Date: Fri, 11 Jul 2025 14:14:03 +0100 Subject: [PATCH 056/109] convert vala module --- modules/plugins/languages/vala.nix | 73 ++++++++++++++++++------------ 1 file changed, 45 insertions(+), 28 deletions(-) diff --git a/modules/plugins/languages/vala.nix b/modules/plugins/languages/vala.nix index 220926d0..2c4f09d1 100644 --- a/modules/plugins/languages/vala.nix +++ b/modules/plugins/languages/vala.nix @@ -7,17 +7,19 @@ inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; - inherit (lib.lists) isList; - inherit (lib.types) enum either listOf package str; + inherit (lib.meta) getExe; + inherit (lib.types) enum listOf; inherit (lib.nvim.types) mkGrammarOption; - inherit (lib.nvim.lua) expToLua; + inherit (lib.nvim.attrsets) mapListToAttrs; + inherit (lib.generators) mkLuaInline; cfg = config.vim.languages.vala; - defaultServer = "vala_ls"; + defaultServers = ["vala_ls"]; servers = { vala_ls = { - package = pkgs.symlinkJoin { + enable = true; + cmd = [(getExe (pkgs.symlinkJoin { name = "vala-language-server-wrapper"; paths = [pkgs.vala-language-server]; buildInputs = [pkgs.makeBinaryWrapper]; @@ -25,18 +27,35 @@ wrapProgram $out/bin/vala-language-server \ --prefix PATH : ${pkgs.uncrustify}/bin ''; - }; - internalFormatter = true; - lspConfig = '' - lspconfig.vala_ls.setup { - capabilities = capabilities; - on_attach = default_on_attach; - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else ''{"${cfg.lsp.package}/bin/vala-language-server"}'' - }, - } + }))]; + 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 ''; }; }; @@ -51,16 +70,10 @@ in { lsp = { enable = mkEnableOption "Vala LSP support" // {default = config.vim.lsp.enable;}; - server = mkOption { + servers = mkOption { description = "Vala LSP server to use"; - type = enum (attrNames servers); - default = defaultServer; - }; - - package = mkOption { - description = "Vala LSP server package, or the command to run as a list of strings"; - type = either package (listOf str); - default = servers.${cfg.lsp.server}.package; + type = listOf (enum (attrNames servers)); + default = defaultServers; }; }; }; @@ -72,8 +85,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.vala_ls = servers.${cfg.lsp.server}.lspConfig; + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; }) ]); } From 51365741b038173eeff088f05dc5425af8dde573 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Fri, 11 Jul 2025 14:15:40 +0100 Subject: [PATCH 057/109] fmt --- modules/plugins/languages/vala.nix | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/modules/plugins/languages/vala.nix b/modules/plugins/languages/vala.nix index 2c4f09d1..5bc91def 100644 --- a/modules/plugins/languages/vala.nix +++ b/modules/plugins/languages/vala.nix @@ -19,15 +19,17 @@ servers = { vala_ls = { enable = true; - cmd = [(getExe (pkgs.symlinkJoin { - name = "vala-language-server-wrapper"; - paths = [pkgs.vala-language-server]; - buildInputs = [pkgs.makeBinaryWrapper]; - postBuild = '' - wrapProgram $out/bin/vala-language-server \ - --prefix PATH : ${pkgs.uncrustify}/bin - ''; - }))]; + cmd = [ + (getExe (pkgs.symlinkJoin { + name = "vala-language-server-wrapper"; + paths = [pkgs.vala-language-server]; + 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) From d2f41e2918878ff67db538af1218c8ce683ed45f Mon Sep 17 00:00:00 2001 From: sjcobb Date: Fri, 11 Jul 2025 14:15:51 +0100 Subject: [PATCH 058/109] convert wgsl module --- modules/plugins/languages/wgsl.nix | 55 +++++++++++------------------- 1 file changed, 20 insertions(+), 35 deletions(-) diff --git a/modules/plugins/languages/wgsl.nix b/modules/plugins/languages/wgsl.nix index f374543e..3b278a27 100644 --- a/modules/plugins/languages/wgsl.nix +++ b/modules/plugins/languages/wgsl.nix @@ -5,31 +5,23 @@ ... }: let inherit (builtins) attrNames; - inherit (lib.lists) isList; inherit (lib.modules) mkIf mkMerge; - inherit (lib.nvim.lua) expToLua; inherit (lib.nvim.types) mkGrammarOption; - inherit (lib.options) literalExpression mkEnableOption mkOption; - inherit (lib.types) either enum listOf package str; + inherit (lib.options) mkEnableOption mkOption; + inherit (lib.types) enum listOf; + inherit (lib.meta) getExe; + inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.wgsl; - defaultServer = "wgsl-analyzer"; + defaultServers = ["wgsl_analyzer"]; servers = { - wgsl-analyzer = { - package = pkgs.wgsl-analyzer; - internalFormatter = true; - lspConfig = '' - lspconfig.wgsl_analyzer.setup { - capabilities = capabilities, - on_attach = default_on_attach, - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else "{'${cfg.lsp.package}/bin/wgsl_analyzer'}" - } - } - ''; + wgsl_analyzer = { + enable = true; + cmd = [(getExe pkgs.wgsl-analyzer)]; + filetypes = ["wgsl"]; + root_markers = [".git"]; + settings = {}; }; }; in { @@ -44,18 +36,11 @@ in { lsp = { enable = mkEnableOption "WGSL LSP support" // {default = config.vim.lsp.enable;}; - server = mkOption { - type = enum (attrNames servers); - default = defaultServer; + servers = mkOption { + type = listOf (enum (attrNames servers)); + default = defaultServers; description = "WGSL LSP server to use"; }; - - package = mkOption { - description = "wgsl-analyzer package, or the command to run as a list of strings"; - example = literalExpression "[(lib.getExe pkgs.wgsl-analyzer)]"; - type = either package (listOf str); - default = pkgs.wgsl-analyzer; - }; }; }; @@ -68,12 +53,12 @@ in { }) (mkIf cfg.lsp.enable { - vim = { - lsp.lspconfig = { - enable = true; - sources.wgsl_analyzer = servers.${cfg.lsp.server}.lspConfig; - }; - }; + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; }) ]); } From 6292ff438c067dfc140b78d3e89b66a65271a449 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Fri, 11 Jul 2025 14:17:23 +0100 Subject: [PATCH 059/109] convert zig module --- modules/plugins/languages/zig.nix | 48 ++++++++++++------------------- 1 file changed, 18 insertions(+), 30 deletions(-) diff --git a/modules/plugins/languages/zig.nix b/modules/plugins/languages/zig.nix index 89307eab..db38cc51 100644 --- a/modules/plugins/languages/zig.nix +++ b/modules/plugins/languages/zig.nix @@ -7,29 +7,21 @@ inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge mkDefault; - inherit (lib.lists) isList; - inherit (lib.types) bool either listOf package str enum; - inherit (lib.nvim.lua) expToLua; + inherit (lib.types) bool listOf package enum; inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.meta) getExe; + inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.zig; - defaultServer = "zls"; + defaultServers = ["zls"]; servers = { zls = { - package = pkgs.zls; - internalFormatter = true; - lspConfig = '' - lspconfig.zls.setup { - capabilities = capabilities, - on_attach = default_on_attach, - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else "{'${cfg.lsp.package}/bin/zls'}" - } - } - ''; + enable = true; + cmd = [(getExe pkgs.zls)]; + filetypes = ["zig" "zir"]; + root_markers = ["zls.json" "build.zig" ".git"]; + workspace_required = false; }; }; @@ -74,17 +66,11 @@ in { lsp = { enable = mkEnableOption "Zig LSP support" // {default = config.vim.lsp.enable;}; - server = mkOption { - type = enum (attrNames servers); - default = defaultServer; + servers = mkOption { + type = listOf (enum (attrNames servers)); + default = defaultServers; description = "Zig LSP server to use"; }; - - package = mkOption { - description = "ZLS package, or the command to run as a list of strings"; - type = either package (listOf str); - default = pkgs.zls; - }; }; dap = { @@ -118,10 +104,12 @@ in { (mkIf cfg.lsp.enable { vim = { - lsp.lspconfig = { - enable = true; - sources.zig-lsp = servers.${cfg.lsp.server}.lspConfig; - }; + lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; # nvf handles autosaving already globals.zig_fmt_autosave = mkDefault 0; From a42d6ac69aeee101f12b99a2486e386a0fa8bd2a Mon Sep 17 00:00:00 2001 From: sjcobb Date: Mon, 14 Jul 2025 01:05:49 +0100 Subject: [PATCH 060/109] remove accidentally enabled langauges --- configuration.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configuration.nix b/configuration.nix index 9a297e1e..fba4734e 100644 --- a/configuration.nix +++ b/configuration.nix @@ -82,8 +82,8 @@ isMaximal: { dart.enable = false; ocaml.enable = false; elixir.enable = false; - haskell.enable = true; - hcl.enable = true; + haskell.enable = false; + hcl.enable = false; ruby.enable = false; fsharp.enable = false; From e0cd56f39e218546d8258bd838754e06df64d792 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Mon, 14 Jul 2025 01:15:39 +0100 Subject: [PATCH 061/109] ordering of types --- modules/plugins/languages/asm.nix | 2 +- modules/plugins/languages/astro.nix | 6 +++--- modules/plugins/languages/bash.nix | 8 ++++---- modules/plugins/languages/clojure.nix | 2 +- modules/plugins/languages/dart.nix | 2 +- modules/plugins/languages/elixir.nix | 6 +++--- modules/plugins/languages/gleam.nix | 2 +- modules/plugins/languages/haskell.nix | 4 ++-- modules/plugins/languages/hcl.nix | 2 +- modules/plugins/languages/helm.nix | 2 +- modules/plugins/languages/java.nix | 2 +- modules/plugins/languages/julia.nix | 4 ++-- modules/plugins/languages/kotlin.nix | 2 +- modules/plugins/languages/lua.nix | 2 +- modules/plugins/languages/nim.nix | 6 +++--- modules/plugins/languages/nix.nix | 2 +- modules/plugins/languages/nu.nix | 2 +- modules/plugins/languages/ocaml.nix | 6 +++--- modules/plugins/languages/odin.nix | 2 +- modules/plugins/languages/php.nix | 2 +- modules/plugins/languages/python.nix | 10 +++++----- modules/plugins/languages/r.nix | 2 +- modules/plugins/languages/sql.nix | 10 +++++----- modules/plugins/languages/svelte.nix | 6 +++--- modules/plugins/languages/tailwind.nix | 2 +- modules/plugins/languages/terraform.nix | 2 +- modules/plugins/languages/typst.nix | 6 +++--- modules/plugins/languages/vala.nix | 2 +- modules/plugins/languages/yaml.nix | 2 +- 29 files changed, 54 insertions(+), 54 deletions(-) diff --git a/modules/plugins/languages/asm.nix b/modules/plugins/languages/asm.nix index 2a5a2843..c0887d77 100644 --- a/modules/plugins/languages/asm.nix +++ b/modules/plugins/languages/asm.nix @@ -34,9 +34,9 @@ in { lsp = { enable = mkEnableOption "Assembly LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - description = "Assembly LSP server to use"; type = listOf (enum (attrNames servers)); default = defaultServers; + description = "Assembly LSP server to use"; }; }; }; diff --git a/modules/plugins/languages/astro.nix b/modules/plugins/languages/astro.nix index f2c8517a..35de328b 100644 --- a/modules/plugins/languages/astro.nix +++ b/modules/plugins/languages/astro.nix @@ -91,9 +91,9 @@ in { lsp = { enable = mkEnableOption "Astro LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - description = "Astro LSP server to use"; type = listOf (enum (attrNames servers)); default = defaultServers; + description = "Astro LSP server to use"; }; }; @@ -101,15 +101,15 @@ in { enable = mkEnableOption "Astro formatting" // {default = config.vim.languages.enableFormat;}; type = mkOption { - description = "Astro formatter to use"; type = enum (attrNames formats); default = defaultFormat; + description = "Astro formatter to use"; }; package = mkOption { - description = "Astro formatter package"; type = package; default = formats.${cfg.format.type}.package; + description = "Astro formatter package"; }; }; diff --git a/modules/plugins/languages/bash.nix b/modules/plugins/languages/bash.nix index e0e28bd7..e34edccb 100644 --- a/modules/plugins/languages/bash.nix +++ b/modules/plugins/languages/bash.nix @@ -57,28 +57,28 @@ in { lsp = { enable = mkEnableOption "Bash LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - description = "Bash LSP server to use"; type = listOf (enum (attrNames servers)); default = defaultServers; + description = "Bash LSP server to use"; }; }; format = { enable = mkOption { - description = "Enable Bash formatting"; type = bool; default = config.vim.languages.enableFormat; + description = "Enable Bash formatting"; }; type = mkOption { - description = "Bash formatter to use"; type = enum (attrNames formats); default = defaultFormat; + description = "Bash formatter to use"; }; package = mkOption { - description = "Bash formatter package"; type = package; default = formats.${cfg.format.type}.package; + description = "Bash formatter package"; }; }; diff --git a/modules/plugins/languages/clojure.nix b/modules/plugins/languages/clojure.nix index 31062ba7..442df2b7 100644 --- a/modules/plugins/languages/clojure.nix +++ b/modules/plugins/languages/clojure.nix @@ -37,9 +37,9 @@ in { lsp = { enable = mkEnableOption "Clojure LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - description = "Clojure LSP server to use"; type = listOf (enum (attrNames servers)); default = defaultServers; + description = "Clojure LSP server to use"; }; }; }; diff --git a/modules/plugins/languages/dart.nix b/modules/plugins/languages/dart.nix index 61f52abb..de267e7c 100644 --- a/modules/plugins/languages/dart.nix +++ b/modules/plugins/languages/dart.nix @@ -54,9 +54,9 @@ in { lsp = { enable = mkEnableOption "Dart LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - description = "Dart LSP server to use"; type = listOf (enum (attrNames servers)); default = defaultServers; + description = "Dart LSP server to use"; }; }; diff --git a/modules/plugins/languages/elixir.nix b/modules/plugins/languages/elixir.nix index 2164b469..5204c96b 100644 --- a/modules/plugins/languages/elixir.nix +++ b/modules/plugins/languages/elixir.nix @@ -63,9 +63,9 @@ in { lsp = { enable = mkEnableOption "Elixir LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - description = "Elixir LSP server to use"; type = listOf (enum (attrNames servers)); default = defaultServers; + description = "Elixir LSP server to use"; }; }; @@ -73,15 +73,15 @@ in { enable = mkEnableOption "Elixir formatting" // {default = config.vim.languages.enableFormat;}; type = mkOption { - description = "Elixir formatter to use"; type = enum (attrNames formats); default = defaultFormat; + description = "Elixir formatter to use"; }; package = mkOption { - description = "Elixir formatter package"; type = package; default = formats.${cfg.format.type}.package; + description = "Elixir formatter package"; }; }; diff --git a/modules/plugins/languages/gleam.nix b/modules/plugins/languages/gleam.nix index 5f4e4b4f..26a001eb 100644 --- a/modules/plugins/languages/gleam.nix +++ b/modules/plugins/languages/gleam.nix @@ -37,9 +37,9 @@ in { lsp = { enable = mkEnableOption "Gleam LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - description = "Gleam LSP server to use"; type = listOf (enum (attrNames servers)); default = defaultServers; + description = "Gleam LSP server to use"; }; }; }; diff --git a/modules/plugins/languages/haskell.nix b/modules/plugins/languages/haskell.nix index 0fd39b5e..476c2979 100644 --- a/modules/plugins/languages/haskell.nix +++ b/modules/plugins/languages/haskell.nix @@ -77,18 +77,18 @@ in { lsp = { enable = mkEnableOption "Haskell LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - description = "Haskell LSP server to use"; type = listOf (enum (attrNames servers)); default = defaultServers; + description = "Haskell LSP server to use"; }; }; dap = { enable = mkEnableOption "DAP support for Haskell" // {default = config.vim.languages.enableDAP;}; package = mkOption { - description = "Haskell DAP package or command to run the Haskell DAP"; default = haskellPackages.haskell-debug-adapter; type = either package (listOf str); + description = "Haskell DAP package or command to run the Haskell DAP"; }; }; }; diff --git a/modules/plugins/languages/hcl.nix b/modules/plugins/languages/hcl.nix index a98498ee..ca00f600 100644 --- a/modules/plugins/languages/hcl.nix +++ b/modules/plugins/languages/hcl.nix @@ -42,9 +42,9 @@ in { lsp = { enable = mkEnableOption "HCL LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - description = "HCL LSP server to use"; type = listOf (enum (attrNames servers)); default = defaultServers; + description = "HCL LSP server to use"; }; }; diff --git a/modules/plugins/languages/helm.nix b/modules/plugins/languages/helm.nix index a339a3a0..f5fe7b64 100644 --- a/modules/plugins/languages/helm.nix +++ b/modules/plugins/languages/helm.nix @@ -49,9 +49,9 @@ in { lsp = { enable = mkEnableOption "Helm LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - description = "Helm LSP server to use"; type = listOf (enum (attrNames servers)); default = defaultServers; + description = "Helm LSP server to use"; }; }; }; diff --git a/modules/plugins/languages/java.nix b/modules/plugins/languages/java.nix index 4428b7cc..82fae184 100644 --- a/modules/plugins/languages/java.nix +++ b/modules/plugins/languages/java.nix @@ -72,9 +72,9 @@ in { lsp = { enable = mkEnableOption "Java LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - description = "Java LSP server to use"; type = listOf (enum (attrNames servers)); default = defaultServers; + description = "Java LSP server to use"; }; }; }; diff --git a/modules/plugins/languages/julia.nix b/modules/plugins/languages/julia.nix index 16c3164f..d5310613 100644 --- a/modules/plugins/languages/julia.nix +++ b/modules/plugins/languages/julia.nix @@ -97,6 +97,8 @@ in { lsp = { enable = mkEnableOption "Java LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { + type = listOf (enum (attrNames servers)); + default = defaultServers; description = '' Julia LSP Server to Use @@ -110,8 +112,6 @@ in { Julia in your devshells. ::: ''; - type = listOf (enum (attrNames servers)); - default = defaultServers; }; }; }; diff --git a/modules/plugins/languages/kotlin.nix b/modules/plugins/languages/kotlin.nix index 27875336..f316c4cb 100644 --- a/modules/plugins/languages/kotlin.nix +++ b/modules/plugins/languages/kotlin.nix @@ -63,9 +63,9 @@ in { lsp = { enable = mkEnableOption "Kotlin LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - description = "Kotlin LSP server to use"; type = listOf (enum (attrNames servers)); default = defaultServers; + description = "Kotlin LSP server to use"; }; }; diff --git a/modules/plugins/languages/lua.nix b/modules/plugins/languages/lua.nix index 6bc9941e..e454eaa8 100644 --- a/modules/plugins/languages/lua.nix +++ b/modules/plugins/languages/lua.nix @@ -64,9 +64,9 @@ in { lsp = { enable = mkEnableOption "Lua LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - description = "Lua LSP server to use"; type = listOf (enum (attrNames servers)); default = defaultServers; + description = "Lua LSP server to use"; }; lazydev.enable = mkEnableOption "lazydev.nvim integration, useful for neovim plugin developers"; diff --git a/modules/plugins/languages/nim.nix b/modules/plugins/languages/nim.nix index 571f0761..289c9691 100644 --- a/modules/plugins/languages/nim.nix +++ b/modules/plugins/languages/nim.nix @@ -59,24 +59,24 @@ in { enable = mkEnableOption "Nim LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - description = "Nim LSP server to use"; type = listOf (enum (attrNames servers)); default = defaultServers; + description = "Nim LSP server to use"; }; }; format = { enable = mkEnableOption "Nim formatting" // {default = config.vim.languages.enableFormat;}; type = mkOption { - description = "Nim formatter to use"; type = enum (attrNames formats); default = defaultFormat; + description = "Nim formatter to use"; }; package = mkOption { - description = "Nim formatter package"; type = package; default = formats.${cfg.format.type}.package; + description = "Nim formatter package"; }; }; }; diff --git a/modules/plugins/languages/nix.nix b/modules/plugins/languages/nix.nix index 8b3d1e0b..c460ca50 100644 --- a/modules/plugins/languages/nix.nix +++ b/modules/plugins/languages/nix.nix @@ -98,9 +98,9 @@ in { lsp = { enable = mkEnableOption "Nix LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - description = "Nix LSP server to use"; type = listOf (enum (attrNames servers)); default = defaultServers; + description = "Nix LSP server to use"; }; }; diff --git a/modules/plugins/languages/nu.nix b/modules/plugins/languages/nu.nix index 21acccb3..55711104 100644 --- a/modules/plugins/languages/nu.nix +++ b/modules/plugins/languages/nu.nix @@ -46,9 +46,9 @@ in { enable = mkEnableOption "Nu LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - description = "Nu LSP server to use"; type = listOf (enum (attrNames servers)); default = defaultServers; + description = "Nu LSP server to use"; }; }; }; diff --git a/modules/plugins/languages/ocaml.nix b/modules/plugins/languages/ocaml.nix index f0976048..a8f964e9 100644 --- a/modules/plugins/languages/ocaml.nix +++ b/modules/plugins/languages/ocaml.nix @@ -74,23 +74,23 @@ in { enable = mkEnableOption "OCaml LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - description = "OCaml LSP server to use"; type = listOf (enum (attrNames servers)); default = defaultServers; + description = "OCaml LSP server to use"; }; }; format = { enable = mkEnableOption "OCaml formatting support (ocamlformat)" // {default = config.vim.languages.enableFormat;}; type = mkOption { - description = "OCaml formatter to use"; type = enum (attrNames formats); default = defaultFormat; + description = "OCaml formatter to use"; }; package = mkOption { - description = "OCaml formatter package"; type = package; default = formats.${cfg.format.type}.package; + description = "OCaml formatter package"; }; }; }; diff --git a/modules/plugins/languages/odin.nix b/modules/plugins/languages/odin.nix index 9b82bcb8..1b1bd751 100644 --- a/modules/plugins/languages/odin.nix +++ b/modules/plugins/languages/odin.nix @@ -46,9 +46,9 @@ in { enable = mkEnableOption "Odin LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - description = "Odin LSP server to use"; type = listOf (enum (attrNames servers)); default = defaultServers; + description = "Odin LSP server to use"; }; }; }; diff --git a/modules/plugins/languages/php.nix b/modules/plugins/languages/php.nix index 0818a5eb..9eaae168 100644 --- a/modules/plugins/languages/php.nix +++ b/modules/plugins/languages/php.nix @@ -77,9 +77,9 @@ in { enable = mkEnableOption "PHP LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - description = "PHP LSP server to use"; type = listOf (enum (attrNames servers)); default = defaultServers; + description = "PHP LSP server to use"; }; }; }; diff --git a/modules/plugins/languages/python.nix b/modules/plugins/languages/python.nix index 1fc26e40..aba4cd7e 100644 --- a/modules/plugins/languages/python.nix +++ b/modules/plugins/languages/python.nix @@ -229,9 +229,9 @@ in { enable = mkEnableOption "Python LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - description = "Python LSP server to use"; type = listOf (enum (attrNames servers)); default = defaultServers; + description = "Python LSP server to use"; }; }; @@ -239,30 +239,30 @@ in { enable = mkEnableOption "Python formatting" // {default = config.vim.languages.enableFormat;}; type = mkOption { - description = "Python formatter to use"; type = enum (attrNames formats); default = defaultFormat; + description = "Python formatter to use"; }; package = mkOption { - description = "Python formatter package"; type = package; default = formats.${cfg.format.type}.package; + description = "Python formatter package"; }; }; # TODO this implementation is very bare bones, I don't know enough python to implement everything dap = { enable = mkOption { - description = "Enable Python Debug Adapter"; type = bool; default = config.vim.languages.enableDAP; + description = "Enable Python Debug Adapter"; }; debugger = mkOption { - description = "Python debugger to use"; type = enum (attrNames debuggers); default = defaultDebugger; + description = "Python debugger to use"; }; package = mkOption { diff --git a/modules/plugins/languages/r.nix b/modules/plugins/languages/r.nix index 7f5ffc95..9f28900a 100644 --- a/modules/plugins/languages/r.nix +++ b/modules/plugins/languages/r.nix @@ -77,9 +77,9 @@ in { enable = mkEnableOption "R LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - description = "R LSP server to use"; type = listOf (enum (attrNames servers)); default = defaultServers; + description = "R LSP server to use"; }; }; diff --git a/modules/plugins/languages/sql.nix b/modules/plugins/languages/sql.nix index bbe7ffc2..7321dcf5 100644 --- a/modules/plugins/languages/sql.nix +++ b/modules/plugins/languages/sql.nix @@ -59,18 +59,18 @@ in { enable = mkEnableOption "SQL language support"; dialect = mkOption { - description = "SQL dialect for sqlfluff (if used)"; type = str; default = "ansi"; + description = "SQL dialect for sqlfluff (if used)"; }; treesitter = { enable = mkEnableOption "SQL treesitter" // {default = config.vim.languages.enableTreesitter;}; package = mkOption { - description = "SQL treesitter grammar to use"; type = package; default = pkgs.vimPlugins.nvim-treesitter.builtGrammars.sql; + description = "SQL treesitter grammar to use"; }; }; @@ -78,9 +78,9 @@ in { enable = mkEnableOption "SQL LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - description = "SQL LSP server to use"; type = listOf (enum (attrNames servers)); default = defaultServers; + description = "SQL LSP server to use"; }; }; @@ -88,15 +88,15 @@ in { enable = mkEnableOption "SQL formatting" // {default = config.vim.languages.enableFormat;}; type = mkOption { - description = "SQL formatter to use"; type = enum (attrNames formats); default = defaultFormat; + description = "SQL formatter to use"; }; package = mkOption { - description = "SQL formatter package"; type = package; default = formats.${cfg.format.type}.package; + description = "SQL formatter package"; }; }; diff --git a/modules/plugins/languages/svelte.nix b/modules/plugins/languages/svelte.nix index dd0bbc21..a876f65d 100644 --- a/modules/plugins/languages/svelte.nix +++ b/modules/plugins/languages/svelte.nix @@ -90,9 +90,9 @@ in { enable = mkEnableOption "Svelte LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - description = "Svelte LSP server to use"; type = listOf (enum (attrNames servers)); default = defaultServers; + description = "Svelte LSP server to use"; }; }; @@ -100,15 +100,15 @@ in { enable = mkEnableOption "Svelte formatting" // {default = config.vim.languages.enableFormat;}; type = mkOption { - description = "Svelte formatter to use"; type = enum (attrNames formats); default = defaultFormat; + description = "Svelte formatter to use"; }; package = mkOption { - description = "Svelte formatter package"; type = package; default = formats.${cfg.format.type}.package; + description = "Svelte formatter package"; }; }; diff --git a/modules/plugins/languages/tailwind.nix b/modules/plugins/languages/tailwind.nix index be895387..601f0f88 100644 --- a/modules/plugins/languages/tailwind.nix +++ b/modules/plugins/languages/tailwind.nix @@ -154,9 +154,9 @@ in { enable = mkEnableOption "Tailwindcss LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - description = "Tailwindcss LSP server to use"; type = listOf (enum (attrNames servers)); default = defaultServers; + description = "Tailwindcss LSP server to use"; }; }; }; diff --git a/modules/plugins/languages/terraform.nix b/modules/plugins/languages/terraform.nix index 4e13ecf0..5f3952df 100644 --- a/modules/plugins/languages/terraform.nix +++ b/modules/plugins/languages/terraform.nix @@ -36,9 +36,9 @@ in { enable = mkEnableOption "Terraform LSP support (terraform-ls)" // {default = config.vim.lsp.enable;}; servers = mkOption { - description = "Terraform LSP server to use"; type = listOf (enum (attrNames servers)); default = defaultServers; + description = "Terraform LSP server to use"; }; }; }; diff --git a/modules/plugins/languages/typst.nix b/modules/plugins/languages/typst.nix index 720b3f7a..2bc4af42 100644 --- a/modules/plugins/languages/typst.nix +++ b/modules/plugins/languages/typst.nix @@ -114,9 +114,9 @@ in { enable = mkEnableOption "Typst LSP support (typst-lsp)" // {default = config.vim.lsp.enable;}; servers = mkOption { - description = "Typst LSP server to use"; type = listOf (enum (attrNames servers)); default = defaultServers; + description = "Typst LSP server to use"; }; }; @@ -124,15 +124,15 @@ in { enable = mkEnableOption "Typst document formatting" // {default = config.vim.languages.enableFormat;}; type = mkOption { - description = "Typst formatter to use"; type = enum (attrNames formats); default = defaultFormat; + description = "Typst formatter to use"; }; package = mkOption { - description = "Typst formatter package"; type = package; default = formats.${cfg.format.type}.package; + description = "Typst formatter package"; }; }; diff --git a/modules/plugins/languages/vala.nix b/modules/plugins/languages/vala.nix index 5bc91def..85058e32 100644 --- a/modules/plugins/languages/vala.nix +++ b/modules/plugins/languages/vala.nix @@ -73,9 +73,9 @@ in { lsp = { enable = mkEnableOption "Vala LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - description = "Vala LSP server to use"; type = listOf (enum (attrNames servers)); default = defaultServers; + description = "Vala LSP server to use"; }; }; }; diff --git a/modules/plugins/languages/yaml.nix b/modules/plugins/languages/yaml.nix index 2dc969c5..de503e9c 100644 --- a/modules/plugins/languages/yaml.nix +++ b/modules/plugins/languages/yaml.nix @@ -56,9 +56,9 @@ in { lsp = { enable = mkEnableOption "Yaml LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - description = "Yaml LSP server to use"; type = listOf (enum (attrNames servers)); default = defaultServers; + description = "Yaml LSP server to use"; }; }; }; From 7400d6fd48ad57b780f7936dd2ab31f158ecad4a Mon Sep 17 00:00:00 2001 From: poz Date: Mon, 21 Jul 2025 02:19:52 +0200 Subject: [PATCH 062/109] languages/haskell: add missing comma after hls table --- modules/plugins/languages/haskell.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/plugins/languages/haskell.nix b/modules/plugins/languages/haskell.nix index 476c2979..600c7724 100644 --- a/modules/plugins/languages/haskell.nix +++ b/modules/plugins/languages/haskell.nix @@ -116,7 +116,7 @@ in { enable = true, }, }, - hls = ${toLuaObject servers.hls} + hls = ${toLuaObject servers.hls}, ''} ${optionalString cfg.dap.enable '' dap = { From 56dc23222fe296fbf21e6d1961ce0372bca8c329 Mon Sep 17 00:00:00 2001 From: poz Date: Wed, 23 Jul 2025 03:30:52 +0200 Subject: [PATCH 063/109] languages/wgsl: make server name match package and binary name --- modules/plugins/languages/wgsl.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/plugins/languages/wgsl.nix b/modules/plugins/languages/wgsl.nix index 3b278a27..0af350b5 100644 --- a/modules/plugins/languages/wgsl.nix +++ b/modules/plugins/languages/wgsl.nix @@ -14,9 +14,9 @@ cfg = config.vim.languages.wgsl; - defaultServers = ["wgsl_analyzer"]; + defaultServers = ["wgsl-analyzer"]; servers = { - wgsl_analyzer = { + wgsl-analyzer = { enable = true; cmd = [(getExe pkgs.wgsl-analyzer)]; filetypes = ["wgsl"]; From 7cabd477168d5d608ecebef93908916ea8f3dfa0 Mon Sep 17 00:00:00 2001 From: Ching Pei Yang Date: Sun, 6 Apr 2025 01:43:34 +0200 Subject: [PATCH 064/109] language/css: migrate to vim.lsp.servers --- modules/plugins/languages/css.nix | 58 ++++++++++++------------------- 1 file changed, 23 insertions(+), 35 deletions(-) diff --git a/modules/plugins/languages/css.nix b/modules/plugins/languages/css.nix index 1075bbc7..1b0376ad 100644 --- a/modules/plugins/languages/css.nix +++ b/modules/plugins/languages/css.nix @@ -8,34 +8,25 @@ inherit (lib.options) mkEnableOption mkOption; inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; - inherit (lib.lists) isList; - inherit (lib.types) enum either listOf package str; + inherit (lib.types) enum listOf package; inherit (lib.nvim.types) mkGrammarOption; - inherit (lib.nvim.lua) expToLua; + inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.css; - defaultServer = "vscode-langservers-extracted"; + defaultServer = ["cssls"]; servers = { - vscode-langservers-extracted = { - package = pkgs.vscode-langservers-extracted; - lspConfig = '' - -- enable (broadcasting) snippet capability for completion - -- see - local css_capabilities = vim.lsp.protocol.make_client_capabilities() - css_capabilities.textDocument.completion.completionItem.snippetSupport = true - - -- cssls setup - lspconfig.cssls.setup { - capabilities = css_capabilities; - on_attach = default_on_attach; - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else ''{"${cfg.lsp.package}/bin/vscode-css-language-server", "--stdio"}'' - } - } - ''; + 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; + }; }; }; @@ -82,17 +73,10 @@ in { lsp = { enable = mkEnableOption "CSS LSP support" // {default = config.vim.lsp.enable;}; - server = mkOption { - description = "CSS LSP server to use"; - type = enum (attrNames servers); + servers = mkOption { + type = singleOrListOf (enum (attrNames servers)); default = defaultServer; - }; - - package = mkOption { - description = "CSS LSP server package, or the command to run as a list of strings"; - example = ''[lib.getExe pkgs.jdt-language-server " - data " " ~/.cache/jdtls/workspace "]''; - type = either package (listOf str); - default = servers.${cfg.lsp.server}.package; + description = "CSS LSP server to use"; }; }; @@ -120,8 +104,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.css-lsp = servers.${cfg.lsp.server}.lspConfig; + vim.lsp.servers = + mapListToAttrs (name: { + inherit name; + value = servers.${name}; + }) + cfg.lsp.servers; }) (mkIf cfg.format.enable { From 4c83dd5895af6ae6426a72a7deedc30ccf3f0e41 Mon Sep 17 00:00:00 2001 From: Ching Pei Yang Date: Sun, 6 Apr 2025 01:59:33 +0200 Subject: [PATCH 065/109] language/cue: migrate to vim.lsp.servers --- modules/plugins/languages/cue.nix | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/modules/plugins/languages/cue.nix b/modules/plugins/languages/cue.nix index bd446cbf..a22ff91c 100644 --- a/modules/plugins/languages/cue.nix +++ b/modules/plugins/languages/cue.nix @@ -4,11 +4,17 @@ lib, ... }: let - inherit (lib.options) mkEnableOption mkOption; + inherit (lib.options) mkEnableOption; + inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) package; inherit (lib.nvim.types) mkGrammarOption; + lspOptions = { + cmd = [(getExe pkgs.cue) "lsp"]; + filetypes = ["cue"]; + root_markers = ["cue.mod" ".git"]; + }; + cfg = config.vim.languages.cue; in { options.vim.languages.cue = { @@ -22,12 +28,6 @@ in { lsp = { enable = mkEnableOption "CUE LSP support" // {default = config.vim.lsp.enable;}; - - package = mkOption { - type = package; - default = pkgs.cue; - description = "cue lsp implementation"; - }; }; }; @@ -38,14 +38,7 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.cue-lsp = '' - lspconfig.cue.setup { - capabilities = capabilities, - on_attach = default_on_attach, - cmd = {"${cfg.lsp.package}/bin/cue", "lsp"}, - } - ''; + vim.lsp.servers.cue = lspOptions; }) ]); } From b4f34299ceb8c247fae1d5103bf69d3d6de6e66e Mon Sep 17 00:00:00 2001 From: Ching Pei Yang Date: Sun, 6 Apr 2025 03:02:35 +0200 Subject: [PATCH 066/109] language/fsharp: migrate to vim.lsp.servers --- modules/plugins/languages/fsharp.nix | 70 +++++++++++++++++----------- 1 file changed, 43 insertions(+), 27 deletions(-) diff --git a/modules/plugins/languages/fsharp.nix b/modules/plugins/languages/fsharp.nix index 6ed0ccab..5a6f8e4e 100644 --- a/modules/plugins/languages/fsharp.nix +++ b/modules/plugins/languages/fsharp.nix @@ -6,29 +6,48 @@ }: let inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption; - inherit (lib.types) either listOf package str enum; + inherit (lib.types) listOf package enum; inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; - inherit (lib.lists) isList; + inherit (lib.generators) mkLuaInline; inherit (lib.nvim.types) mkGrammarOption; - inherit (lib.nvim.lua) expToLua; + inherit (lib.nvim.attrsets) mapListToAttrs; - defaultServer = "fsautocomplete"; + defaultServer = ["fsautocomplete"]; servers = { fsautocomplete = { - package = pkgs.fsautocomplete; - internalFormatter = false; - lspConfig = '' - lspconfig.fsautocomplete.setup { - capabilities = capabilities; - on_attach = default_on_attach; - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else "{'${cfg.lsp.package}/bin/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; + }; + }; }; }; @@ -52,18 +71,11 @@ in { lsp = { enable = mkEnableOption "F# LSP support" // {default = config.vim.lsp.enable;}; - server = mkOption { - type = enum (attrNames servers); + servers = mkOption { + type = listOf (enum (attrNames servers)); default = defaultServer; description = "F# LSP server to use"; }; - - package = mkOption { - type = either package (listOf str); - default = servers.${cfg.lsp.server}.package; - example = ''[lib.getExe pkgs.fsautocomplete "--state-directory" "~/.cache/fsautocomplete"]''; - description = "F# LSP server package, or the command to run as a list of strings"; - }; }; format = { enable = mkEnableOption "F# formatting" // {default = config.vim.languages.enableFormat;}; @@ -90,8 +102,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.fsharp-lsp = servers.${cfg.lsp.server}.lspConfig; + vim.lsp.servers = + mapListToAttrs (name: { + inherit name; + value = servers.${name}; + }) + cfg.lsp.servers; }) (mkIf cfg.format.enable { From fa3a65025d5115d328c61ddf469e8bd3c14ba017 Mon Sep 17 00:00:00 2001 From: Ching Pei Yang Date: Fri, 20 Jun 2025 12:05:28 +0200 Subject: [PATCH 067/109] language/csharp: migration to vim.lsp.servers --- modules/plugins/languages/csharp.nix | 150 ++++++++++++++++++--------- 1 file changed, 101 insertions(+), 49 deletions(-) diff --git a/modules/plugins/languages/csharp.nix b/modules/plugins/languages/csharp.nix index 49ae4985..ea09892a 100644 --- a/modules/plugins/languages/csharp.nix +++ b/modules/plugins/languages/csharp.nix @@ -5,14 +5,16 @@ options, ... }: let - inherit (builtins) attrNames; + inherit (builtins) attrNames concatMap; inherit (lib.options) mkEnableOption mkOption; - inherit (lib.types) either listOf package str enum; + inherit (lib.types) listOf enum; inherit (lib.modules) mkIf mkMerge; - inherit (lib.lists) isList; + inherit (lib.meta) getExe; + inherit (lib.generators) mkLuaInline; inherit (lib.strings) optionalString; inherit (lib.nvim.types) mkGrammarOption; - inherit (lib.nvim.lua) expToLua; + inherit (lib.nvim.lua) toLuaObject; + inherit (lib.nvim.attrsets) mapListToAttrs; lspKeyConfig = config.vim.lsp.mappings; lspKeyOptions = options.vim.lsp.mappings; @@ -25,52 +27,104 @@ # Omnisharp doesn't have colors in popup docs for some reason, and I've also # seen mentions of it being way slower, so until someone finds missing # functionality, this will be the default. - defaultServer = "csharp_ls"; + defaultServers = ["csharp_ls"]; servers = { omnisharp = { - package = pkgs.omnisharp-roslyn; - internalFormatter = true; - lspConfig = '' - lspconfig.omnisharp.setup { - capabilities = capabilities, - on_attach = function(client, bufnr) - default_on_attach(client, bufnr) - + cmd = mkLuaInline '' + { + ${toLuaObject (getExe pkgs.omnisharp-roslyn)}, + '-z', -- https://github.com/OmniSharp/omnisharp-vscode/pull/4300 + '--hostPID', + tostring(vim.fn.getpid()), + 'DotNet:enablePackageRestore=false', + '--encoding', + 'utf-8', + '--languageserver', + } + ''; + filetypes = ["cs" "vb"]; + root_markers = [".sln" ".csproj" "omnisharp.json" "function.json"]; + init_options = {}; + capabilities = { + workspace = { + workspaceFolders = false; # https://github.com/OmniSharp/omnisharp-roslyn/issues/909 + }; + }; + on_attach = mkLuaInline '' + function(client, bufnr) + default_on_attach(client, bufnr) local oe = require("omnisharp_extended") ${mkLspBinding "goToDefinition" "oe.lsp_definition"} ${mkLspBinding "goToType" "oe.lsp_type_definition"} ${mkLspBinding "listReferences" "oe.lsp_references"} ${mkLspBinding "listImplementations" "oe.lsp_implementation"} - end, - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else "{'${cfg.lsp.package}/bin/OmniSharp'}" - } - } + end ''; + settings = { + FormattingOptions = { + # Enables support for reading code style, naming convention and analyzer + # settings from .editorconfig. + EnableEditorConfigSupport = true; + # Specifies whether 'using' directives should be grouped and sorted during + # document formatting. + OrganizeImports = null; + }; + MsBuild = { + # If true, MSBuild project system will only load projects for files that + # were opened in the editor. This setting is useful for big C# codebases + # and allows for faster initialization of code navigation features only + # for projects that are relevant to code that is being edited. With this + # setting enabled OmniSharp may load fewer projects and may thus display + # incomplete reference lists for symbols. + LoadProjectsOnDemand = null; + }; + RoslynExtensionsOptions = { + # Enables support for roslyn analyzers, code fixes and rulesets. + EnableAnalyzersSupport = null; + # Enables support for showing unimported types and unimported extension + # methods in completion lists. When committed, the appropriate using + # directive will be added at the top of the current file. This option can + # have a negative impact on initial completion responsiveness; + # particularly for the first few completion sessions after opening a + # solution. + EnableImportCompletion = null; + # Only run analyzers against open files when 'enableRoslynAnalyzers' is + # true + AnalyzeOpenDocumentsOnly = null; + # Enables the possibility to see the code in external nuget dependencies + EnableDecompilationSupport = null; + }; + RenameOptions = { + RenameInComments = null; + RenameOverloads = null; + RenameInStrings = null; + }; + Sdk = { + # Specifies whether to include preview versions of the .NET SDK when + # determining which version to use for project loading. + IncludePrereleases = true; + }; + }; }; csharp_ls = { - package = pkgs.csharp-ls; - internalFormatter = true; - lspConfig = '' - local extended_handler = require("csharpls_extended").handler + cmd = [(lib.getExe pkgs.csharp-ls)]; + filetypes = ["cs"]; + root_dir = mkLuaInline '' + function(bufnr, on_dir) + local function find_root_pattern(fname, lua_pattern) + return vim.fs.root(0, function(name, path) + return name:match(lua_pattern) + end) + end - lspconfig.csharp_ls.setup { - capabilities = capabilities, - on_attach = default_on_attach, - handlers = { - ["textDocument/definition"] = extended_handler, - ["textDocument/typeDefinition"] = extended_handler - }, - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else "{'${cfg.lsp.package}/bin/csharp-ls'}" - } - } + local fname = vim.api.nvim_buf_get_name(bufnr) + on_dir(find_root_pattern(fname, "%.sln$") or find_root_pattern(fname, "%.csproj$")) + end ''; + init_options = { + AutomaticWorkspaceInit = true; + }; }; }; @@ -92,16 +146,10 @@ in { lsp = { enable = mkEnableOption "C# LSP support" // {default = config.vim.lsp.enable;}; - server = mkOption { + servers = mkOption { description = "C# LSP server to use"; - type = enum (attrNames servers); - default = defaultServer; - }; - - package = mkOption { - description = "C# LSP server package, or the command to run as a list of strings"; - type = either package (listOf str); - default = servers.${cfg.lsp.server}.package; + type = listOf (enum (attrNames servers)); + default = defaultServers; }; }; }; @@ -114,9 +162,13 @@ in { }) (mkIf cfg.lsp.enable { - vim.startPlugins = extraServerPlugins.${cfg.lsp.server} or []; - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.csharp-lsp = servers.${cfg.lsp.server}.lspConfig; + vim.startPlugins = concatMap (server: extraServerPlugins.${server}) cfg.lsp.servers; + vim.lsp.servers = + mapListToAttrs (name: { + inherit name; + value = servers.${name}; + }) + cfg.lsp.servers; }) ]); } From bf4dedb6ed4314fc2dfdab9dffa98355d087da58 Mon Sep 17 00:00:00 2001 From: Ching Pei Yang Date: Sun, 6 Apr 2025 00:39:14 +0200 Subject: [PATCH 068/109] language/clang: migrate to vim.lsp.servers --- modules/extra/deprecations.nix | 7 ++ modules/plugins/languages/clang.nix | 182 ++++++++++++++++++++-------- 2 files changed, 141 insertions(+), 48 deletions(-) diff --git a/modules/extra/deprecations.nix b/modules/extra/deprecations.nix index 0a5733ab..fe6f08a5 100644 --- a/modules/extra/deprecations.nix +++ b/modules/extra/deprecations.nix @@ -20,6 +20,10 @@ # 2025-02-07 scrollOffset = "scrolloff"; }; + + lspOptRemovalMsg = '' + `vim.languages..lsp.opts` are now moved to `vim.lsp.servers..init_options` + ''; in { imports = concatLists [ [ @@ -120,6 +124,9 @@ in { in 'vim.clipboard.registers'. Please see the documentation for the new module for more details, or open an issue if you are confused. '') + + # 2025-04-05 + (mkRemovedOptionModule ["vim" "languages" "clang" "lsp" "opts"] lspOptRemovalMsg) ] # Migrated via batchRenameOptions. Further batch renames must be below this line. diff --git a/modules/plugins/languages/clang.nix b/modules/plugins/languages/clang.nix index 2db178e9..299731f6 100644 --- a/modules/plugins/languages/clang.nix +++ b/modules/plugins/languages/clang.nix @@ -5,47 +5,143 @@ ... }: let inherit (builtins) attrNames; - inherit (lib.lists) isList; - inherit (lib.strings) optionalString; inherit (lib.options) mkEnableOption mkOption; - inherit (lib.types) bool enum package either listOf str nullOr; + inherit (lib.types) bool enum package listOf; + inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; - inherit (lib.nvim.lua) expToLua; + inherit (lib.generators) mkLuaInline; inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.attrsets) mapListToAttrs; inherit (lib.nvim.dag) entryAfter; - packageToCmd = package: defaultCmd: - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else ''{ "${cfg.lsp.package}/bin/${defaultCmd}" }''; - cfg = config.vim.languages.clang; - defaultServer = "clangd"; + defaultServers = ["clangd"]; servers = { ccls = { - package = pkgs.ccls; - lspConfig = '' - lspconfig.ccls.setup{ - capabilities = capabilities; - on_attach=default_on_attach; - cmd = ${packageToCmd cfg.lsp.package "ccls"}; - ${optionalString (cfg.lsp.opts != null) "init_options = ${cfg.lsp.opts}"} - } + 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) + default_on_attach(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 = { - package = pkgs.clang-tools; - lspConfig = '' - local clangd_cap = capabilities - -- use same offsetEncoding as null-ls - clangd_cap.offsetEncoding = {"utf-16"} - lspconfig.clangd.setup{ - capabilities = clangd_cap; - on_attach=default_on_attach; - cmd = ${packageToCmd cfg.lsp.package "clangd"}; - ${optionalString (cfg.lsp.opts != null) "init_options = ${cfg.lsp.opts}"} - } + 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) + default_on_attach(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 ''; }; }; @@ -100,23 +196,10 @@ in { lsp = { enable = mkEnableOption "clang LSP support" // {default = config.vim.lsp.enable;}; - server = mkOption { + servers = mkOption { description = "The clang LSP server to use"; - type = enum (attrNames servers); - default = defaultServer; - }; - - package = mkOption { - description = "clang LSP server package, or the command to run as a list of strings"; - example = ''[lib.getExe pkgs.jdt-language-server " - data " " ~/.cache/jdtls/workspace "]''; - type = either package (listOf str); - default = servers.${cfg.lsp.server}.package; - }; - - opts = mkOption { - description = "Options to pass to clang LSP server"; - type = nullOr str; - default = null; + type = listOf (enum (attrNames servers)); + default = defaultServers; }; }; @@ -150,9 +233,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - - vim.lsp.lspconfig.sources.clang-lsp = servers.${cfg.lsp.server}.lspConfig; + vim.lsp.servers = + mapListToAttrs (name: { + inherit name; + value = servers.${name}; + }) + cfg.lsp.servers; }) (mkIf cfg.dap.enable { From b8f546bf7caeddad065bed0987e5320733d5958d Mon Sep 17 00:00:00 2001 From: Ching Pei Yang Date: Sun, 22 Jun 2025 17:15:20 +0200 Subject: [PATCH 069/109] lib/languages: fix lsp.servers.*.cmd concatenating --- lib/languages.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/languages.nix b/lib/languages.nix index f4ab1cca..d66880a1 100644 --- a/lib/languages.nix +++ b/lib/languages.nix @@ -1,7 +1,7 @@ {lib}: let inherit (builtins) isString getAttr; inherit (lib.options) mkOption; - inherit (lib.types) listOf bool str submodule attrsOf anything either nullOr oneOf; + inherit (lib.types) listOf bool str submodule attrsOf anything either nullOr uniq; inherit (lib.nvim.attrsets) mapListToAttrs; inherit (lib.nvim.types) luaInline; in { @@ -62,7 +62,7 @@ in { }; cmd = mkOption { - type = nullOr (either luaInline (listOf str)); + type = nullOr (either luaInline (uniq (listOf str))); default = null; description = "Command used to start the LSP server"; }; From a2ce78fa90fe91ba855203cb7e30aa727c85ec31 Mon Sep 17 00:00:00 2001 From: Ching Pei Yang Date: Sat, 28 Jun 2025 15:30:24 +0200 Subject: [PATCH 070/109] language/go: migrate to vim.lsp.servers --- modules/plugins/languages/go.nix | 76 ++++++++++++++++++++------------ 1 file changed, 49 insertions(+), 27 deletions(-) diff --git a/modules/plugins/languages/go.nix b/modules/plugins/languages/go.nix index bab0ff4a..3ecc5d28 100644 --- a/modules/plugins/languages/go.nix +++ b/modules/plugins/languages/go.nix @@ -8,28 +8,53 @@ inherit (lib.options) mkEnableOption mkOption literalMD; inherit (lib.modules) mkIf mkMerge; inherit (lib.meta) getExe; - inherit (lib.lists) isList; - inherit (lib.types) bool enum either listOf package str; + inherit (lib.generators) mkLuaInline; + inherit (lib.types) bool enum package listOf; inherit (lib.nvim.types) mkGrammarOption; - inherit (lib.nvim.lua) expToLua; inherit (lib.nvim.dag) entryAfter; + inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.go; - defaultServer = "gopls"; + defaultServers = ["gopls"]; servers = { gopls = { - package = pkgs.gopls; - lspConfig = '' - lspconfig.gopls.setup { - capabilities = capabilities; - on_attach = default_on_attach; - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else ''{"${cfg.lsp.package}/bin/gopls", "serve"}'' - }, - } + cmd = [(getExe pkgs.gopls)]; + filetypes = ["go" "gomod" "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 ''; }; }; @@ -69,17 +94,10 @@ in { lsp = { enable = mkEnableOption "Go LSP support" // {default = config.vim.lsp.enable;}; - server = mkOption { + servers = mkOption { + type = singleOrListOf (enum (attrNames servers)); + default = defaultServers; description = "Go LSP server to use"; - type = enum (attrNames servers); - default = defaultServer; - }; - - package = mkOption { - description = "Go LSP server package, or the command to run as a list of strings"; - example = ''[lib.getExe pkgs.jdt-language-server " - data " " ~/.cache/jdtls/workspace "]''; - type = either package (listOf str); - default = servers.${cfg.lsp.server}.package; }; }; @@ -134,8 +152,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.go-lsp = servers.${cfg.lsp.server}.lspConfig; + vim.lsp.servers = + mapListToAttrs (name: { + inherit name; + value = servers.${name}; + }) + cfg.lsp.servers; }) (mkIf cfg.format.enable { From 76c031bbda735edb796ef019970d3cbbd25e6fdd Mon Sep 17 00:00:00 2001 From: Ching Pei Yang Date: Fri, 11 Jul 2025 18:52:56 +0200 Subject: [PATCH 071/109] language/ts: migrate to vim.lsp.servers --- modules/plugins/languages/ts.nix | 232 ++++++++++++++++++++++--------- 1 file changed, 169 insertions(+), 63 deletions(-) diff --git a/modules/plugins/languages/ts.nix b/modules/plugins/languages/ts.nix index 6064da98..9b99de07 100644 --- a/modules/plugins/languages/ts.nix +++ b/modules/plugins/languages/ts.nix @@ -4,73 +4,177 @@ lib, ... }: let - inherit (builtins) attrNames; + inherit (builtins) attrNames elem; inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; - inherit (lib.lists) isList; inherit (lib.meta) getExe; - inherit (lib.types) enum either listOf package str bool; - inherit (lib.nvim.lua) expToLua toLuaObject; + inherit (lib.types) enum listOf package bool; + inherit (lib.generators) mkLuaInline; + inherit (lib.nvim.attrsets) mapListToAttrs; + inherit (lib.nvim.lua) toLuaObject; inherit (lib.nvim.types) mkGrammarOption diagnostics mkPluginSetupOption; - inherit (lib.nvim.dag) entryAnywhere; + inherit (lib.nvim.dag) entryAnywhere entryBefore; cfg = config.vim.languages.ts; - defaultServer = "ts_ls"; - servers = { + defaultServers = ["ts_ls"]; + servers = let ts_ls = { - package = pkgs.typescript-language-server; - lspConfig = '' - lspconfig.ts_ls.setup { - capabilities = capabilities, - on_attach = function(client, bufnr) - attach_keymaps(client, bufnr); - client.server_capabilities.documentFormattingProvider = false; - end, - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else ''{"${cfg.lsp.package}/bin/typescript-language-server", "--stdio"}'' - } - } + 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) + default_on_attach(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 ''; }; - - denols = { - package = pkgs.deno; - lspConfig = '' - vim.g.markdown_fenced_languages = { "ts=typescript" } - lspconfig.denols.setup { - capabilities = capabilities; - on_attach = attach_keymaps, - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else ''{"${cfg.lsp.package}/bin/deno", "lsp"}'' - } - } - ''; - }; - + 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 = { - package = pkgs.typescript-language-server; - lspConfig = '' - lspconfig.ts_ls.setup { - capabilities = capabilities; - on_attach = attach_keymaps, - cmd = ${ - if isList cfg.lsp.package - then expToLua cfg.lsp.package - else ''{"${cfg.lsp.package}/bin/typescript-language-server", "--stdio"}'' - } - } + 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) + default_on_attach(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 ''; }; }; + 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 + ''; + # TODO: specify packages defaultFormat = "prettier"; formats = { @@ -122,17 +226,10 @@ in { lsp = { enable = mkEnableOption "Typescript/Javascript LSP support" // {default = config.vim.lsp.enable;}; - server = mkOption { + servers = mkOption { + type = singleOrListOf (enum (attrNames servers)); + default = defaultServers; description = "Typescript/Javascript LSP server to use"; - type = enum (attrNames servers); - default = defaultServer; - }; - - package = mkOption { - description = "Typescript/Javascript LSP server package, or the command to run as a list of strings"; - example = ''[lib.getExe pkgs.jdt-language-server "-data" "~/.cache/jdtls/workspace"]''; - type = either package (listOf str); - default = servers.${cfg.lsp.server}.package; }; }; @@ -190,8 +287,17 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.ts-lsp = servers.${cfg.lsp.server}.lspConfig; + 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; }) (mkIf cfg.format.enable { @@ -234,7 +340,7 @@ in { { assertions = [ { - assertion = cfg.lsp.enable -> cfg.lsp.server != "tsserver"; + 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` From 9407a3e1c6d046dc4c292b2f6ee649ecafa40d5e Mon Sep 17 00:00:00 2001 From: Ching Pei Yang Date: Sat, 19 Jul 2025 01:33:04 +0200 Subject: [PATCH 072/109] languages: coerce server type to list for compat --- lib/types/custom.nix | 5 ++++- lib/types/default.nix | 2 +- modules/plugins/languages/asm.nix | 6 +++--- modules/plugins/languages/astro.nix | 8 +++----- modules/plugins/languages/bash.nix | 10 ++++------ modules/plugins/languages/clang.nix | 6 +++--- modules/plugins/languages/csharp.nix | 6 +++--- modules/plugins/languages/css.nix | 4 ++-- modules/plugins/languages/dart.nix | 8 +++----- modules/plugins/languages/elixir.nix | 8 +++----- modules/plugins/languages/fsharp.nix | 6 +++--- modules/plugins/languages/gleam.nix | 8 +++----- modules/plugins/languages/go.nix | 4 ++-- modules/plugins/languages/helm.nix | 6 +++--- modules/plugins/languages/julia.nix | 6 +++--- modules/plugins/languages/markdown.nix | 4 ++-- modules/plugins/languages/nim.nix | 6 +++--- modules/plugins/languages/nix.nix | 6 +++--- modules/plugins/languages/nu.nix | 6 +++--- modules/plugins/languages/ocaml.nix | 6 +++--- modules/plugins/languages/odin.nix | 6 +++--- modules/plugins/languages/php.nix | 6 +++--- modules/plugins/languages/python.nix | 5 +++-- modules/plugins/languages/r.nix | 8 ++++---- modules/plugins/languages/ruby.nix | 6 +++--- modules/plugins/languages/sql.nix | 6 +++--- modules/plugins/languages/svelte.nix | 6 +++--- modules/plugins/languages/tailwind.nix | 5 +++-- modules/plugins/languages/ts.nix | 4 ++-- modules/plugins/languages/typst.nix | 4 ++-- modules/plugins/languages/vala.nix | 6 +++--- modules/plugins/languages/wgsl.nix | 6 +++--- modules/plugins/languages/yaml.nix | 6 +++--- modules/plugins/languages/zig.nix | 6 +++--- 34 files changed, 98 insertions(+), 103 deletions(-) diff --git a/lib/types/custom.nix b/lib/types/custom.nix index c42cd2ce..ae509f59 100644 --- a/lib/types/custom.nix +++ b/lib/types/custom.nix @@ -1,7 +1,8 @@ {lib}: let inherit (lib.options) mergeEqualOption; + inherit (lib.lists) singleton; inherit (lib.strings) isString stringLength match; - inherit (lib.types) listOf mkOptionType; + inherit (lib.types) listOf mkOptionType coercedTo; in { mergelessListOf = elemType: let super = listOf elemType; @@ -27,4 +28,6 @@ in { description = "RGB color in hex format"; check = v: isString v && (match "#?[0-9a-fA-F]{6}" v) != null; }; + + singleOrListOf = t: coercedTo t singleton (listOf t); } diff --git a/lib/types/default.nix b/lib/types/default.nix index 044a8221..c91473a2 100644 --- a/lib/types/default.nix +++ b/lib/types/default.nix @@ -10,5 +10,5 @@ in { inherit (typesDag) dagOf; inherit (typesPlugin) pluginsOpt extraPluginType mkPluginSetupOption luaInline pluginType borderType; inherit (typesLanguage) diagnostics mkGrammarOption; - inherit (customTypes) char hexColor mergelessListOf; + inherit (customTypes) char hexColor mergelessListOf singleOrListOf; } diff --git a/modules/plugins/languages/asm.nix b/modules/plugins/languages/asm.nix index c0887d77..9d296755 100644 --- a/modules/plugins/languages/asm.nix +++ b/modules/plugins/languages/asm.nix @@ -7,8 +7,8 @@ inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) package enum listOf; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.types) enum; + inherit (lib.nvim.types) mkGrammarOption singleOrListOf; inherit (lib.meta) getExe; inherit (lib.nvim.attrsets) mapListToAttrs; @@ -34,7 +34,7 @@ in { lsp = { enable = mkEnableOption "Assembly LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = singleOrListOf (enum (attrNames servers)); default = defaultServers; description = "Assembly LSP server to use"; }; diff --git a/modules/plugins/languages/astro.nix b/modules/plugins/languages/astro.nix index 35de328b..a16f286e 100644 --- a/modules/plugins/languages/astro.nix +++ b/modules/plugins/languages/astro.nix @@ -7,12 +7,10 @@ inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; - inherit (lib.lists) isList; inherit (lib.meta) getExe; - inherit (lib.types) enum either listOf package str; - inherit (lib.nvim.lua) expToLua; + inherit (lib.types) enum package; inherit (lib.nvim.attrsets) mapListToAttrs; - inherit (lib.nvim.types) mkGrammarOption diagnostics; + inherit (lib.nvim.types) mkGrammarOption diagnostics singleOrListOf; inherit (lib.generators) mkLuaInline; cfg = config.vim.languages.astro; @@ -91,7 +89,7 @@ in { lsp = { enable = mkEnableOption "Astro LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = singleOrListOf (enum (attrNames servers)); default = defaultServers; description = "Astro LSP server to use"; }; diff --git a/modules/plugins/languages/bash.nix b/modules/plugins/languages/bash.nix index e34edccb..4597666a 100644 --- a/modules/plugins/languages/bash.nix +++ b/modules/plugins/languages/bash.nix @@ -5,14 +5,12 @@ ... }: let inherit (builtins) attrNames; - inherit (lib.options) mkOption mkEnableOption literalExpression; + inherit (lib.options) mkOption mkEnableOption; inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; - inherit (lib.lists) isList; - inherit (lib.types) enum either package listOf str bool; + inherit (lib.types) enum package bool; inherit (lib.generators) mkLuaInline; - inherit (lib.nvim.types) diagnostics mkGrammarOption; - inherit (lib.nvim.lua) expToLua; + inherit (lib.nvim.types) diagnostics mkGrammarOption singleOrListOf; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.bash; @@ -57,7 +55,7 @@ in { lsp = { enable = mkEnableOption "Bash LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = singleOrListOf (enum (attrNames servers)); default = defaultServers; description = "Bash LSP server to use"; }; diff --git a/modules/plugins/languages/clang.nix b/modules/plugins/languages/clang.nix index 299731f6..487bc151 100644 --- a/modules/plugins/languages/clang.nix +++ b/modules/plugins/languages/clang.nix @@ -6,11 +6,11 @@ }: let inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption; - inherit (lib.types) bool enum package listOf; + inherit (lib.types) bool enum package; inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; inherit (lib.generators) mkLuaInline; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.types) mkGrammarOption singleOrListOf; inherit (lib.nvim.attrsets) mapListToAttrs; inherit (lib.nvim.dag) entryAfter; @@ -198,7 +198,7 @@ in { servers = mkOption { description = "The clang LSP server to use"; - type = listOf (enum (attrNames servers)); + type = singleOrListOf (enum (attrNames servers)); default = defaultServers; }; }; diff --git a/modules/plugins/languages/csharp.nix b/modules/plugins/languages/csharp.nix index ea09892a..a9708cae 100644 --- a/modules/plugins/languages/csharp.nix +++ b/modules/plugins/languages/csharp.nix @@ -7,12 +7,12 @@ }: let inherit (builtins) attrNames concatMap; inherit (lib.options) mkEnableOption mkOption; - inherit (lib.types) listOf enum; + inherit (lib.types) enum; inherit (lib.modules) mkIf mkMerge; inherit (lib.meta) getExe; inherit (lib.generators) mkLuaInline; inherit (lib.strings) optionalString; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.types) mkGrammarOption singleOrListOf; inherit (lib.nvim.lua) toLuaObject; inherit (lib.nvim.attrsets) mapListToAttrs; @@ -148,7 +148,7 @@ in { enable = mkEnableOption "C# LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { description = "C# LSP server to use"; - type = listOf (enum (attrNames servers)); + type = singleOrListOf (enum (attrNames servers)); default = defaultServers; }; }; diff --git a/modules/plugins/languages/css.nix b/modules/plugins/languages/css.nix index 1b0376ad..2d767ffc 100644 --- a/modules/plugins/languages/css.nix +++ b/modules/plugins/languages/css.nix @@ -8,8 +8,8 @@ inherit (lib.options) mkEnableOption mkOption; inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) enum listOf package; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.types) enum package; + inherit (lib.nvim.types) mkGrammarOption singleOrListOf; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.css; diff --git a/modules/plugins/languages/dart.nix b/modules/plugins/languages/dart.nix index de267e7c..52dcd560 100644 --- a/modules/plugins/languages/dart.nix +++ b/modules/plugins/languages/dart.nix @@ -8,12 +8,10 @@ inherit (lib.modules) mkIf mkMerge; inherit (lib.meta) getExe; inherit (lib.trivial) boolToString; - inherit (lib.lists) isList; inherit (lib.options) mkEnableOption mkOption; - inherit (lib.types) enum either listOf package nullOr str bool; + inherit (lib.types) enum package nullOr str bool; inherit (lib.strings) optionalString; - inherit (lib.nvim.lua) expToLua; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.types) mkGrammarOption singleOrListOf; inherit (lib.nvim.dag) entryAfter; inherit (lib.nvim.attrsets) mapListToAttrs; @@ -54,7 +52,7 @@ in { lsp = { enable = mkEnableOption "Dart LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = singleOrListOf (enum (attrNames servers)); default = defaultServers; description = "Dart LSP server to use"; }; diff --git a/modules/plugins/languages/elixir.nix b/modules/plugins/languages/elixir.nix index 5204c96b..20d6c668 100644 --- a/modules/plugins/languages/elixir.nix +++ b/modules/plugins/languages/elixir.nix @@ -7,12 +7,10 @@ inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; - inherit (lib.lists) isList; inherit (lib.meta) getExe; - inherit (lib.types) enum either listOf package str; + inherit (lib.types) enum package; inherit (lib.generators) mkLuaInline; - inherit (lib.nvim.types) mkGrammarOption; - inherit (lib.nvim.lua) expToLua; + inherit (lib.nvim.types) mkGrammarOption singleOrListOf; inherit (lib.nvim.dag) entryAnywhere; inherit (lib.nvim.attrsets) mapListToAttrs; @@ -63,7 +61,7 @@ in { lsp = { enable = mkEnableOption "Elixir LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = singleOrListOf (enum (attrNames servers)); default = defaultServers; description = "Elixir LSP server to use"; }; diff --git a/modules/plugins/languages/fsharp.nix b/modules/plugins/languages/fsharp.nix index 5a6f8e4e..9ead9a48 100644 --- a/modules/plugins/languages/fsharp.nix +++ b/modules/plugins/languages/fsharp.nix @@ -6,11 +6,11 @@ }: let inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption; - inherit (lib.types) listOf package enum; + inherit (lib.types) package enum; inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; inherit (lib.generators) mkLuaInline; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.types) mkGrammarOption singleOrListOf; inherit (lib.nvim.attrsets) mapListToAttrs; defaultServer = ["fsautocomplete"]; @@ -72,7 +72,7 @@ in { lsp = { enable = mkEnableOption "F# LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = singleOrListOf (enum (attrNames servers)); default = defaultServer; description = "F# LSP server to use"; }; diff --git a/modules/plugins/languages/gleam.nix b/modules/plugins/languages/gleam.nix index 26a001eb..984d21aa 100644 --- a/modules/plugins/languages/gleam.nix +++ b/modules/plugins/languages/gleam.nix @@ -7,11 +7,9 @@ inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; - inherit (lib.lists) isList; inherit (lib.meta) getExe; - inherit (lib.types) enum either listOf package str; - inherit (lib.nvim.lua) expToLua; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.types) enum; + inherit (lib.nvim.types) mkGrammarOption singleOrListOf; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.gleam; @@ -37,7 +35,7 @@ in { lsp = { enable = mkEnableOption "Gleam LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = singleOrListOf (enum (attrNames servers)); default = defaultServers; description = "Gleam LSP server to use"; }; diff --git a/modules/plugins/languages/go.nix b/modules/plugins/languages/go.nix index 3ecc5d28..5b1aeebb 100644 --- a/modules/plugins/languages/go.nix +++ b/modules/plugins/languages/go.nix @@ -9,8 +9,8 @@ inherit (lib.modules) mkIf mkMerge; inherit (lib.meta) getExe; inherit (lib.generators) mkLuaInline; - inherit (lib.types) bool enum package listOf; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.types) bool enum package; + inherit (lib.nvim.types) mkGrammarOption singleOrListOf; inherit (lib.nvim.dag) entryAfter; inherit (lib.nvim.attrsets) mapListToAttrs; diff --git a/modules/plugins/languages/helm.nix b/modules/plugins/languages/helm.nix index f5fe7b64..1971eb31 100644 --- a/modules/plugins/languages/helm.nix +++ b/modules/plugins/languages/helm.nix @@ -8,8 +8,8 @@ inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; inherit (lib.meta) getExe; - inherit (lib.types) enum listOf; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.types) enum; + inherit (lib.nvim.types) mkGrammarOption singleOrListOf; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.helm; @@ -49,7 +49,7 @@ in { lsp = { enable = mkEnableOption "Helm LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = singleOrListOf (enum (attrNames servers)); default = defaultServers; description = "Helm LSP server to use"; }; diff --git a/modules/plugins/languages/julia.nix b/modules/plugins/languages/julia.nix index d5310613..6db31289 100644 --- a/modules/plugins/languages/julia.nix +++ b/modules/plugins/languages/julia.nix @@ -6,10 +6,10 @@ }: let inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption; - inherit (lib.types) listOf enum; + inherit (lib.types) enum; inherit (lib.modules) mkIf mkMerge; inherit (lib.meta) getExe; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.types) mkGrammarOption singleOrListOf; inherit (lib.generators) mkLuaInline; inherit (lib.nvim.attrsets) mapListToAttrs; inherit (lib.nvim.dag) entryBefore; @@ -97,7 +97,7 @@ in { lsp = { enable = mkEnableOption "Java LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = singleOrListOf (enum (attrNames servers)); default = defaultServers; description = '' Julia LSP Server to Use diff --git a/modules/plugins/languages/markdown.nix b/modules/plugins/languages/markdown.nix index 78e9d67b..0a3f0945 100644 --- a/modules/plugins/languages/markdown.nix +++ b/modules/plugins/languages/markdown.nix @@ -10,7 +10,7 @@ inherit (lib.options) mkEnableOption mkOption; inherit (lib.types) bool enum package listOf str nullOr; inherit (lib.nvim.lua) toLuaObject; - inherit (lib.nvim.types) diagnostics mkGrammarOption mkPluginSetupOption; + inherit (lib.nvim.types) diagnostics mkGrammarOption mkPluginSetupOption singleOrListOf; inherit (lib.nvim.dag) entryAnywhere; inherit (lib.nvim.attrsets) mapListToAttrs; @@ -63,7 +63,7 @@ in { servers = mkOption { description = "Markdown LSP server to use"; - type = listOf (enum (attrNames servers)); + type = singleOrListOf (enum (attrNames servers)); default = defaultServers; }; }; diff --git a/modules/plugins/languages/nim.nix b/modules/plugins/languages/nim.nix index 289c9691..b4fab356 100644 --- a/modules/plugins/languages/nim.nix +++ b/modules/plugins/languages/nim.nix @@ -8,8 +8,8 @@ inherit (lib.options) mkEnableOption mkOption; inherit (lib.meta) getExe'; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) enum listOf package; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.types) enum package; + inherit (lib.nvim.types) mkGrammarOption singleOrListOf; inherit (lib.generators) mkLuaInline; inherit (lib.nvim.attrsets) mapListToAttrs; @@ -59,7 +59,7 @@ in { enable = mkEnableOption "Nim LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = singleOrListOf (enum (attrNames servers)); default = defaultServers; description = "Nim LSP server to use"; }; diff --git a/modules/plugins/languages/nix.nix b/modules/plugins/languages/nix.nix index c460ca50..6127f78e 100644 --- a/modules/plugins/languages/nix.nix +++ b/modules/plugins/languages/nix.nix @@ -9,8 +9,8 @@ inherit (lib.meta) getExe; inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) enum package listOf; - inherit (lib.nvim.types) mkGrammarOption diagnostics; + inherit (lib.types) enum package; + inherit (lib.nvim.types) mkGrammarOption diagnostics singleOrListOf; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.nix; @@ -98,7 +98,7 @@ in { lsp = { enable = mkEnableOption "Nix LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = singleOrListOf (enum (attrNames servers)); default = defaultServers; description = "Nix LSP server to use"; }; diff --git a/modules/plugins/languages/nu.nix b/modules/plugins/languages/nu.nix index 55711104..d58e39a3 100644 --- a/modules/plugins/languages/nu.nix +++ b/modules/plugins/languages/nu.nix @@ -5,9 +5,9 @@ ... }: let inherit (lib.options) mkEnableOption mkOption; - inherit (lib.types) enum listOf; + inherit (lib.types) enum; inherit (lib.modules) mkIf mkMerge; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.types) mkGrammarOption singleOrListOf; inherit (lib.meta) getExe; inherit (lib.generators) mkLuaInline; inherit (lib.nvim.attrsets) mapListToAttrs; @@ -46,7 +46,7 @@ in { enable = mkEnableOption "Nu LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = singleOrListOf (enum (attrNames servers)); default = defaultServers; description = "Nu LSP server to use"; }; diff --git a/modules/plugins/languages/ocaml.nix b/modules/plugins/languages/ocaml.nix index a8f964e9..cf9fdd93 100644 --- a/modules/plugins/languages/ocaml.nix +++ b/modules/plugins/languages/ocaml.nix @@ -8,8 +8,8 @@ inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; inherit (lib.meta) getExe; - inherit (lib.types) enum listOf package; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.types) enum package; + inherit (lib.nvim.types) mkGrammarOption singleOrListOf; inherit (lib.generators) mkLuaInline; inherit (lib.nvim.attrsets) mapListToAttrs; @@ -74,7 +74,7 @@ in { enable = mkEnableOption "OCaml LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = singleOrListOf (enum (attrNames servers)); default = defaultServers; description = "OCaml LSP server to use"; }; diff --git a/modules/plugins/languages/odin.nix b/modules/plugins/languages/odin.nix index 1b1bd751..f18a3383 100644 --- a/modules/plugins/languages/odin.nix +++ b/modules/plugins/languages/odin.nix @@ -7,9 +7,9 @@ inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) listOf enum; + inherit (lib.types) enum; inherit (lib.meta) getExe; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.types) mkGrammarOption singleOrListOf; inherit (lib.generators) mkLuaInline; inherit (lib.nvim.attrsets) mapListToAttrs; @@ -46,7 +46,7 @@ in { enable = mkEnableOption "Odin LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = singleOrListOf (enum (attrNames servers)); default = defaultServers; description = "Odin LSP server to use"; }; diff --git a/modules/plugins/languages/php.nix b/modules/plugins/languages/php.nix index 9eaae168..353b1137 100644 --- a/modules/plugins/languages/php.nix +++ b/modules/plugins/languages/php.nix @@ -8,8 +8,8 @@ inherit (lib.options) mkEnableOption mkOption; inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) enum listOf; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.types) enum; + inherit (lib.nvim.types) mkGrammarOption singleOrListOf; inherit (lib.nvim.attrsets) mapListToAttrs; inherit (lib.generators) mkLuaInline; @@ -77,7 +77,7 @@ in { enable = mkEnableOption "PHP LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = singleOrListOf (enum (attrNames servers)); default = defaultServers; description = "PHP LSP server to use"; }; diff --git a/modules/plugins/languages/python.nix b/modules/plugins/languages/python.nix index aba4cd7e..6f97f70c 100644 --- a/modules/plugins/languages/python.nix +++ b/modules/plugins/languages/python.nix @@ -8,8 +8,9 @@ inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) enum listOf package str bool; + inherit (lib.types) enum package bool; inherit (lib.nvim.attrsets) mapListToAttrs; + inherit (lib.nvim.types) singleOrListOf; inherit (lib.generators) mkLuaInline; inherit (lib.nvim.dag) entryBefore; @@ -229,7 +230,7 @@ in { enable = mkEnableOption "Python LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = singleOrListOf (enum (attrNames servers)); default = defaultServers; description = "Python LSP server to use"; }; diff --git a/modules/plugins/languages/r.nix b/modules/plugins/languages/r.nix index 9f28900a..873edaa3 100644 --- a/modules/plugins/languages/r.nix +++ b/modules/plugins/languages/r.nix @@ -5,11 +5,11 @@ ... }: let inherit (builtins) attrNames; - inherit (lib.options) mkEnableOption mkOption literalExpression; + inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) enum listOf package; + inherit (lib.types) enum package; inherit (lib.meta) getExe; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.types) mkGrammarOption singleOrListOf; inherit (lib.nvim.attrsets) mapListToAttrs; inherit (lib.generators) mkLuaInline; @@ -77,7 +77,7 @@ in { enable = mkEnableOption "R LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = singleOrListOf (enum (attrNames servers)); default = defaultServers; description = "R LSP server to use"; }; diff --git a/modules/plugins/languages/ruby.nix b/modules/plugins/languages/ruby.nix index 6b2e63da..94e27277 100644 --- a/modules/plugins/languages/ruby.nix +++ b/modules/plugins/languages/ruby.nix @@ -8,8 +8,8 @@ inherit (lib.options) mkEnableOption mkOption; inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; - inherit (lib.nvim.types) mkGrammarOption diagnostics; - inherit (lib.types) listOf package enum; + inherit (lib.nvim.types) mkGrammarOption diagnostics singleOrListOf; + inherit (lib.types) package enum; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.ruby; @@ -77,7 +77,7 @@ in { enable = mkEnableOption "Ruby LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = singleOrListOf (enum (attrNames servers)); default = defaultServers; description = "Ruby LSP server to use"; }; diff --git a/modules/plugins/languages/sql.nix b/modules/plugins/languages/sql.nix index 7321dcf5..c1ea6678 100644 --- a/modules/plugins/languages/sql.nix +++ b/modules/plugins/languages/sql.nix @@ -8,8 +8,8 @@ inherit (lib.options) mkEnableOption mkOption; inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) enum listOf package str; - inherit (lib.nvim.types) diagnostics; + inherit (lib.types) enum package str; + inherit (lib.nvim.types) diagnostics singleOrListOf; inherit (lib.nvim.attrsets) mapListToAttrs; inherit (lib.generators) mkLuaInline; @@ -78,7 +78,7 @@ in { enable = mkEnableOption "SQL LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = singleOrListOf (enum (attrNames servers)); default = defaultServers; description = "SQL LSP server to use"; }; diff --git a/modules/plugins/languages/svelte.nix b/modules/plugins/languages/svelte.nix index a876f65d..42e6d320 100644 --- a/modules/plugins/languages/svelte.nix +++ b/modules/plugins/languages/svelte.nix @@ -8,8 +8,8 @@ inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; inherit (lib.meta) getExe; - inherit (lib.types) enum listOf package; - inherit (lib.nvim.types) mkGrammarOption diagnostics; + inherit (lib.types) enum package; + inherit (lib.nvim.types) mkGrammarOption diagnostics singleOrListOf; inherit (lib.nvim.attrsets) mapListToAttrs; inherit (lib.generators) mkLuaInline; @@ -90,7 +90,7 @@ in { enable = mkEnableOption "Svelte LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = singleOrListOf (enum (attrNames servers)); default = defaultServers; description = "Svelte LSP server to use"; }; diff --git a/modules/plugins/languages/tailwind.nix b/modules/plugins/languages/tailwind.nix index 601f0f88..a5950636 100644 --- a/modules/plugins/languages/tailwind.nix +++ b/modules/plugins/languages/tailwind.nix @@ -8,8 +8,9 @@ inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; inherit (lib.meta) getExe; - inherit (lib.types) enum listOf; + inherit (lib.types) enum; inherit (lib.nvim.attrsets) mapListToAttrs; + inherit (lib.nvim.types) singleOrListOf; inherit (lib.generators) mkLuaInline; cfg = config.vim.languages.tailwind; @@ -154,7 +155,7 @@ in { enable = mkEnableOption "Tailwindcss LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = singleOrListOf (enum (attrNames servers)); default = defaultServers; description = "Tailwindcss LSP server to use"; }; diff --git a/modules/plugins/languages/ts.nix b/modules/plugins/languages/ts.nix index 9b99de07..9f15ff24 100644 --- a/modules/plugins/languages/ts.nix +++ b/modules/plugins/languages/ts.nix @@ -8,11 +8,11 @@ inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; inherit (lib.meta) getExe; - inherit (lib.types) enum listOf package bool; + inherit (lib.types) enum package bool; inherit (lib.generators) mkLuaInline; inherit (lib.nvim.attrsets) mapListToAttrs; inherit (lib.nvim.lua) toLuaObject; - inherit (lib.nvim.types) mkGrammarOption diagnostics mkPluginSetupOption; + inherit (lib.nvim.types) mkGrammarOption diagnostics mkPluginSetupOption singleOrListOf; inherit (lib.nvim.dag) entryAnywhere entryBefore; cfg = config.vim.languages.ts; diff --git a/modules/plugins/languages/typst.nix b/modules/plugins/languages/typst.nix index 2bc4af42..fbeb0ce2 100644 --- a/modules/plugins/languages/typst.nix +++ b/modules/plugins/languages/typst.nix @@ -9,7 +9,7 @@ inherit (lib.types) nullOr enum attrsOf listOf package str; inherit (lib.attrsets) attrNames; inherit (lib.meta) getExe; - inherit (lib.nvim.types) mkGrammarOption mkPluginSetupOption; + inherit (lib.nvim.types) mkGrammarOption mkPluginSetupOption singleOrListOf; inherit (lib.nvim.dag) entryAnywhere; inherit (lib.nvim.lua) toLuaObject; inherit (lib.nvim.attrsets) mapListToAttrs; @@ -114,7 +114,7 @@ in { enable = mkEnableOption "Typst LSP support (typst-lsp)" // {default = config.vim.lsp.enable;}; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = singleOrListOf (enum (attrNames servers)); default = defaultServers; description = "Typst LSP server to use"; }; diff --git a/modules/plugins/languages/vala.nix b/modules/plugins/languages/vala.nix index 85058e32..722b0d3b 100644 --- a/modules/plugins/languages/vala.nix +++ b/modules/plugins/languages/vala.nix @@ -8,8 +8,8 @@ inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; inherit (lib.meta) getExe; - inherit (lib.types) enum listOf; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.types) enum; + inherit (lib.nvim.types) mkGrammarOption singleOrListOf; inherit (lib.nvim.attrsets) mapListToAttrs; inherit (lib.generators) mkLuaInline; @@ -73,7 +73,7 @@ in { lsp = { enable = mkEnableOption "Vala LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = singleOrListOf (enum (attrNames servers)); default = defaultServers; description = "Vala LSP server to use"; }; diff --git a/modules/plugins/languages/wgsl.nix b/modules/plugins/languages/wgsl.nix index 3b278a27..ceeb7e9e 100644 --- a/modules/plugins/languages/wgsl.nix +++ b/modules/plugins/languages/wgsl.nix @@ -6,9 +6,9 @@ }: let inherit (builtins) attrNames; inherit (lib.modules) mkIf mkMerge; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.types) mkGrammarOption singleOrListOf; inherit (lib.options) mkEnableOption mkOption; - inherit (lib.types) enum listOf; + inherit (lib.types) enum; inherit (lib.meta) getExe; inherit (lib.nvim.attrsets) mapListToAttrs; @@ -37,7 +37,7 @@ in { enable = mkEnableOption "WGSL LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = singleOrListOf (enum (attrNames servers)); default = defaultServers; description = "WGSL LSP server to use"; }; diff --git a/modules/plugins/languages/yaml.nix b/modules/plugins/languages/yaml.nix index de503e9c..1869b1c1 100644 --- a/modules/plugins/languages/yaml.nix +++ b/modules/plugins/languages/yaml.nix @@ -8,8 +8,8 @@ inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; inherit (lib.meta) getExe; - inherit (lib.types) enum listOf; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.types) enum; + inherit (lib.nvim.types) mkGrammarOption singleOrListOf; inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.yaml; @@ -56,7 +56,7 @@ in { lsp = { enable = mkEnableOption "Yaml LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = singleOrListOf (enum (attrNames servers)); default = defaultServers; description = "Yaml LSP server to use"; }; diff --git a/modules/plugins/languages/zig.nix b/modules/plugins/languages/zig.nix index db38cc51..966e9369 100644 --- a/modules/plugins/languages/zig.nix +++ b/modules/plugins/languages/zig.nix @@ -7,8 +7,8 @@ inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge mkDefault; - inherit (lib.types) bool listOf package enum; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.types) bool package enum; + inherit (lib.nvim.types) mkGrammarOption singleOrListOf; inherit (lib.meta) getExe; inherit (lib.nvim.attrsets) mapListToAttrs; @@ -67,7 +67,7 @@ in { enable = mkEnableOption "Zig LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { - type = listOf (enum (attrNames servers)); + type = singleOrListOf (enum (attrNames servers)); default = defaultServers; description = "Zig LSP server to use"; }; From a5ba08770a555d4ed634a589c04d3726464e5190 Mon Sep 17 00:00:00 2001 From: Pei Yang Ching <59727193+horriblename@users.noreply.github.com> Date: Sat, 19 Jul 2025 01:38:48 +0200 Subject: [PATCH 073/109] languages: add deprecation warning for renamed options --- modules/extra/deprecations.nix | 144 +++++++++++++++++++++++++++++++-- 1 file changed, 138 insertions(+), 6 deletions(-) diff --git a/modules/extra/deprecations.nix b/modules/extra/deprecations.nix index fe6f08a5..77f4bcc6 100644 --- a/modules/extra/deprecations.nix +++ b/modules/extra/deprecations.nix @@ -1,5 +1,6 @@ {lib, ...}: let - inherit (lib.modules) mkRemovedOptionModule mkRenamedOptionModule; + inherit (builtins) head warn; + inherit (lib.modules) mkRemovedOptionModule mkRenamedOptionModule doRename; inherit (lib.lists) concatLists; inherit (lib.nvim.config) batchRenameOptions; @@ -21,9 +22,26 @@ scrollOffset = "scrolloff"; }; - lspOptRemovalMsg = '' - `vim.languages..lsp.opts` are now moved to `vim.lsp.servers..init_options` - ''; + mkRemovedLspOpt = lang: (mkRemovedOptionModule ["vim" "languages" lang "lsp" "opts"] '' + `vim.languages.${lang}.lsp.opts` is now moved to `vim.lsp.servers..init_options` + ''); + + mkRemovedLspPackage = lang: (mkRemovedOptionModule ["vim" "languages" lang "lsp" "package"] '' + `vim.languages.${lang}.lsp.package` is now moved to `vim.lsp.servers..cmd` + ''); + + mkRenamedLspServer = lang: + doRename + { + from = ["vim" "languages" lang "lsp" "server"]; + to = ["vim" "languages" lang "lsp" "servers"]; + visible = false; + warn = true; + use = x: + warn + "Obsolete option `vim.languages.${lang}.lsp.server` used, use `vim.languages.${lang}.lsp.servers` instead." + (head x); + }; in { imports = concatLists [ [ @@ -125,8 +143,122 @@ in { details, or open an issue if you are confused. '') - # 2025-04-05 - (mkRemovedOptionModule ["vim" "languages" "clang" "lsp" "opts"] lspOptRemovalMsg) + # 2025-07-12 + (mkRenamedLspServer "assembly") + + (mkRenamedLspServer "astro") + (mkRemovedLspPackage "astro") + + (mkRenamedLspServer "bash") + (mkRemovedLspPackage "bash") + + (mkRemovedLspOpt "clang") + (mkRemovedLspPackage "clang") + (mkRenamedLspServer "clang") + + (mkRemovedLspPackage "clojure") + + (mkRenamedLspServer "csharp") + (mkRemovedLspPackage "csharp") + + (mkRenamedLspServer "css") + (mkRemovedLspPackage "css") + + (mkRemovedLspPackage "cue") + + (mkRenamedLspServer "dart") + (mkRemovedLspPackage "dart") + (mkRemovedLspOpt "dart") + + (mkRenamedLspServer "elixir") + (mkRemovedLspPackage "elixir") + + (mkRenamedLspServer "fsharp") + (mkRemovedLspPackage "fsharp") + + (mkRenamedLspServer "gleam") + (mkRemovedLspPackage "gleam") + + (mkRenamedLspServer "go") + (mkRemovedLspPackage "go") + + (mkRemovedLspPackage "haskell") + + (mkRemovedLspPackage "hcl") + + (mkRenamedLspServer "helm") + (mkRemovedLspPackage "helm") + + (mkRemovedLspPackage "java") + + (mkRenamedLspServer "julia") + (mkRemovedLspPackage "julia") + + (mkRemovedLspPackage "kotlin") + + (mkRemovedLspPackage "lua") + + (mkRenamedLspServer "markdown") + (mkRemovedLspPackage "markdown") + + (mkRenamedLspServer "nim") + (mkRemovedLspPackage "nim") + + (mkRenamedLspServer "nix") + (mkRemovedLspPackage "nix") + (mkRemovedOptionModule ["vim" "languages" "nix" "lsp" "options"] '' + `vim.languages.nix.lsp.options` has been moved to `vim.lsp.servers..init_options`. + '') + + (mkRenamedLspServer "nu") + (mkRemovedLspPackage "nu") + + (mkRenamedLspServer "ocaml") + (mkRemovedLspPackage "ocaml") + + (mkRenamedLspServer "odin") + (mkRemovedLspPackage "odin") + + (mkRenamedLspServer "php") + (mkRemovedLspPackage "php") + + (mkRenamedLspServer "python") + (mkRemovedLspPackage "python") + + (mkRenamedLspServer "r") + (mkRemovedLspPackage "r") + + (mkRenamedLspServer "ruby") + (mkRemovedLspPackage "ruby") + + (mkRenamedLspServer "sql") + (mkRemovedLspPackage "sql") + + (mkRenamedLspServer "svelte") + (mkRemovedLspPackage "svelte") + + (mkRenamedLspServer "tailwind") + (mkRemovedLspPackage "tailwind") + + (mkRemovedLspPackage "terraform") + + (mkRenamedLspServer "ts") + (mkRemovedLspPackage "ts") + + (mkRenamedLspServer "typst") + (mkRemovedLspPackage "typst") + + (mkRenamedLspServer "vala") + (mkRemovedLspPackage "vala") + + (mkRenamedLspServer "wgsl") + (mkRemovedLspPackage "wgsl") + + (mkRenamedLspServer "yaml") + (mkRemovedLspPackage "yaml") + + (mkRenamedLspServer "zig") + (mkRemovedLspPackage "zig") ] # Migrated via batchRenameOptions. Further batch renames must be below this line. From 153290a767d81c4db5d8fc1e1f73a75338b4151f Mon Sep 17 00:00:00 2001 From: Ching Pei Yang Date: Wed, 23 Jul 2025 23:38:01 +0200 Subject: [PATCH 074/109] ci: add "edn" to typos --- .github/typos.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/typos.toml b/.github/typos.toml index 2cd18dde..378d3e2d 100644 --- a/.github/typos.toml +++ b/.github/typos.toml @@ -5,6 +5,8 @@ default.extend-ignore-words-re = [ "befores", "annote", "viw", + "edn", + "esy", "BA", # somehow "BANanaD3V" is valid, but BA is not... ] From 6394f82a229af3e8115287f8d6fa128cf8dcf2c5 Mon Sep 17 00:00:00 2001 From: Ching Pei Yang Date: Thu, 24 Jul 2025 15:21:59 +0200 Subject: [PATCH 075/109] languages/julia: fix outdated docs --- modules/plugins/languages/julia.nix | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/modules/plugins/languages/julia.nix b/modules/plugins/languages/julia.nix index 6db31289..c9be8d49 100644 --- a/modules/plugins/languages/julia.nix +++ b/modules/plugins/languages/julia.nix @@ -14,9 +14,9 @@ inherit (lib.nvim.attrsets) mapListToAttrs; inherit (lib.nvim.dag) entryBefore; - defaultServers = ["jdtls"]; + defaultServers = ["julials"]; servers = { - jdtls = { + julials = { enable = true; cmd = mkLuaInline @@ -95,7 +95,7 @@ in { }; lsp = { - enable = mkEnableOption "Java LSP support" // {default = config.vim.lsp.enable;}; + enable = mkEnableOption "Julia LSP support" // {default = config.vim.lsp.enable;}; servers = mkOption { type = singleOrListOf (enum (attrNames servers)); default = defaultServers; @@ -107,9 +107,11 @@ in { option, since there is no way to provide only the LSP server. If you want to avoid that, you have to change - [](#opt-vim.languages.julia.lsp.package) to use the Julia binary - in {env}`PATH` (set it to `null`), and add the `LanguageServer` package to - Julia in your devshells. + [vim.lsp.servers.julials.cmd](#opt-vim.lsp.servers._name_.cmd) to use + the Julia binary in {env}`PATH`, and add the `LanguageServer` + package to Julia in your devshells. + + Check the source file of this option for the full `cmd`. ::: ''; }; From b45b763fd442352380d32de79a23bdc564ee939c Mon Sep 17 00:00:00 2001 From: Ching Pei Yang Date: Tue, 29 Jul 2025 23:33:08 +0200 Subject: [PATCH 076/109] languages/tailwind: fix use of lspconfig.util --- modules/plugins/languages/tailwind.nix | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/plugins/languages/tailwind.nix b/modules/plugins/languages/tailwind.nix index a5950636..4e63a8d8 100644 --- a/modules/plugins/languages/tailwind.nix +++ b/modules/plugins/languages/tailwind.nix @@ -121,7 +121,6 @@ workspace_required = true; root_dir = mkLuaInline '' function(bufnr, on_dir) - local util = require 'lspconfig.util' local root_files = { -- Generic 'tailwind.config.js', From 4b99fb6d90cd048afa827e38bf9464b512f0d7f3 Mon Sep 17 00:00:00 2001 From: Cool-Game-Dev Date: Sat, 26 Jul 2025 18:45:42 -0500 Subject: [PATCH 077/109] language/just: init Create the module `vim.languages.just` which provides support for treesitting and just-lsp. --- configuration.nix | 1 + docs/release-notes/rl-0.8.md | 7 +++ modules/plugins/languages/default.nix | 1 + modules/plugins/languages/just.nix | 64 +++++++++++++++++++++++++++ 4 files changed, 73 insertions(+) create mode 100644 modules/plugins/languages/just.nix diff --git a/configuration.nix b/configuration.nix index b3828826..537a6863 100644 --- a/configuration.nix +++ b/configuration.nix @@ -87,6 +87,7 @@ isMaximal: { hcl.enable = false; ruby.enable = false; fsharp.enable = false; + just.enable = false; tailwind.enable = false; svelte.enable = false; diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index c72f65d7..6c871c75 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -468,4 +468,11 @@ https://github.com/NotAShelf/nvf/commit/fc8206e7a61d7eb02006f9010e62ebdb3336d0d2). [soliprem](https://github.com/soliprem): + - fix broken `neorg` grammars + +[Cool-Game-Dev](https://github.com/Cool-Game-Dev): + +[just-lsp]: https://github.com/terror/just-lsp + +- Add just support under `vim.languages.just` using [just-lsp]. diff --git a/modules/plugins/languages/default.nix b/modules/plugins/languages/default.nix index 961d7cc5..803c076c 100644 --- a/modules/plugins/languages/default.nix +++ b/modules/plugins/languages/default.nix @@ -46,6 +46,7 @@ in { ./wgsl.nix ./yaml.nix ./ruby.nix + ./just.nix # This is now a hard deprecation. (mkRenamedOptionModule ["vim" "languages" "enableLSP"] ["vim" "lsp" "enable"]) diff --git a/modules/plugins/languages/just.nix b/modules/plugins/languages/just.nix new file mode 100644 index 00000000..7645f255 --- /dev/null +++ b/modules/plugins/languages/just.nix @@ -0,0 +1,64 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (builtins) attrNames; + inherit (lib.options) mkEnableOption mkOption; + inherit (lib.modules) mkIf mkMerge; + inherit (lib.meta) getExe; + 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"]; + }; + }; +in { + options.vim.languages.just = { + enable = mkEnableOption "Just support"; + + treesitter = { + enable = + mkEnableOption "Just treesitter" // {default = config.vim.languages.enableTreesitter;}; + package = mkGrammarOption pkgs "just"; + }; + + lsp = { + enable = + mkEnableOption "Just LSP support" // {default = config.vim.lsp.enable;}; + servers = mkOption { + type = listOf (enum (attrNames servers)); + default = defaultServers; + description = "Just LSP server to use"; + }; + }; + }; + + config = mkIf cfg.enable (mkMerge [ + (mkIf cfg.treesitter.enable { + vim.treesitter = { + enable = true; + grammars = [cfg.treesitter.package]; + }; + }) + + (mkIf cfg.lsp.enable { + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; + }) + ]); +} From de1f36b4be2283117125f6c7dcf44c84dfd2261f Mon Sep 17 00:00:00 2001 From: poz Date: Wed, 23 Jul 2025 01:59:08 +0200 Subject: [PATCH 078/109] utility/oil-nvim: add oil-git-status support --- docs/release-notes/rl-0.8.md | 3 ++ modules/plugins/utility/oil-nvim/config.nix | 30 +++++++++++++++---- modules/plugins/utility/oil-nvim/oil-nvim.nix | 8 +++++ npins/sources.json | 13 ++++++++ 4 files changed, 49 insertions(+), 5 deletions(-) diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index c72f65d7..d2f649b5 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -383,9 +383,12 @@ [poz](https://poz.pet): [everforest]: https://github.com/sainnhe/everforest +[oil]: https://github.com/stevearc/oil.nvim +[oil-git-status]: https://github.com/refractalize/oil-git-status.nvim - Fix gitsigns null-ls issue. - Add [everforest] theme support. +- Add [oil-git-status] support to [oil] module. [Haskex](https://github.com/haskex): diff --git a/modules/plugins/utility/oil-nvim/config.nix b/modules/plugins/utility/oil-nvim/config.nix index dca4de60..9344c305 100644 --- a/modules/plugins/utility/oil-nvim/config.nix +++ b/modules/plugins/utility/oil-nvim/config.nix @@ -3,18 +3,38 @@ lib, ... }: let + inherit (lib.attrsets) optionalAttrs recursiveUpdate; + inherit (lib.lists) optionals; inherit (lib.modules) mkIf; inherit (lib.nvim.lua) toLuaObject; - inherit (lib.nvim.dag) entryAnywhere; + inherit (lib.nvim.dag) entryAfter entryAnywhere; cfg = config.vim.utility.oil-nvim; in { config = mkIf cfg.enable { vim = { - startPlugins = ["oil-nvim"]; - pluginRC.oil-nvim = entryAnywhere '' - require("oil").setup(${toLuaObject cfg.setupOpts}); - ''; + startPlugins = ["oil-nvim"] ++ (optionals cfg.gitStatus.enable ["oil-git-status.nvim"]); + + pluginRC.oil-nvim = let + gitStatusDefaultOpts = { + # https://github.com/refractalize/oil-git-status.nvim?tab=readme-ov-file#configuration + win_options = { + signcolumn = "yes:2"; + }; + }; + + setupOpts = + recursiveUpdate + (optionalAttrs cfg.gitStatus.enable gitStatusDefaultOpts) + cfg.setupOpts; + in + entryAnywhere '' + require("oil").setup(${toLuaObject setupOpts}); + ''; + + pluginRC.oil-git-status-nvim = mkIf cfg.gitStatus.enable (entryAfter ["oil-nvim"] '' + require("oil-git-status").setup(${toLuaObject cfg.gitStatus.setupOpts}) + ''); }; }; } diff --git a/modules/plugins/utility/oil-nvim/oil-nvim.nix b/modules/plugins/utility/oil-nvim/oil-nvim.nix index 557f3db6..426188bc 100644 --- a/modules/plugins/utility/oil-nvim/oil-nvim.nix +++ b/modules/plugins/utility/oil-nvim/oil-nvim.nix @@ -8,5 +8,13 @@ in { ''; setupOpts = mkPluginSetupOption "oil-nvim" {}; + + gitStatus = { + enable = mkEnableOption '' + Git status on [oil-nvim] directory listings + ''; + + setupOpts = mkPluginSetupOption "oil-git-status-nvim" {}; + }; }; } diff --git a/npins/sources.json b/npins/sources.json index fd5a34f2..eec2fde9 100644 --- a/npins/sources.json +++ b/npins/sources.json @@ -2030,6 +2030,19 @@ "url": "https://github.com/epwalsh/obsidian.nvim/archive/14e0427bef6c55da0d63f9a313fd9941be3a2479.tar.gz", "hash": "15ycmhn48ryaqzch6w3w6llq2qgmjx8xwkb9dn0075z60dybpflr" }, + "oil-git-status.nvim": { + "type": "Git", + "repository": { + "type": "GitHub", + "owner": "refractalize", + "repo": "oil-git-status.nvim" + }, + "branch": "main", + "submodules": false, + "revision": "4b5cf53842c17a09420919e655a6a559da3112d7", + "url": "https://github.com/refractalize/oil-git-status.nvim/archive/4b5cf53842c17a09420919e655a6a559da3112d7.tar.gz", + "hash": "1jzw6lkvi9xxzqy8xz056xlb45byr1arklh87zmyf0nj9plm2nsp" + }, "oil-nvim": { "type": "Git", "repository": { From b64f7d48f18f5d94a9e2d4c431b19c21b8809d50 Mon Sep 17 00:00:00 2001 From: Ching Pei Yang Date: Wed, 13 Aug 2025 13:59:44 +0200 Subject: [PATCH 079/109] startify: fix typo --- modules/plugins/dashboard/startify/startify.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/plugins/dashboard/startify/startify.nix b/modules/plugins/dashboard/startify/startify.nix index c33cfa01..696fda90 100644 --- a/modules/plugins/dashboard/startify/startify.nix +++ b/modules/plugins/dashboard/startify/startify.nix @@ -7,7 +7,7 @@ in { bookmarks = mkOption { default = []; - description = ''List of book marks to disaply on start page''; + description = ''List of book marks to display on start page''; type = listOf attrs; example = {"c" = "~/.vimrc";}; }; From 238b86daeb8ce015c0e44d9eb9888f56b0b45510 Mon Sep 17 00:00:00 2001 From: Cool-Game-Dev Date: Tue, 12 Aug 2025 13:42:40 -0500 Subject: [PATCH 080/109] languages/csharp: Add roslyn-ls Add the roslyn-ls lsp to the csharp language model, following standards set by other lsps. --- modules/plugins/languages/csharp.nix | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/modules/plugins/languages/csharp.nix b/modules/plugins/languages/csharp.nix index a9708cae..0740a779 100644 --- a/modules/plugins/languages/csharp.nix +++ b/modules/plugins/languages/csharp.nix @@ -126,11 +126,27 @@ AutomaticWorkspaceInit = true; }; }; + + roslyn_ls = { + cmd = mkLuaInline '' + { + ${toLuaObject (getExe pkgs.roslyn-ls)}, + '--logLevel=Warning', + '--extensionLogDirectory=' .. vim.fs.dirname(vim.lsp.get_log_path()), + '--stdio', + } + ''; + + filetypes = ["cs"]; + root_markers = [".sln" ".csproj" ".editorconfig"]; + init_options = {}; + }; }; extraServerPlugins = { omnisharp = ["omnisharp-extended-lsp-nvim"]; csharp_ls = ["csharpls-extended-lsp-nvim"]; + roslyn_ls = []; }; cfg = config.vim.languages.csharp; From 15b9e653688caf557e1b6a84306b4078d75d8cef Mon Sep 17 00:00:00 2001 From: Cool-Game-Dev Date: Tue, 12 Aug 2025 13:47:28 -0500 Subject: [PATCH 081/109] add release notes entry Add entry for roslyn-ls to the release notes. --- docs/release-notes/rl-0.8.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index 367cd835..cc2df92e 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -477,5 +477,8 @@ [Cool-Game-Dev](https://github.com/Cool-Game-Dev): [just-lsp]: https://github.com/terror/just-lsp +[roslyn-ls]: https://github.com/dotnet/vscode-csharp - Add just support under `vim.languages.just` using [just-lsp]. + +- Add [roslyn-ls] to the `vim.languages.csharp` module. From 9eb060dde2dcd99219f3c2cfb068d7316590dbb9 Mon Sep 17 00:00:00 2001 From: Cool-Game-Dev Date: Wed, 13 Aug 2025 09:03:09 -0500 Subject: [PATCH 082/109] languages/csharp: Replace root_markers with root_dir Replace the root_markers with root_dir in roslyn_ls and omnisharp --- modules/plugins/languages/csharp.nix | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/modules/plugins/languages/csharp.nix b/modules/plugins/languages/csharp.nix index 0740a779..9e13a5ef 100644 --- a/modules/plugins/languages/csharp.nix +++ b/modules/plugins/languages/csharp.nix @@ -43,7 +43,18 @@ } ''; filetypes = ["cs" "vb"]; - root_markers = [".sln" ".csproj" "omnisharp.json" "function.json"]; + root_dir = mkLuaInline '' + function(bufnr, on_dir) + local function find_root_pattern(fname, lua_pattern) + return vim.fs.root(0, function(name, path) + return name:match(lua_pattern) + end) + end + + local fname = vim.api.nvim_buf_get_name(bufnr) + on_dir(find_root_pattern(fname, "%.sln$") or find_root_pattern(fname, "%.csproj$")) + end + ''; init_options = {}; capabilities = { workspace = { @@ -138,7 +149,18 @@ ''; filetypes = ["cs"]; - root_markers = [".sln" ".csproj" ".editorconfig"]; + root_dir = mkLuaInline '' + function(bufnr, on_dir) + local function find_root_pattern(fname, lua_pattern) + return vim.fs.root(0, function(name, path) + return name:match(lua_pattern) + end) + end + + local fname = vim.api.nvim_buf_get_name(bufnr) + on_dir(find_root_pattern(fname, "%.sln$") or find_root_pattern(fname, "%.csproj$")) + end + ''; init_options = {}; }; }; From 1f68e377228e927249e2568247fc5f6a1a0dde09 Mon Sep 17 00:00:00 2001 From: Cool-Game-Dev Date: Wed, 13 Aug 2025 13:43:57 -0500 Subject: [PATCH 083/109] languages/json: init Create the `vim.languages.json` module using `jsonls` and `jsonfmt`. --- configuration.nix | 1 + docs/release-notes/rl-0.8.md | 6 +- modules/plugins/languages/default.nix | 1 + modules/plugins/languages/json.nix | 102 ++++++++++++++++++++++++++ 4 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 modules/plugins/languages/json.nix diff --git a/configuration.nix b/configuration.nix index 537a6863..af62a944 100644 --- a/configuration.nix +++ b/configuration.nix @@ -56,6 +56,7 @@ isMaximal: { clang.enable = isMaximal; css.enable = isMaximal; html.enable = isMaximal; + json.enable = isMaximal; sql.enable = isMaximal; java.enable = isMaximal; kotlin.enable = isMaximal; diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index cc2df92e..b677ae98 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -477,8 +477,12 @@ [Cool-Game-Dev](https://github.com/Cool-Game-Dev): [just-lsp]: https://github.com/terror/just-lsp -[roslyn-ls]: https://github.com/dotnet/vscode-csharp +[roslyn-ls]: https://github.com/dotnet/vscode-csharp +[jsonls]: https://github.com/microsoft/vscode/tree/1.101.2/extensions/json-language-features/server +[jsonfmt]: https://github.com/caarlos0/jsonfmt - Add just support under `vim.languages.just` using [just-lsp]. - Add [roslyn-ls] to the `vim.languages.csharp` module. + +- Added json support under `vim.languages.json` using [jsonls] and [jsonfmt]. diff --git a/modules/plugins/languages/default.nix b/modules/plugins/languages/default.nix index 803c076c..f9bd9968 100644 --- a/modules/plugins/languages/default.nix +++ b/modules/plugins/languages/default.nix @@ -21,6 +21,7 @@ in { ./html.nix ./haskell.nix ./java.nix + ./json.nix ./lua.nix ./markdown.nix ./nim.nix diff --git a/modules/plugins/languages/json.nix b/modules/plugins/languages/json.nix new file mode 100644 index 00000000..1aa502e8 --- /dev/null +++ b/modules/plugins/languages/json.nix @@ -0,0 +1,102 @@ +{ + config, + pkgs, + lib, + ... +}: let + inherit (builtins) attrNames; + inherit (lib.options) mkOption mkEnableOption; + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf mkMerge; + inherit (lib.types) enum package; + inherit (lib.nvim.types) mkGrammarOption singleOrListOf; + inherit (lib.nvim.attrsets) mapListToAttrs; + + cfg = config.vim.languages.json; + + defaultServers = ["jsonls"]; + servers = { + jsonls = { + cmd = [(getExe pkgs.vscode-json-languageserver) "--stdio"]; + filetypes = ["json" "jsonc"]; + init_options = {provideFormatter = true;}; + root_markers = [".git"]; + }; + }; + + defaultFormat = "jsonfmt"; + + formats = { + jsonfmt = { + package = pkgs.writeShellApplication { + name = "jsonfmt"; + runtimeInputs = [pkgs.jsonfmt]; + text = '' + jsonfmt -w - + ''; + }; + }; + }; +in { + options.vim.languages.json = { + enable = mkEnableOption "JSON langauge support"; + + treesitter = { + enable = mkEnableOption "JSON treesitter" // {default = config.vim.languages.enableTreesitter;}; + + package = mkGrammarOption pkgs "json"; + }; + + lsp = { + enable = mkEnableOption "JSON LSP support" // {default = config.vim.lsp.enable;}; + + servers = mkOption { + type = singleOrListOf (enum (attrNames servers)); + default = defaultServers; + description = "JSON LSP server to use"; + }; + }; + + format = { + enable = mkEnableOption "JSON formatting" // {default = config.vim.languages.enableFormat;}; + + type = mkOption { + description = "JSON formatter to use"; + type = enum (attrNames formats); + default = defaultFormat; + }; + + package = mkOption { + description = "JSON formatter package"; + type = package; + default = formats.${cfg.format.type}.package; + }; + }; + }; + + config = mkIf cfg.enable (mkMerge [ + (mkIf cfg.treesitter.enable { + vim.treesitter.enable = true; + vim.treesitter.grammars = [cfg.treesitter.package]; + }) + + (mkIf cfg.lsp.enable { + vim.lsp.servers = + mapListToAttrs (name: { + inherit name; + value = servers.${name}; + }) + cfg.lsp.servers; + }) + + (mkIf cfg.format.enable { + vim.formatter.conform-nvim = { + enable = true; + setupOpts.formatters_by_ft.json = [cfg.format.type]; + setupOpts.formatters.${cfg.format.type} = { + command = getExe cfg.format.package; + }; + }; + }) + ]); +} From fa10b2341ddc9e526faa8fe9a5c88c0c857f1098 Mon Sep 17 00:00:00 2001 From: Poseidon Date: Wed, 13 Aug 2025 15:12:18 -0500 Subject: [PATCH 084/109] languages/json: remove unessesary multiline Remove unnecessary multiline string in `writeShellApplication`. Co-authored-by: raf --- modules/plugins/languages/json.nix | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/plugins/languages/json.nix b/modules/plugins/languages/json.nix index 1aa502e8..cd3ae17f 100644 --- a/modules/plugins/languages/json.nix +++ b/modules/plugins/languages/json.nix @@ -31,9 +31,7 @@ package = pkgs.writeShellApplication { name = "jsonfmt"; runtimeInputs = [pkgs.jsonfmt]; - text = '' - jsonfmt -w - - ''; + text = "jsonfmt -w -"; }; }; }; From dbd395ad01040aacfa626cd0067b385dbeb57083 Mon Sep 17 00:00:00 2001 From: Cool-Game-Dev Date: Thu, 14 Aug 2025 09:10:25 -0500 Subject: [PATCH 085/109] languages/json: fix fix failing CI Make fixes to stop the JSON module from failing CI. --- modules/plugins/languages/json.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/plugins/languages/json.nix b/modules/plugins/languages/json.nix index cd3ae17f..2c426a23 100644 --- a/modules/plugins/languages/json.nix +++ b/modules/plugins/languages/json.nix @@ -6,7 +6,7 @@ }: let inherit (builtins) attrNames; inherit (lib.options) mkOption mkEnableOption; - inherit (lib.meta) getExe; + inherit (lib.meta) getExe' getExe; inherit (lib.modules) mkIf mkMerge; inherit (lib.types) enum package; inherit (lib.nvim.types) mkGrammarOption singleOrListOf; @@ -17,7 +17,7 @@ defaultServers = ["jsonls"]; servers = { jsonls = { - cmd = [(getExe pkgs.vscode-json-languageserver) "--stdio"]; + cmd = [(getExe' "vscode-json-languageserver" pkgs.vscode-langservers-extracted) "--stdio"]; filetypes = ["json" "jsonc"]; init_options = {provideFormatter = true;}; root_markers = [".git"]; @@ -37,7 +37,7 @@ }; in { options.vim.languages.json = { - enable = mkEnableOption "JSON langauge support"; + enable = mkEnableOption "JSON language support"; treesitter = { enable = mkEnableOption "JSON treesitter" // {default = config.vim.languages.enableTreesitter;}; From 6efced0652158a2dc75b9db0f151515c2a9259f0 Mon Sep 17 00:00:00 2001 From: Cool-Game-Dev Date: Thu, 14 Aug 2025 09:22:13 -0500 Subject: [PATCH 086/109] languages/json: correct getExe' usage --- modules/plugins/languages/json.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/plugins/languages/json.nix b/modules/plugins/languages/json.nix index 2c426a23..26349710 100644 --- a/modules/plugins/languages/json.nix +++ b/modules/plugins/languages/json.nix @@ -17,7 +17,7 @@ defaultServers = ["jsonls"]; servers = { jsonls = { - cmd = [(getExe' "vscode-json-languageserver" pkgs.vscode-langservers-extracted) "--stdio"]; + cmd = [(getExe' pkgs.vscode-langservers-extracted "vscode-json-languageserver") "--stdio"]; filetypes = ["json" "jsonc"]; init_options = {provideFormatter = true;}; root_markers = [".git"]; From 2ab26691433e9c58c092ff2d6ed1729ed445fd2e Mon Sep 17 00:00:00 2001 From: Cool-Game-Dev Date: Wed, 13 Aug 2025 17:33:54 -0500 Subject: [PATCH 087/109] languages/html: add advanced support Add advanced features to the `vim.languages.html` module, including lsp, formatting, and extra diagnostics. --- docs/release-notes/rl-0.8.md | 5 ++ modules/plugins/languages/html.nix | 110 ++++++++++++++++++++++++++++- 2 files changed, 112 insertions(+), 3 deletions(-) diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index b677ae98..8032d719 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -480,9 +480,14 @@ [roslyn-ls]: https://github.com/dotnet/vscode-csharp [jsonls]: https://github.com/microsoft/vscode/tree/1.101.2/extensions/json-language-features/server [jsonfmt]: https://github.com/caarlos0/jsonfmt +[superhtml]: https://github.com/kristoff-it/superhtml +[htmlHTML]: https://github.com/htmlhint/HTMLHint - Add just support under `vim.languages.just` using [just-lsp]. - Add [roslyn-ls] to the `vim.languages.csharp` module. - Added json support under `vim.languages.json` using [jsonls] and [jsonfmt]. + +- Added advanced HTML support with [superhtml] for lsp and formatting and + [htmlHINT] for diagnostics. diff --git a/modules/plugins/languages/html.nix b/modules/plugins/languages/html.nix index 0bef2767..37227918 100644 --- a/modules/plugins/languages/html.nix +++ b/modules/plugins/languages/html.nix @@ -4,14 +4,53 @@ lib, ... }: let + inherit (builtins) attrNames; + inherit (lib.meta) getExe; inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) bool; + inherit (lib.types) bool enum package; inherit (lib.lists) optional; - inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.types) mkGrammarOption diagnostics singleOrListOf; inherit (lib.nvim.dag) entryAnywhere; + inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.html; + + defaultServers = ["superhtml"]; + servers = { + superhtml = { + cmd = [(getExe pkgs.superhtml) "lsp"]; + filetypes = ["html" "shtml" "htm"]; + root_markers = ["index.html" ".git"]; + }; + }; + + defaultFormat = "superhtml"; + formats = { + superhtml = { + package = pkgs.writeShellApplication { + name = "superhtml_fmt"; + runtimeInputs = [pkgs.superhtml]; + text = "superhtml fmt -"; + }; + }; + }; + + defaultDiagnosticsProvider = ["htmlhint"]; + diagnosticsProviders = { + htmlhint = { + package = pkgs.htmlhint; + nullConfig = pkg: '' + table.insert( + ls_sources, + null_ls.builtins.diagnostics.htmlhint.with({ + command = "${pkg}/bin/htmlhint" + }) + ) + ''; + }; + }; + in { options.vim.languages.html = { enable = mkEnableOption "HTML language support"; @@ -24,8 +63,43 @@ in { default = true; }; }; - }; + lsp = { + enable = mkEnableOption "HTML LSP support" // {default = config.vim.lsp.enable;}; + servers = mkOption { + type = singleOrListOf (enum (attrNames servers)); + default = defaultServers; + description = "HTML LSP server to use"; + }; + }; + + format = { + enable = mkEnableOption "HTML formatting" // {default = config.vim.languages.enableFormat;}; + + type = mkOption { + description = "HTML formatter to use"; + type = enum (attrNames formats); + default = defaultFormat; + }; + + package = mkOption { + description = "HTML formatter package"; + type = package; + default = formats.${cfg.format.type}.package; + }; + }; + + extraDiagnostics = { + enable = mkEnableOption "extra HTML diagnostics" // {default = config.vim.languages.enableExtraDiagnostics;}; + + types = diagnostics { + langDesc = "HTML"; + inherit diagnosticsProviders; + inherit defaultDiagnosticsProvider; + }; + }; + }; + config = mkIf cfg.enable (mkMerge [ (mkIf cfg.treesitter.enable { vim = { @@ -41,5 +115,35 @@ in { ''); }; }) + + (mkIf cfg.lsp.enable { + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; + }) + + (mkIf (cfg.format.enable && !cfg.lsp.enable) { + vim.formatter.conform-nvim = { + enable = true; + setupOpts.formatters_by_ft.html = [cfg.format.type]; + setupOpts.formatters.${cfg.format.type} = { + command = getExe cfg.format.package; + }; + }; + }) + + (mkIf cfg.extraDiagnostics.enable { + vim.diagnostics.nvim-lint = { + enable = true; + linters_by_ft.html = cfg.extraDiagnostics.types; + linters = mkMerge (map (name: { + ${name}.cmd = getExe diagnosticsProviders.${name}.package; + }) + cfg.extraDiagnostics.types); + }; + }) ]); } From 3aadd2f3ced2340fdd7ef3c00b9e8ad8523a08b4 Mon Sep 17 00:00:00 2001 From: Cool-Game-Dev Date: Wed, 13 Aug 2025 19:53:41 -0500 Subject: [PATCH 088/109] languages/html: remove null_ls usage Remove usage of null_ls and replace it with new standards. --- modules/plugins/languages/html.nix | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/modules/plugins/languages/html.nix b/modules/plugins/languages/html.nix index 37227918..96dc9472 100644 --- a/modules/plugins/languages/html.nix +++ b/modules/plugins/languages/html.nix @@ -35,22 +35,13 @@ }; }; }; - + defaultDiagnosticsProvider = ["htmlhint"]; diagnosticsProviders = { htmlhint = { - package = pkgs.htmlhint; - nullConfig = pkg: '' - table.insert( - ls_sources, - null_ls.builtins.diagnostics.htmlhint.with({ - command = "${pkg}/bin/htmlhint" - }) - ) - ''; + config.cmd = getExe pkgs.htmlhint; }; }; - in { options.vim.languages.html = { enable = mkEnableOption "HTML language support"; @@ -91,7 +82,7 @@ in { extraDiagnostics = { enable = mkEnableOption "extra HTML diagnostics" // {default = config.vim.languages.enableExtraDiagnostics;}; - + types = diagnostics { langDesc = "HTML"; inherit diagnosticsProviders; @@ -99,7 +90,7 @@ in { }; }; }; - + config = mkIf cfg.enable (mkMerge [ (mkIf cfg.treesitter.enable { vim = { @@ -117,7 +108,7 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = + vim.lsp.servers = mapListToAttrs (n: { name = n; value = servers.${n}; @@ -140,9 +131,9 @@ in { enable = true; linters_by_ft.html = cfg.extraDiagnostics.types; linters = mkMerge (map (name: { - ${name}.cmd = getExe diagnosticsProviders.${name}.package; - }) - cfg.extraDiagnostics.types); + ${name} = diagnosticsProviders.${name}.config; + }) + cfg.extraDiagnostics.types); }; }) ]); From add8d82c78c55d9f1697274e0514aacaef8ace1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Fortunato?= Date: Sat, 16 Aug 2025 22:31:40 +0200 Subject: [PATCH 089/109] languages/elixir: add HEEx and EEx treesitter grammars --- docs/release-notes/rl-0.8.md | 5 +++++ modules/plugins/languages/elixir.nix | 8 +++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index b677ae98..09b37878 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -486,3 +486,8 @@ - Add [roslyn-ls] to the `vim.languages.csharp` module. - Added json support under `vim.languages.json` using [jsonls] and [jsonfmt]. + +[Morsicus](https://github.com/Morsicus): + +- Add [EEx Treesitter Grammar](https://github.com/connorlay/tree-sitter-eex) for Elixir +- Add [HEEx Treesitter Grammar](https://github.com/phoenixframework/tree-sitter-heex) for Elixir diff --git a/modules/plugins/languages/elixir.nix b/modules/plugins/languages/elixir.nix index 20d6c668..12c8a517 100644 --- a/modules/plugins/languages/elixir.nix +++ b/modules/plugins/languages/elixir.nix @@ -56,6 +56,8 @@ in { treesitter = { enable = mkEnableOption "Elixir treesitter" // {default = config.vim.languages.enableTreesitter;}; package = mkGrammarOption pkgs "elixir"; + heexPackage = mkGrammarOption pkgs "heex"; + eexPackage = mkGrammarOption pkgs "eex"; }; lsp = { @@ -91,7 +93,11 @@ in { config = mkIf cfg.enable (mkMerge [ (mkIf cfg.treesitter.enable { vim.treesitter.enable = true; - vim.treesitter.grammars = [cfg.treesitter.package]; + vim.treesitter.grammars = [ + cfg.treesitter.package + cfg.treesitter.heexPackage + cfg.treesitter.eexPackage + ]; }) (mkIf cfg.lsp.enable { From b6ecc7f19c159f69ae1a000fa2c6a105f99df18c Mon Sep 17 00:00:00 2001 From: Poseidon Date: Sun, 17 Aug 2025 17:22:31 -0500 Subject: [PATCH 090/109] languages/html: reorder parameters for consistency --- modules/plugins/languages/html.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/plugins/languages/html.nix b/modules/plugins/languages/html.nix index 96dc9472..bcc6b842 100644 --- a/modules/plugins/languages/html.nix +++ b/modules/plugins/languages/html.nix @@ -49,9 +49,9 @@ in { enable = mkEnableOption "HTML treesitter support" // {default = config.vim.languages.enableTreesitter;}; package = mkGrammarOption pkgs "html"; autotagHtml = mkOption { - description = "Enable autoclose/autorename of html tags (nvim-ts-autotag)"; type = bool; default = true; + description = "Enable autoclose/autorename of html tags (nvim-ts-autotag)"; }; }; @@ -68,15 +68,15 @@ in { enable = mkEnableOption "HTML formatting" // {default = config.vim.languages.enableFormat;}; type = mkOption { - description = "HTML formatter to use"; type = enum (attrNames formats); default = defaultFormat; + description = "HTML formatter to use"; }; package = mkOption { - description = "HTML formatter package"; type = package; default = formats.${cfg.format.type}.package; + description = "HTML formatter package"; }; }; From b7d321fd88c674ec82d293dd3b51066f7aa1df0c Mon Sep 17 00:00:00 2001 From: Poseidon Date: Wed, 20 Aug 2025 01:19:57 -0500 Subject: [PATCH 091/109] binds/qmk: init (#1083) * binds/qmk: init Create the `vim.binds.qmk` module with `enable` and `setupOpts`. * Clean up release notes Add consistent style and formatting to release notes Co-authored-by: raf * Clean up release notes (again) * binks/qmk: remove unneeded function * binds/qmk: Rename to `vim.utility.qmk` Move the `vim.binds.qmk` module to `vim.utility.qmk`. * utility/qmk: add defaults and asserts Add default values and assertions for required options. * utility/qmk: rename to utility/qmk-nvim * utility/qmk-nvim: improve assertion readability * utility/qmk-nvim: Fix links broken in module rename * Fix release notes * Add final newline to release notes --------- Co-authored-by: raf --- configuration.nix | 1 + docs/release-notes/rl-0.8.md | 11 ++--- modules/plugins/utility/default.nix | 1 + modules/plugins/utility/qmk-nvim/config.nix | 36 ++++++++++++++ modules/plugins/utility/qmk-nvim/default.nix | 6 +++ modules/plugins/utility/qmk-nvim/qmk-nvim.nix | 49 +++++++++++++++++++ npins/sources.json | 13 +++++ 7 files changed, 111 insertions(+), 6 deletions(-) create mode 100644 modules/plugins/utility/qmk-nvim/config.nix create mode 100644 modules/plugins/utility/qmk-nvim/default.nix create mode 100644 modules/plugins/utility/qmk-nvim/qmk-nvim.nix diff --git a/configuration.nix b/configuration.nix index af62a944..a2a337fd 100644 --- a/configuration.nix +++ b/configuration.nix @@ -192,6 +192,7 @@ isMaximal: { vim-wakatime.enable = false; diffview-nvim.enable = true; yanky-nvim.enable = false; + qmk-nvim.enable = false; # requires hardware specific options icon-picker.enable = isMaximal; surround.enable = isMaximal; leetcode-nvim.enable = isMaximal; diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index 8032d719..61a13533 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -482,12 +482,11 @@ [jsonfmt]: https://github.com/caarlos0/jsonfmt [superhtml]: https://github.com/kristoff-it/superhtml [htmlHTML]: https://github.com/htmlhint/HTMLHint +[qmk-nvim]: https://github.com/codethread/qmk.nvim - Add just support under `vim.languages.just` using [just-lsp]. - - Add [roslyn-ls] to the `vim.languages.csharp` module. - -- Added json support under `vim.languages.json` using [jsonls] and [jsonfmt]. - -- Added advanced HTML support with [superhtml] for lsp and formatting and - [htmlHINT] for diagnostics. +- Add JSON support under `vim.languages.json` using [jsonls] and [jsonfmt]. +- Add advanced HTML support under `vim.languages.html` using [superhtml] and + [htmlHINT]. +- Add QMK support under `vim.utility.qmk-nvim` via [qmk-nvim]. diff --git a/modules/plugins/utility/default.nix b/modules/plugins/utility/default.nix index 8069b6c1..b49ef0b6 100644 --- a/modules/plugins/utility/default.nix +++ b/modules/plugins/utility/default.nix @@ -18,6 +18,7 @@ ./oil-nvim ./outline ./preview + ./qmk-nvim ./sleuth ./smart-splits ./snacks-nvim diff --git a/modules/plugins/utility/qmk-nvim/config.nix b/modules/plugins/utility/qmk-nvim/config.nix new file mode 100644 index 00000000..c86a483a --- /dev/null +++ b/modules/plugins/utility/qmk-nvim/config.nix @@ -0,0 +1,36 @@ +{ + config, + lib, + ... +}: let + inherit (lib.modules) mkIf; + inherit (lib.nvim.lua) toLuaObject; + inherit (lib.nvim.dag) entryAfter; + + cfg = config.vim.utility.qmk-nvim; +in { + config = mkIf cfg.enable { + vim = { + startPlugins = ["qmk-nvim"]; + + pluginRC.qmk-nvim = entryAfter ["nvim-notify"] '' + require('qmk').setup(${toLuaObject cfg.setupOpts}) + ''; + }; + + assertions = [ + { + assertion = cfg.setupOpts.variant == "qmk" && cfg.setupOpts.comment_preview.position != "inside"; + message = "comment_preview.position can only be set to inside when using the qmk layoyt"; + } + { + assertion = cfg.setupOpts.name != null; + message = "qmk-nvim requires 'vim.utility.qmk.setupOpts.name' to be set."; + } + { + assertion = cfg.setupOpts.layout != null; + message = "qmk-nvim requires 'vim.utility.qmk.setupOpts.layout' to be set."; + } + ]; + }; +} diff --git a/modules/plugins/utility/qmk-nvim/default.nix b/modules/plugins/utility/qmk-nvim/default.nix new file mode 100644 index 00000000..4162ff2e --- /dev/null +++ b/modules/plugins/utility/qmk-nvim/default.nix @@ -0,0 +1,6 @@ +{ + imports = [ + ./config.nix + ./qmk-nvim.nix + ]; +} diff --git a/modules/plugins/utility/qmk-nvim/qmk-nvim.nix b/modules/plugins/utility/qmk-nvim/qmk-nvim.nix new file mode 100644 index 00000000..2c541e64 --- /dev/null +++ b/modules/plugins/utility/qmk-nvim/qmk-nvim.nix @@ -0,0 +1,49 @@ +{lib, ...}: let + inherit (lib.options) mkOption mkEnableOption; + inherit (lib.types) attrsOf nullOr enum lines str; + inherit (lib.nvim.types) mkPluginSetupOption; +in { + options.vim.utility.qmk-nvim = { + enable = mkEnableOption "QMK and ZMK keymaps in nvim"; + + setupOpts = mkPluginSetupOption "qmk.nvim" { + name = mkOption { + type = nullOr str; + default = null; + description = "The name of the layout"; + }; + + layout = mkOption { + type = nullOr lines; + default = null; + description = '' + The keyboard key layout + see for more details + ''; + }; + + variant = mkOption { + type = enum ["qmk" "zmk"]; + default = "qmk"; + description = "Chooses the expected hardware target"; + }; + + comment_preview = { + position = mkOption { + type = enum ["top" "bottom" "inside" "none"]; + default = "top"; + description = "Controls the position of the preview"; + }; + + keymap_overrides = mkOption { + type = attrsOf str; + default = {}; + description = '' + Key codes to text replacements + see for more details + ''; + }; + }; + }; + }; +} diff --git a/npins/sources.json b/npins/sources.json index eec2fde9..0ec503ac 100644 --- a/npins/sources.json +++ b/npins/sources.json @@ -2186,6 +2186,19 @@ "url": "https://github.com/kevinhwang91/promise-async/archive/119e8961014c9bfaf1487bf3c2a393d254f337e2.tar.gz", "hash": "0q4a0rmy09hka6zvydzjj2gcm2j5mlbrhbxfcdjj33ngpblkmqzm" }, + "qmk-nvim": { + "type": "Git", + "repository": { + "type": "GitHub", + "owner": "codethread", + "repo": "qmk.nvim" + }, + "branch": "main", + "submodules": false, + "revision": "3c804c1480991e4837514900b22b9358cfd64fa1", + "url": "https://github.com/codethread/qmk.nvim/archive/3c804c1480991e4837514900b22b9358cfd64fa1.tar.gz", + "hash": "03fsx6qsn8b36jp5m0fkdla6gkkzdv2j18y378y3cqpjclgq995a" + }, "rainbow-delimiters-nvim": { "type": "Git", "repository": { From ad0844ea533afd1b19714049bcd6e8a734cefc1f Mon Sep 17 00:00:00 2001 From: Poseidon Date: Wed, 20 Aug 2025 12:32:53 -0500 Subject: [PATCH 092/109] Fix broken release notes reference --- docs/release-notes/rl-0.8.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index 61a13533..3a9c01eb 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -481,7 +481,7 @@ [jsonls]: https://github.com/microsoft/vscode/tree/1.101.2/extensions/json-language-features/server [jsonfmt]: https://github.com/caarlos0/jsonfmt [superhtml]: https://github.com/kristoff-it/superhtml -[htmlHTML]: https://github.com/htmlhint/HTMLHint +[htmlHINT]: https://github.com/htmlhint/HTMLHint [qmk-nvim]: https://github.com/codethread/qmk.nvim - Add just support under `vim.languages.just` using [just-lsp]. From 21f4644e311c05e9f32782c63d857c72d25e1234 Mon Sep 17 00:00:00 2001 From: Poseidon Date: Thu, 21 Aug 2025 01:50:42 -0400 Subject: [PATCH 093/109] languages/qml: init (#1092) * languages/qml: init Create the qml language module with treesitting, lsp, and formatting * Fix release notes module name --- configuration.nix | 1 + docs/release-notes/rl-0.8.md | 3 + modules/plugins/languages/default.nix | 1 + modules/plugins/languages/qml.nix | 98 +++++++++++++++++++++++++++ 4 files changed, 103 insertions(+) create mode 100644 modules/plugins/languages/qml.nix diff --git a/configuration.nix b/configuration.nix index a2a337fd..99537987 100644 --- a/configuration.nix +++ b/configuration.nix @@ -89,6 +89,7 @@ isMaximal: { ruby.enable = false; fsharp.enable = false; just.enable = false; + qml.enable = false; tailwind.enable = false; svelte.enable = false; diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index 3a9c01eb..5a7a1b3c 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -483,6 +483,8 @@ [superhtml]: https://github.com/kristoff-it/superhtml [htmlHINT]: https://github.com/htmlhint/HTMLHint [qmk-nvim]: https://github.com/codethread/qmk.nvim +[qmlls]: https://doc.qt.io/qt-6/qtqml-tooling-qmlls.html +[qmlformat]: https://doc.qt.io/qt-6/qtqml-tooling-qmlformat.html - Add just support under `vim.languages.just` using [just-lsp]. - Add [roslyn-ls] to the `vim.languages.csharp` module. @@ -490,3 +492,4 @@ - Add advanced HTML support under `vim.languages.html` using [superhtml] and [htmlHINT]. - Add QMK support under `vim.utility.qmk-nvim` via [qmk-nvim]. +- Add QML support under `vim.languages.qml` using [qmlls] and [qmlformat] diff --git a/modules/plugins/languages/default.nix b/modules/plugins/languages/default.nix index f9bd9968..fd45758f 100644 --- a/modules/plugins/languages/default.nix +++ b/modules/plugins/languages/default.nix @@ -30,6 +30,7 @@ in { ./ocaml.nix ./php.nix ./python.nix + ./qml.nix ./r.nix ./rust.nix ./scala.nix diff --git a/modules/plugins/languages/qml.nix b/modules/plugins/languages/qml.nix new file mode 100644 index 00000000..6750a55a --- /dev/null +++ b/modules/plugins/languages/qml.nix @@ -0,0 +1,98 @@ +{ + config, + pkgs, + lib, + ... +}: let + inherit (builtins) attrNames; + inherit (lib.meta) getExe getExe'; + inherit (lib.options) mkEnableOption mkOption; + inherit (lib.modules) mkIf mkMerge; + inherit (lib.types) enum package; + inherit (lib.nvim.types) mkGrammarOption singleOrListOf; + inherit (lib.nvim.attrsets) mapListToAttrs; + + cfg = config.vim.languages.qml; + + qmlPackage = pkgs.kdePackages.qtdeclarative; + + defaultServers = ["qmlls"]; + servers = { + qmlls = { + cmd = [(getExe' qmlPackage "qmlls")]; + filetypes = ["qml" "qmljs"]; + rootmarkers = [".git"]; + }; + }; + + defaultFormat = "qmlformat"; + formats = { + qmlformat = { + package = pkgs.writeShellApplication { + name = "qmlformat"; + runtimeInputs = [qmlPackage]; + text = "qmlformat -"; + }; + }; + }; +in { + options.vim.languages.qml = { + enable = mkEnableOption "QML language support"; + treesitter = { + enable = mkEnableOption "QML treesitter support" // {default = config.vim.languages.enableTreesitter;}; + package = mkGrammarOption pkgs "qmljs"; + }; + + lsp = { + enable = mkEnableOption "QML LSP support" // {default = config.vim.lsp.enable;}; + servers = mkOption { + type = singleOrListOf (enum (attrNames servers)); + default = defaultServers; + description = "QML LSP server to use"; + }; + }; + + format = { + enable = mkEnableOption "QML formatting" // {default = config.vim.languages.enableFormat;}; + + type = mkOption { + type = enum (attrNames formats); + default = defaultFormat; + description = "QML formatter to use"; + }; + + package = mkOption { + type = package; + default = formats.${cfg.format.type}.package; + description = "QML formatter package"; + }; + }; + }; + + config = mkIf cfg.enable (mkMerge [ + (mkIf cfg.treesitter.enable { + vim.treesitter = { + enable = true; + grammars = [cfg.treesitter.package]; + }; + }) + (mkIf cfg.lsp.enable { + vim.lsp.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; + }) + + (mkIf (cfg.format.enable && !cfg.lsp.enable) { + vim.formatter.conform-nvim = { + enable = true; + setupOpts.formatters_by_ft.qml = [cfg.format.type]; + setupOpts.formatters.${cfg.format.type} = { + command = getExe cfg.format.package; + }; + }; + }) + ]); +} From 1f65e589bf2437b73a515235fc5f0122536aa3fd Mon Sep 17 00:00:00 2001 From: rice-cracker-dev Date: Thu, 21 Aug 2025 18:47:09 +0700 Subject: [PATCH 094/109] languages/svelte: fix svelte-language-server not reloading .js/.ts files on change --- docs/release-notes/rl-0.8.md | 2 +- modules/plugins/languages/svelte.nix | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index e5d409c5..6b1b6369 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -319,6 +319,7 @@ - Add global function `nvf_lint` under `vim.diagnostics.nvim-lint.lint_function`. - Deprecate `vim.scrollOffset` in favor of `vim.options.scrolloff`. +- Fix `svelte-language-server` not reloading .js/.ts files on change. [Sc3l3t0n](https://github.com/Sc3l3t0n): @@ -480,7 +481,6 @@ [soliprem](https://github.com/soliprem): - - fix broken `neorg` grammars - remove obsolete warning in the `otter` module diff --git a/modules/plugins/languages/svelte.nix b/modules/plugins/languages/svelte.nix index 42e6d320..301a51d7 100644 --- a/modules/plugins/languages/svelte.nix +++ b/modules/plugins/languages/svelte.nix @@ -33,6 +33,15 @@ ''; 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', From a5ef2d032d3c1985a6d9bd22dd19c8e22685b440 Mon Sep 17 00:00:00 2001 From: Poseidon Date: Thu, 21 Aug 2025 15:31:52 -0400 Subject: [PATCH 095/109] docs: fixup release notes from main -> v0.8 merge (#1098) * Merge seperate sections for 'Cool-Game-Dev' Merge separate release notes sections for `Cool-Game-Dev` * Rename `Cool-Game-Dev` to `Poseidon` in release notes I have changed my username since I started contributing, this fixes the username link and display text. --- docs/release-notes/rl-0.8.md | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index 6b1b6369..6136705d 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -484,21 +484,15 @@ - fix broken `neorg` grammars - remove obsolete warning in the `otter` module -[Cool-Game-Dev](https://github.com/Cool-Game-Dev): - -[nvim-biscuits]: https://github.com/code-biscuits/nvim-biscuits - -- Add [nvim-biscuits] to show block context. Available at - `vim.utility.nvim-biscuits`. - [JManch](https://github.com/JManch): - Fix default [blink.cmp] sources "path" and "buffer" not working when `autocomplete.nvim-cmp.enable` was disabled and `autocomplete.nvim-cmp.sources` had not been modified. -[Cool-Game-Dev](https://github.com/Cool-Game-Dev): +[Poseidon](https://github.com/poseidon-rises): +[nvim-biscuits]: https://github.com/code-biscuits/nvim-biscuits [just-lsp]: https://github.com/terror/just-lsp [roslyn-ls]: https://github.com/dotnet/vscode-csharp [jsonls]: https://github.com/microsoft/vscode/tree/1.101.2/extensions/json-language-features/server @@ -509,6 +503,7 @@ [qmlls]: https://doc.qt.io/qt-6/qtqml-tooling-qmlls.html [qmlformat]: https://doc.qt.io/qt-6/qtqml-tooling-qmlformat.html +- Add [nvim-biscuits] support under `vim.utility.nvim-biscuits`. - Add just support under `vim.languages.just` using [just-lsp]. - Add [roslyn-ls] to the `vim.languages.csharp` module. - Add JSON support under `vim.languages.json` using [jsonls] and [jsonfmt]. From 8f28e4627dc86992d641a8edddc6eea31e44dd33 Mon Sep 17 00:00:00 2001 From: Poseidon Date: Thu, 21 Aug 2025 15:40:57 -0400 Subject: [PATCH 096/109] docs: add missing period to release notes --- docs/release-notes/rl-0.8.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index 6b1b6369..f1c4ded0 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -515,4 +515,4 @@ - Add advanced HTML support under `vim.languages.html` using [superhtml] and [htmlHINT]. - Add QMK support under `vim.utility.qmk-nvim` via [qmk-nvim]. -- Add QML support under `vim.languages.qml` using [qmlls] and [qmlformat] +- Add QML support under `vim.languages.qml` using [qmlls] and [qmlformat]. From c8bb625a887ed07911569e7869ceaee468da6abf Mon Sep 17 00:00:00 2001 From: diced Date: Tue, 12 Aug 2025 19:43:36 -0700 Subject: [PATCH 097/109] languages/ts: add typescript treesitter grammar --- modules/plugins/languages/ts.nix | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/modules/plugins/languages/ts.nix b/modules/plugins/languages/ts.nix index 9f15ff24..40e598ae 100644 --- a/modules/plugins/languages/ts.nix +++ b/modules/plugins/languages/ts.nix @@ -219,7 +219,8 @@ in { treesitter = { enable = mkEnableOption "Typescript/Javascript treesitter" // {default = config.vim.languages.enableTreesitter;}; - tsPackage = mkGrammarOption pkgs "tsx"; + tsPackage = mkGrammarOption pkgs "typescript"; + tsxPackage = mkGrammarOption pkgs "tsx"; jsPackage = mkGrammarOption pkgs "javascript"; }; @@ -283,7 +284,11 @@ in { config = mkIf cfg.enable (mkMerge [ (mkIf cfg.treesitter.enable { vim.treesitter.enable = true; - vim.treesitter.grammars = [cfg.treesitter.tsPackage cfg.treesitter.jsPackage]; + vim.treesitter.grammars = [ + cfg.treesitter.tsPackage + cfg.treesitter.tsxPackage + cfg.treesitter.jsPackage + ]; }) (mkIf cfg.lsp.enable { From 77c642935d67aa61977e5dc8840afa6c0f67d6a3 Mon Sep 17 00:00:00 2001 From: diced Date: Tue, 12 Aug 2025 19:50:24 -0700 Subject: [PATCH 098/109] docs(rl): add ts treesitter fix entry --- docs/release-notes/rl-0.8.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index 20140624..7c92ee80 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -517,3 +517,8 @@ - Add [EEx Treesitter Grammar](https://github.com/connorlay/tree-sitter-eex) for Elixir - Add [HEEx Treesitter Grammar](https://github.com/phoenixframework/tree-sitter-heex) for Elixir + +[diced](https://github.com/diced): + +- Fixed `typescript` treesitter grammar not being included by default. + From f119298d10063d733e32d1c23462e0dbea37c768 Mon Sep 17 00:00:00 2001 From: Ching Pei Yang Date: Sun, 24 Aug 2025 23:43:54 +0200 Subject: [PATCH 099/109] docs: fix formatting --- docs/release-notes/rl-0.8.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index 7c92ee80..041266f0 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -515,10 +515,12 @@ [Morsicus](https://github.com/Morsicus): -- Add [EEx Treesitter Grammar](https://github.com/connorlay/tree-sitter-eex) for Elixir -- Add [HEEx Treesitter Grammar](https://github.com/phoenixframework/tree-sitter-heex) for Elixir +- Add [EEx Treesitter Grammar](https://github.com/connorlay/tree-sitter-eex) for + Elixir +- Add + [HEEx Treesitter Grammar](https://github.com/phoenixframework/tree-sitter-heex) + for Elixir [diced](https://github.com/diced): - Fixed `typescript` treesitter grammar not being included by default. - From c390d28c8aab3e3f572fbbe24f4e106573f54df0 Mon Sep 17 00:00:00 2001 From: Ching Pei Yang Date: Sun, 24 Aug 2025 23:58:05 +0200 Subject: [PATCH 100/109] docs: remove outdated mention of null-ls --- docs/manual/configuring/languages.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/manual/configuring/languages.md b/docs/manual/configuring/languages.md index 252163fb..57380d8c 100644 --- a/docs/manual/configuring/languages.md +++ b/docs/manual/configuring/languages.md @@ -1,10 +1,10 @@ # Language Support {#ch-languages} Language specific support means there is a combination of language specific -plugins, `treesitter` support, `nvim-lspconfig` language servers, and `null-ls` -integration. This gets you capabilities ranging from autocompletion to -formatting to diagnostics. The following languages have sections under the -`vim.languages` attribute. +plugins, `treesitter` support, `nvim-lspconfig` language servers, `conform-nvim` +formatters, and `nvim-lint` linter integration. This gets you capabilities +ranging from autocompletion to formatting to diagnostics. The following +languages have sections under the `vim.languages` attribute. - Rust: [vim.languages.rust.enable](#opt-vim.languages.rust.enable) - Nix: [vim.languages.nix.enable](#opt-vim.languages.nix.enable) From b88773b6480ce717bd1a86a9008db8e910ca97e7 Mon Sep 17 00:00:00 2001 From: Jamy Golden Date: Sat, 23 Aug 2025 10:22:20 +0200 Subject: [PATCH 101/109] docs: Add missing languages to manual --- docs/manual/configuring/languages.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/docs/manual/configuring/languages.md b/docs/manual/configuring/languages.md index 252163fb..208b93cc 100644 --- a/docs/manual/configuring/languages.md +++ b/docs/manual/configuring/languages.md @@ -20,6 +20,34 @@ formatting to diagnostics. The following languages have sections under the - Lua: [vim.languages.lua.enable](#opt-vim.languages.lua.enable) - PHP: [vim.languages.php.enable](#opt-vim.languages.php.enable) - F#: [vim.languages.fsharp.enable](#opt-vim.languages.fsharp.enable) +- Assembly: [vim.languages.assembly.enable](#opt-vim.languages.assembly.enable) +- Astro: [vim.languages.astro.enable](#opt-vim.languages.astro.enable) +- Bash: [vim.languages.bash.enable](#opt-vim.languages.bash.enable) +- Clang: [vim.languages.clang.enable](#opt-vim.languages.clang.enable) +- Clojure: [vim.languages.clojure.enable](#opt-vim.languages.clojure.enable) +- C#: [vim.languages.csharp.enable](#opt-vim.languages.csharp.enable) +- CSS: [vim.languages.css.enable](#opt-vim.languages.css.enable) +- CUE: [vim.languages.cue.enable](#opt-vim.languages.cue.enable) +- Elixir: [vim.languages.elixir.enable](#opt-vim.languages.elixir.enable) +- Gleam: [vim.languages.gleam.enable](#opt-vim.languages.gleam.enable) +- HCL: [vim.languages.hcl.enable](#opt-vim.languages.hcl.enable) +- Helm: [vim.languages.helm.enable](#opt-vim.languages.helm.enable) +- Julia: [vim.languages.julia.enable](#opt-vim.languages.julia.enable) +- Kotlin: [vim.languages.kotlin.enable](#opt-vim.languages.kotlin.enable) +- Nim: [vim.languages.nim.enable](#opt-vim.languages.nim.enable) +- Nu: [vim.languages.nu.enable](#opt-vim.languages.nu.enable) +- OCaml: [vim.languages.ocaml.enable](#opt-vim.languages.ocaml.enable) +- Odin: [vim.languages.odin.enable](#opt-vim.languages.odin.enable) +- R: [vim.languages.r.enable](#opt-vim.languages.r.enable) +- Ruby: [vim.languages.ruby.enable](#opt-vim.languages.ruby.enable) +- Scala: [vim.languages.scala.enable](#opt-vim.languages.scala.enable) +- Svelte: [vim.languages.svelte.enable](#opt-vim.languages.svelte.enable) +- Tailwind: [vim.languages.tailwind.enable](#opt-vim.languages.tailwind.enable) +- Terraform: [vim.languages.terraform.enable](#opt-vim.languages.terraform.enable) +- Typst: [vim.languages.typst.enable](#opt-vim.languages.typst.enable) +- Vala: [vim.languages.vala.enable](#opt-vim.languages.vala.enable) +- WGSL: [vim.languages.wgsl.enable](#opt-vim.languages.wgsl.enable) +- YAML: [vim.languages.yaml.enable](#opt-vim.languages.yaml.enable) Adding support for more languages, and improving support for existing ones are great places where you can contribute with a PR. From c752aaa24f8cb0ded413e98e3034b9535669b462 Mon Sep 17 00:00:00 2001 From: gmvar Date: Fri, 22 Aug 2025 14:56:00 -0700 Subject: [PATCH 102/109] lsp/harper-ls: init --- configuration.nix | 1 + docs/release-notes/rl-0.8.md | 6 ++++ modules/plugins/lsp/default.nix | 1 + modules/plugins/lsp/harper-ls/config.nix | 19 +++++++++++ modules/plugins/lsp/harper-ls/default.nix | 6 ++++ modules/plugins/lsp/harper-ls/harper-ls.nix | 35 +++++++++++++++++++++ 6 files changed, 68 insertions(+) create mode 100644 modules/plugins/lsp/harper-ls/config.nix create mode 100644 modules/plugins/lsp/harper-ls/default.nix create mode 100644 modules/plugins/lsp/harper-ls/harper-ls.nix diff --git a/configuration.nix b/configuration.nix index 256f0b51..750862af 100644 --- a/configuration.nix +++ b/configuration.nix @@ -31,6 +31,7 @@ isMaximal: { lspSignature.enable = !isMaximal; # conflicts with blink in maximal otter-nvim.enable = isMaximal; nvim-docs-view.enable = isMaximal; + harper-ls.enable = isMaximal; }; debugger = { diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index 041266f0..14f04b1e 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -524,3 +524,9 @@ [diced](https://github.com/diced): - Fixed `typescript` treesitter grammar not being included by default. + +[gmvar](https://github.com/gmvar): + +[harper-ls]: https://github.com/Automattic/harper + +- Add [harper-ls] to the `vim.lsp` module. diff --git a/modules/plugins/lsp/default.nix b/modules/plugins/lsp/default.nix index eb694583..ed20685d 100644 --- a/modules/plugins/lsp/default.nix +++ b/modules/plugins/lsp/default.nix @@ -7,6 +7,7 @@ ./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 new file mode 100644 index 00000000..d6e27bfc --- /dev/null +++ b/modules/plugins/lsp/harper-ls/config.nix @@ -0,0 +1,19 @@ +{ + 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"]; + cmd = [(getExe pkgs.harper) "--stdio"]; + settings = {harper-ls = cfg.harper-ls.settings;}; + }; + }; +} diff --git a/modules/plugins/lsp/harper-ls/default.nix b/modules/plugins/lsp/harper-ls/default.nix new file mode 100644 index 00000000..9b4b3ec7 --- /dev/null +++ b/modules/plugins/lsp/harper-ls/default.nix @@ -0,0 +1,6 @@ +{ + 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 new file mode 100644 index 00000000..9fab45fe --- /dev/null +++ b/modules/plugins/lsp/harper-ls/harper-ls.nix @@ -0,0 +1,35 @@ +{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"; + }; + }; +} From fe860f701b3fb335bc0fec0c85627778c07d6937 Mon Sep 17 00:00:00 2001 From: Poseidon Date: Mon, 25 Aug 2025 12:00:52 -0500 Subject: [PATCH 103/109] docs: remove duplicate release notes entry --- docs/release-notes/rl-0.8.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index 041266f0..faecdbc4 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -506,7 +506,6 @@ - Add [nvim-biscuits] support under `vim.utility.nvim-biscuits`. - Add just support under `vim.languages.just` using [just-lsp]. - Add [roslyn-ls] to the `vim.languages.csharp` module. -- Added json support under `vim.languages.json` using [jsonls] and [jsonfmt]. - Add JSON support under `vim.languages.json` using [jsonls] and [jsonfmt]. - Add advanced HTML support under `vim.languages.html` using [superhtml] and [htmlHINT]. From f6cfc3ab4beadd509548ea768927329f280fce8c Mon Sep 17 00:00:00 2001 From: Jaren Glenn Date: Tue, 26 Aug 2025 19:34:53 -0600 Subject: [PATCH 104/109] lazy: enabled option accepts luaInline instead of str Makes inline Lua enabled options evaluate to Lua instead of string literals. --- docs/release-notes/rl-0.8.md | 4 ++++ modules/wrapper/lazy/lazy.nix | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index faecdbc4..41aee57e 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -523,3 +523,7 @@ [diced](https://github.com/diced): - Fixed `typescript` treesitter grammar not being included by default. + +[derethil](https://github.com/derethil): + +- Fix `vim.lazy.plugins..enabled` Lua evaluation. diff --git a/modules/wrapper/lazy/lazy.nix b/modules/wrapper/lazy/lazy.nix index eb1f5cdf..cef54360 100644 --- a/modules/wrapper/lazy/lazy.nix +++ b/modules/wrapper/lazy/lazy.nix @@ -1,7 +1,7 @@ {lib, ...}: let inherit (lib.options) mkOption mkEnableOption; inherit (lib.types) enum listOf submodule nullOr str bool int attrsOf anything either oneOf lines; - inherit (lib.nvim.types) pluginType; + inherit (lib.nvim.types) pluginType luaInline; inherit (lib.nvim.config) mkBool; lznKeysSpec = submodule { @@ -98,7 +98,7 @@ # lz.n options enabled = mkOption { - type = nullOr (either bool str); + type = nullOr (either bool luaInline); default = null; description = "When false, or if the lua function returns false, this plugin will not be included in the spec"; }; From a360dd23154894aac01e646402db13b2a0a33a74 Mon Sep 17 00:00:00 2001 From: sjcobb Date: Thu, 28 Aug 2025 09:36:29 +0100 Subject: [PATCH 105/109] update rl notes --- docs/release-notes/rl-0.8.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index 41aee57e..78009b5f 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -111,6 +111,10 @@ - Add [hunk.nvim], Neovim plugin & tool for splitting diffs in Neovim. Available as `vim.git.hunk-nvim` +[sjcobb2022](https://github.com/sjcobb2022): + +- Migrate all current lsp configurations to `vim.lsp.server` and remove internal dependency on `nvim-lspconfig` + [amadaluzia](https://github.com/amadaluzia): [haskell-tools.nvim]: https://github.com/MrcJkb/haskell-tools.nvim From 8ab27a131e6f066e56712ac01e33ac62a111c03c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Valter=20Sch=C3=BCtz?= Date: Sat, 30 Aug 2025 12:15:38 +0200 Subject: [PATCH 106/109] languages/python: add formatter that combines `ruff format` with `ruff check --fix` (#1072) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * languages/python: add formatting option for `ruff check --fix` * docs: remove unrelated changes --------- Co-authored-by: Valter Schütz Co-authored-by: Ching Pei Yang <59727193+horriblename@users.noreply.github.com> --- docs/release-notes/rl-0.8.md | 6 ++++++ modules/plugins/languages/python.nix | 10 ++++++++++ 2 files changed, 16 insertions(+) diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index f047d72b..eb46e7e1 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -528,6 +528,12 @@ - Fixed `typescript` treesitter grammar not being included by default. +[valterschutz](https://github.com/valterschutz): + +[ruff]: (https://github.com/astral-sh/ruff) + +- Add [ruff-fix] as a formatter option in `vim.languages.python.format.type`. + [gmvar](https://github.com/gmvar): [harper-ls]: https://github.com/Automattic/harper diff --git a/modules/plugins/languages/python.nix b/modules/plugins/languages/python.nix index 6f97f70c..f4d749f4 100644 --- a/modules/plugins/languages/python.nix +++ b/modules/plugins/languages/python.nix @@ -149,6 +149,16 @@ ''; }; }; + + ruff-check = { + package = pkgs.writeShellApplication { + name = "ruff-check"; + runtimeInputs = [pkgs.ruff]; + text = '' + ruff check --fix --exit-zero - + ''; + }; + }; }; defaultDebugger = "debugpy"; From 0d2c3a600d2336ef4183878a1fb69515785ca305 Mon Sep 17 00:00:00 2001 From: Ching Pei Yang <59727193+horriblename@users.noreply.github.com> Date: Sat, 30 Aug 2025 12:22:07 +0200 Subject: [PATCH 107/109] docs: fix markdown formatting (#1117) --- docs/manual/configuring/languages.md | 3 ++- docs/release-notes/rl-0.8.md | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/manual/configuring/languages.md b/docs/manual/configuring/languages.md index 359ee324..bd2e487d 100644 --- a/docs/manual/configuring/languages.md +++ b/docs/manual/configuring/languages.md @@ -43,7 +43,8 @@ languages have sections under the `vim.languages` attribute. - Scala: [vim.languages.scala.enable](#opt-vim.languages.scala.enable) - Svelte: [vim.languages.svelte.enable](#opt-vim.languages.svelte.enable) - Tailwind: [vim.languages.tailwind.enable](#opt-vim.languages.tailwind.enable) -- Terraform: [vim.languages.terraform.enable](#opt-vim.languages.terraform.enable) +- Terraform: + [vim.languages.terraform.enable](#opt-vim.languages.terraform.enable) - Typst: [vim.languages.typst.enable](#opt-vim.languages.typst.enable) - Vala: [vim.languages.vala.enable](#opt-vim.languages.vala.enable) - WGSL: [vim.languages.wgsl.enable](#opt-vim.languages.wgsl.enable) diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index eb46e7e1..4f8e0a79 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -113,7 +113,8 @@ [sjcobb2022](https://github.com/sjcobb2022): -- Migrate all current lsp configurations to `vim.lsp.server` and remove internal dependency on `nvim-lspconfig` +- Migrate all current lsp configurations to `vim.lsp.server` and remove internal + dependency on `nvim-lspconfig` [amadaluzia](https://github.com/amadaluzia): From 64f1504c4f8dfec178c18ea24b922a47355df083 Mon Sep 17 00:00:00 2001 From: NotAShelf Date: Wed, 3 Sep 2025 14:17:31 +0300 Subject: [PATCH 108/109] lib/languages: fix typo in server submodule Signed-off-by: NotAShelf Change-Id: I6a6a6964c495ef58a9572ae93715bacf694a6ff5 --- lib/languages.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/languages.nix b/lib/languages.nix index d66880a1..899d9ea8 100644 --- a/lib/languages.nix +++ b/lib/languages.nix @@ -46,7 +46,7 @@ in { capabilities = mkOption { type = nullOr (either luaInline (attrsOf anything)); default = null; - description = "LSP capabilitiess to pass to lspconfig"; + description = "LSP capabilities to pass to LSP server configuration"; }; on_attach = mkOption { @@ -58,7 +58,7 @@ in { filetypes = mkOption { type = nullOr (listOf str); default = null; - description = "Filetypes to auto-attach LSP in"; + description = "Filetypes to auto-attach LSP server in"; }; cmd = mkOption { From 8b98f07862ddbffbfc93bb7507ffae524fcfef5c Mon Sep 17 00:00:00 2001 From: NotAShelf Date: Wed, 3 Sep 2025 14:44:46 +0300 Subject: [PATCH 109/109] wrapper/build: add option examples; put evaluated values in `literalExpression` Signed-off-by: NotAShelf Change-Id: I6a6a69648220a65886994d4cac67f634a61815d5 --- modules/wrapper/build/config.nix | 47 ++++++++++++++++++------- modules/wrapper/environment/options.nix | 22 ++++++------ 2 files changed, 44 insertions(+), 25 deletions(-) diff --git a/modules/wrapper/build/config.nix b/modules/wrapper/build/config.nix index a1807388..03c42787 100644 --- a/modules/wrapper/build/config.nix +++ b/modules/wrapper/build/config.nix @@ -22,9 +22,7 @@ passthru.vimPlugin = false; }; - # build a vim plugin with the given name and arguments - # if the plugin is nvim-treesitter, warn the user to use buildTreesitterPlug - # instead + # Build a Vim plugin with the given name and arguments. buildPlug = attrs: let pin = getPin attrs.pname; in @@ -36,6 +34,7 @@ // attrs ); + # Build a given Treesitter grammar. buildTreesitterPlug = grammars: vimPlugins.nvim-treesitter.withPlugins (_: grammars); pluginBuilders = { @@ -48,6 +47,9 @@ doCheck = false; }; + # Get plugins built from source from self.packages + # If adding a new plugin to be built from source, it must also be inherited + # here. inherit (inputs.self.packages.${pkgs.stdenv.system}) blink-cmp avante-nvim; }; @@ -71,29 +73,38 @@ # Wrap the user's desired (unwrapped) Neovim package with arguments that'll be used to # generate a wrapped Neovim package. neovim-wrapped = inputs.mnw.lib.wrap {inherit pkgs;} { + appName = "nvf"; neovim = config.vim.package; + initLua = config.vim.builtLuaConfigRC; + luaFiles = config.vim.extraLuaFiles; + + # Plugin configurations plugins = { start = buildConfigPlugins config.vim.startPlugins; opt = buildConfigPlugins config.vim.optPlugins; }; - appName = "nvf"; - extraBinPath = config.vim.extraPackages; - initLua = config.vim.builtLuaConfigRC; - luaFiles = config.vim.extraLuaFiles; + + # Providers for Neovim providers = { + ruby.enable = config.vim.withRuby; + nodeJs.enable = config.vim.withNodeJs; python3 = { enable = config.vim.withPython3; extraPackages = ps: map (flip builtins.getAttr ps) config.vim.python3Packages; }; - ruby.enable = config.vim.withRuby; - nodeJs.enable = config.vim.withNodeJs; }; + + # Aliases to link `nvim` to aliases = lib.optional config.vim.viAlias "vi" ++ lib.optional config.vim.vimAlias "vim"; + # Additional packages or Lua packages to be made available to Neovim + extraBinPath = config.vim.extraPackages; extraLuaPackages = ps: map (flip builtins.getAttr ps) config.vim.luaPackages; }; + # A store path representing the built Lua configuration. dummyInit = pkgs.writeText "nvf-init.lua" config.vim.builtLuaConfigRC; + # Additional helper scripts for printing and displaying nvf configuration # in your commandline. printConfig = pkgs.writers.writeDashBin "nvf-print-config" "cat ${dummyInit}"; @@ -106,10 +117,20 @@ paths = [neovim-wrapped printConfig printConfigPath]; postBuild = "echo Helpers added"; - # Allow evaluating config.vim, i.e., config.vim from the packages' passthru - # attribute. For example, packages.x86_64-linux.neovim.passthru.neovimConfig - # will return the configuration in full. - passthru.neovimConfig = config.vim; + passthru = { + # Allow evaluating config.vim, i.e., config.vim from the packages' passthru + # attribute. For example, packages.x86_64-linux.neovim.passthru.neovimConfig + # will return the configuration in full. + neovimConfig = config.vim; + + # Also expose the helper scripts in passthru. + nvfPrintConfig = printConfig; + nvfPrintConfigPath = printConfigPath; + + # In systems where we only have a package and no module, this can be used + # to access the built init.lua + initLua = dummyInit; + }; meta = neovim-wrapped.meta diff --git a/modules/wrapper/environment/options.nix b/modules/wrapper/environment/options.nix index c401f506..d3b28b0f 100644 --- a/modules/wrapper/environment/options.nix +++ b/modules/wrapper/environment/options.nix @@ -3,7 +3,7 @@ lib, ... }: let - inherit (lib.options) mkOption mkEnableOption literalMD; + inherit (lib.options) mkOption mkEnableOption literalMD literalExpression; inherit (lib.types) package bool str listOf attrsOf; inherit (lib.nvim.types) pluginsOpt extraPluginType; in { @@ -11,6 +11,7 @@ in { package = mkOption { type = package; default = pkgs.neovim-unwrapped; + defaultText = literalExpression "pkgs.neovim-unwrapped"; description = '' The neovim package to use for the wrapper. This corresponds to the package that will be wrapped @@ -27,21 +28,20 @@ in { viAlias = mkOption { type = bool; default = true; + example = false; description = "Enable the `vi` alias for `nvim`"; }; vimAlias = mkOption { type = bool; default = true; + example = false; description = "Enable the `vim` alias for `nvim`"; }; startPlugins = pluginsOpt { default = ["plenary-nvim"]; - example = '' - [pkgs.vimPlugins.telescope-nvim] - ''; - + example = literalExpression "[pkgs.vimPlugins.telescope-nvim]"; description = '' List of plugins to load on startup. This is used internally to add plugins to Neovim's runtime. @@ -54,9 +54,7 @@ in { optPlugins = pluginsOpt { default = []; - example = '' - [pkgs.vimPlugins.vim-ghost] - ''; + example = literalExpression "[pkgs.vimPlugins.vim-ghost]"; description = '' List of plugins to optionally load on startup. @@ -108,7 +106,7 @@ in { ''; }; - # this defaults to `true` in the wrapper + # This defaults to `true` in the wrapper # and since we pass this value to the wrapper # with an inherit, it should be `true` here as well withRuby = @@ -120,14 +118,14 @@ in { }; withNodeJs = mkEnableOption '' - NodeJs support in the Neovim wrapper + NodeJS support in the Neovim wrapper ''; luaPackages = mkOption { type = listOf str; default = []; example = ''["magick" "serpent"]''; - description = "List of lua packages to install"; + description = "List of Lua packages to install"; }; withPython3 = mkEnableOption '' @@ -144,7 +142,7 @@ in { pluginOverrides = mkOption { type = attrsOf package; default = {}; - example = '' + example = literalExpression '' { lazydev-nvim = pkgs.fetchFromGitHub { owner = "folke";