diff --git a/lib/languages.nix b/lib/languages.nix index f4ab1cca..c4709442 100644 --- a/lib/languages.nix +++ b/lib/languages.nix @@ -62,7 +62,7 @@ in { }; cmd = mkOption { - type = nullOr (either luaInline (listOf str)); + type = nullOr (listOf (oneOf [str luaInline])); default = null; description = "Command used to start the LSP server"; }; diff --git a/modules/plugins/languages/bash.nix b/modules/plugins/languages/bash.nix index e0e28bd7..1072a0fe 100644 --- a/modules/plugins/languages/bash.nix +++ b/modules/plugins/languages/bash.nix @@ -13,7 +13,6 @@ 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; diff --git a/modules/plugins/languages/clojure.nix b/modules/plugins/languages/clojure.nix index 31062ba7..cba3bcf7 100644 --- a/modules/plugins/languages/clojure.nix +++ b/modules/plugins/languages/clojure.nix @@ -4,15 +4,13 @@ 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) enum either listOf package str; + inherit (lib.types) either listOf package str; inherit (lib.nvim.types) mkGrammarOption; inherit (lib.nvim.lua) expToLua; - inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.clojure; diff --git a/modules/plugins/languages/dart.nix b/modules/plugins/languages/dart.nix index 61f52abb..c2a1810d 100644 --- a/modules/plugins/languages/dart.nix +++ b/modules/plugins/languages/dart.nix @@ -6,7 +6,6 @@ }: 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; @@ -15,31 +14,26 @@ 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; - defaultServers = ["dart"]; + defaultServer = "dart"; servers = { dart = { - enable = true; - cmd = [(getExe pkgs.dart) "language-server" "--protocol=lsp"]; - filetypes = ["dart"]; - root_markers = ["pubspec.yaml"]; - init_options = { - onlyAnalyzeProjectsWithOpenFiles = true; - suggestFromUnimportedLibraries = true; - closingLabels = true; - outline = true; - flutterOutline = true; - }; - settings = { - dart = { - completeFunctionCalls = true; - showTodos = true; + 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"}'' }; - }; + ${optionalString (cfg.lsp.opts != null) "init_options = ${cfg.lsp.dartOpts}"} + } + ''; }; }; in { @@ -52,11 +46,23 @@ 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; + 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"; }; }; @@ -125,23 +131,19 @@ in { }; }; - config = mkIf cfg.enable (mkMerge [ + config.vim = mkIf cfg.enable (mkMerge [ (mkIf cfg.treesitter.enable { - vim.treesitter.enable = true; - vim.treesitter.grammars = [cfg.treesitter.package]; + treesitter.enable = true; + treesitter.grammars = [cfg.treesitter.package]; }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + lsp.lspconfig.enable = true; + lsp.lspconfig.sources.dart-lsp = servers.${cfg.lsp.server}.lspConfig; }) (mkIf ftcfg.enable { - vim.startPlugins = [ + startPlugins = [ ( if ftcfg.enableNoResolvePatch then "flutter-tools-patched" @@ -150,7 +152,7 @@ in { "plenary-nvim" ]; - vim.pluginRC.flutter-tools = entryAfter ["lsp-servers"] '' + pluginRC.flutter-tools = entryAfter ["lsp-setup"] '' require('flutter-tools').setup { ${optionalString (ftcfg.flutterPackage != null) "flutter_path = \"${ftcfg.flutterPackage}/bin/flutter\","} lsp = { diff --git a/modules/plugins/languages/elixir.nix b/modules/plugins/languages/elixir.nix index 2164b469..241efd8e 100644 --- a/modules/plugins/languages/elixir.nix +++ b/modules/plugins/languages/elixir.nix @@ -8,37 +8,29 @@ 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; - defaultServers = ["elixirls"]; + defaultServer = "elixirls"; servers = { elixirls = { - enable = true; - cmd = [(getExe pkgs.elixir-ls)]; - filetypes = ["elixir" "eelixir" "heex" "surface"]; - root_dir = - mkLuaInline - /* - lua - */ - '' - function(bufnr, on_dir) - local fname = vim.api.nvim_buf_get_name(bufnr) - local matches = vim.fs.find({ 'mix.exs' }, { upward = true, limit = 2, path = fname }) - local child_or_root_path, maybe_umbrella_path = unpack(matches) - local root_dir = vim.fs.dirname(maybe_umbrella_path or child_or_root_path) - - on_dir(root_dir) - end - ''; + 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"}'' + } + } + ''; }; }; @@ -62,10 +54,18 @@ in { lsp = { enable = mkEnableOption "Elixir LSP support" // {default = config.vim.lsp.enable;}; - servers = mkOption { + + server = mkOption { description = "Elixir LSP server to use"; - type = listOf (enum (attrNames servers)); - default = defaultServers; + 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; }; }; @@ -97,12 +97,8 @@ in { }) (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.elixir-lsp = servers.${cfg.lsp.server}.lspConfig; }) (mkIf cfg.format.enable { diff --git a/modules/plugins/languages/gleam.nix b/modules/plugins/languages/gleam.nix index 3397a469..272ef51e 100644 --- a/modules/plugins/languages/gleam.nix +++ b/modules/plugins/languages/gleam.nix @@ -8,21 +8,27 @@ 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; - defaultServers = ["gleam"]; + defaultServer = "gleam"; servers = { gleam = { - enable = true; - cmd = [(getExe pkgs.gleam) "lsp"]; - filetypes = ["gleam"]; - root_markers = [ "gleam.toml" ".git" ]; + 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"}'' + } + } + ''; }; }; in { @@ -36,10 +42,17 @@ in { lsp = { enable = mkEnableOption "Gleam LSP support" // {default = config.vim.lsp.enable;}; - servers = mkOption { + + server = mkOption { + type = enum (attrNames servers); + default = defaultServer; description = "Gleam LSP server to use"; - type = listOf (enum (attrNames servers)); - default = defaultServers; + }; + + 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"; }; }; }; @@ -51,12 +64,8 @@ in { }) (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.gleam-lsp = servers.${cfg.lsp.server}.lspConfig; }) ]); }