diff --git a/modules/plugins/languages/asm.nix b/modules/plugins/languages/asm.nix index a0e96cef..dff2bdf1 100644 --- a/modules/plugins/languages/asm.nix +++ b/modules/plugins/languages/asm.nix @@ -4,12 +4,34 @@ lib, ... }: let + inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) package; + inherit (lib.types) enum either listOf package str; + inherit (lib.lists) isList; + inherit (lib.meta) getExe; + inherit (lib.generators) mkLuaInline; + inherit (lib.nvim.lua) expToLua toLuaObject; + inherit (lib.nvim.languages) lspOptions; inherit (lib.nvim.types) mkGrammarOption; cfg = config.vim.languages.assembly; + + defaultServer = "asm_lsp"; + servers = { + asm_lsp = { + package = pkgs.asm-lsp; + options = { + capabilities = mkLuaInline "capabilities"; + on_attach = mkLuaInline "default_on_attach"; + filetypes = ["asm" "vasm"]; + cmd = + if isList cfg.lsp.package + then expToLua cfg.lsp.package + else ["${getExe cfg.lsp.package}"]; + }; + }; + }; in { options.vim.languages.assembly = { enable = mkEnableOption "Assembly support"; @@ -22,28 +44,46 @@ in { lsp = { enable = mkEnableOption "Assembly LSP support (asm-lsp)" // {default = config.vim.languages.enableLSP;}; + server = mkOption { + description = "Assembly LSP server to use"; + type = enum (attrNames servers); + default = defaultServer; + }; + package = mkOption { - type = package; - default = pkgs.asm-lsp; - description = "asm-lsp package"; + description = "asm-lsp LSP server package, or the command to run as a list of strings"; + example = ''[lib.getExe pkgs.asm-lsp "--quiet"]''; + type = either package (listOf str); + default = servers.${cfg.lsp.server}.package; + }; + + options = mkOption { + type = lspOptions; + default = servers.${cfg.lsp.server}.options; + description = '' + LSP options for Assembly language support. + + This option is freeform, you may add options that are not set by default + and they will be merged into the final table passed to lspconfig. + ''; }; }; }; config = mkIf cfg.enable (mkMerge [ (mkIf cfg.treesitter.enable { - vim.treesitter.enable = true; - vim.treesitter.grammars = [cfg.treesitter.package]; + vim.treesitter = { + enable = true; + grammars = [cfg.treesitter.package]; + }; }) (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.lspconfig = { + enable = true; + sources.asm-lsp = '' + lspconfig.${toLuaObject cfg.lsp.server}.setup(${toLuaObject cfg.lsp.options}) + ''; + }; }) ]); } diff --git a/modules/plugins/languages/astro.nix b/modules/plugins/languages/astro.nix index 9e70424b..f628ed53 100644 --- a/modules/plugins/languages/astro.nix +++ b/modules/plugins/languages/astro.nix @@ -7,11 +7,12 @@ inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; + inherit (lib.types) enum either listOf package str; inherit (lib.lists) isList; inherit (lib.meta) getExe; - inherit (lib.types) enum either listOf package str; - inherit (lib.nvim.lua) expToLua; - inherit (lib.nvim.languages) diagnosticsToLua; + inherit (lib.generators) mkLuaInline; + inherit (lib.nvim.lua) expToLua toLuaObject; + inherit (lib.nvim.languages) diagnosticsToLua lspOptions; inherit (lib.nvim.types) mkGrammarOption diagnostics; cfg = config.vim.languages.astro; @@ -20,17 +21,16 @@ servers = { astro = { package = pkgs.astro-language-server; - lspConfig = '' - lspconfig.astro.setup { - capabilities = capabilities; - on_attach = attach_keymaps, - cmd = ${ + options = { + capabilities = mkLuaInline "capabilities"; + on_attach = mkLuaInline "attach_keymaps"; + filetypes = ["astro"]; + init_options = {typescript = {};}; + cmd = if isList cfg.lsp.package then expToLua cfg.lsp.package - else ''{"${cfg.lsp.package}/bin/astro-ls", "--stdio"}'' - } - } - ''; + else ["${getExe cfg.lsp.package}" "--stdio"]; + }; }; }; @@ -83,8 +83,7 @@ in { treesitter = { enable = mkEnableOption "Astro treesitter" // {default = config.vim.languages.enableTreesitter;}; - - astroPackage = mkGrammarOption pkgs "astro"; + package = mkGrammarOption pkgs "astro"; }; lsp = { @@ -96,6 +95,17 @@ in { default = defaultServer; }; + options = mkOption { + type = lspOptions; + default = servers.${cfg.lsp.server}.options; + description = '' + LSP options for Astro language support. + + This option is freeform, you may add options that are not set by default + and they will be merged into the final table passed to lspconfig. + ''; + }; + package = mkOption { description = "Astro LSP server package, or the command to run as a list of strings"; example = ''[lib.getExe pkgs.astro-language-server "--minify" "--stdio"]''; @@ -134,12 +144,14 @@ in { config = mkIf cfg.enable (mkMerge [ (mkIf cfg.treesitter.enable { vim.treesitter.enable = true; - vim.treesitter.grammars = [cfg.treesitter.astroPackage]; + vim.treesitter.grammars = [cfg.treesitter.package]; }) (mkIf cfg.lsp.enable { vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.astro-lsp = servers.${cfg.lsp.server}.lspConfig; + vim.lsp.lspconfig.sources.astro-lsp = '' + lspconfig.${toLuaObject cfg.lsp.server}.setup(${toLuaObject cfg.lsp.options}) + ''; }) (mkIf cfg.format.enable { diff --git a/modules/plugins/languages/bash.nix b/modules/plugins/languages/bash.nix index c0066b3c..3dc02982 100644 --- a/modules/plugins/languages/bash.nix +++ b/modules/plugins/languages/bash.nix @@ -7,11 +7,13 @@ inherit (builtins) attrNames; inherit (lib.options) mkOption mkEnableOption literalExpression; inherit (lib.modules) mkIf mkMerge; + inherit (lib.types) enum either listOf package str bool; inherit (lib.lists) isList; - inherit (lib.types) enum either package listOf str bool; - inherit (lib.nvim.languages) diagnosticsToLua; - inherit (lib.nvim.types) diagnostics mkGrammarOption; - inherit (lib.nvim.lua) expToLua; + inherit (lib.meta) getExe; + inherit (lib.generators) mkLuaInline; + inherit (lib.nvim.lua) expToLua toLuaObject; + inherit (lib.nvim.languages) diagnosticsToLua lspOptions; + inherit (lib.nvim.types) mkGrammarOption diagnostics; cfg = config.vim.languages.bash; @@ -19,17 +21,15 @@ servers = { bash-ls = { package = pkgs.bash-language-server; - lspConfig = '' - lspconfig.bashls.setup{ - capabilities = capabilities; - on_attach = default_on_attach; - cmd = ${ + options = { + capabilities = mkLuaInline "capabilities"; + on_attach = mkLuaInline "default_on_attach"; + filetypes = ["bash" "sh"]; + cmd = if isList cfg.lsp.package then expToLua cfg.lsp.package - else ''{"${cfg.lsp.package}/bin/bash-language-server", "start"}'' - }; - } - ''; + else ["${getExe cfg.lsp.package}" "start"]; + }; }; }; @@ -87,6 +87,17 @@ in { type = either package (listOf str); default = pkgs.bash-language-server; }; + + options = mkOption { + type = lspOptions; + default = servers.${cfg.lsp.server}.options; + description = '' + LSP options for Bash language support. + + This option is freeform, you may add options that are not set by default + and they will be merged into the final table passed to lspconfig. + ''; + }; }; format = { @@ -126,7 +137,9 @@ in { (mkIf cfg.lsp.enable { vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.bash-lsp = servers.${cfg.lsp.server}.lspConfig; + vim.lsp.lspconfig.sources.bash-lsp = '' + lspconfig.${toLuaObject cfg.lsp.server}.setup(${toLuaObject cfg.lsp.options}) + ''; }) (mkIf cfg.format.enable { diff --git a/modules/plugins/languages/clang.nix b/modules/plugins/languages/clang.nix index bb30cc95..fafa0599 100644 --- a/modules/plugins/languages/clang.nix +++ b/modules/plugins/languages/clang.nix @@ -5,48 +5,62 @@ ... }: 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.modules) mkIf mkMerge; - inherit (lib.nvim.lua) expToLua; + inherit (lib.options) mkEnableOption mkOption; + inherit (lib.types) bool enum package either listOf str; + inherit (lib.lists) isList; + inherit (lib.generators) mkLuaInline; + inherit (lib.nvim.lua) expToLua toLuaObject; inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.languages) lspOptions; + 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; + packageToCmd = package: defaultCmd: + if isList package + then expToLua package + else ''{ "${package}/bin/${defaultCmd}" }''; + defaultServer = "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}"} - } - ''; + options = { + capabilities = mkLuaInline "capabilities"; + on_attach = mkLuaInline "default_on_attach"; + filetypes = ["c" "cpp" "objc" "objcpp" "cuda"]; + offset_encoding = "utf-32"; + cmd = + if isList cfg.lsp.package + then expToLua cfg.lsp.package + else ["${packageToCmd cfg.lsp.package "ccls"}"]; + single_file_support = false; # upstream default + }; }; + 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}"} - } - ''; + options = { + capabilities = mkLuaInline '' + { + offsetEncoding = { "utf-8", "utf-16" }, + textDocument = { + completion = { + editsNearCursor = true + } + } + ''; + on_attach = mkLuaInline "default_on_attach"; + filetypes = ["c" "cpp" "objc" "objcpp" "cuda" "proto"]; + offset_encoding = "utf-32"; + cmd = + if isList cfg.lsp.package + then expToLua cfg.lsp.package + else ["${packageToCmd cfg.lsp.package "clangd"}"]; + single_file_support = false; # upstream default + }; }; }; @@ -60,6 +74,7 @@ command = '${cfg.dap.package}/bin/lldb-dap', name = 'lldb' } + dap.configurations.cpp = { { name = 'Launch', @@ -98,10 +113,10 @@ in { }; lsp = { - enable = mkEnableOption "clang LSP support" // {default = config.vim.languages.enableLSP;}; + enable = mkEnableOption "C/C++ LSP support" // {default = config.vim.languages.enableLSP;}; server = mkOption { - description = "The clang LSP server to use"; + description = "The C/C++ LSP server to use"; type = enum (attrNames servers); default = defaultServer; }; @@ -113,10 +128,15 @@ in { default = servers.${cfg.lsp.server}.package; }; - opts = mkOption { - description = "Options to pass to clang LSP server"; - type = nullOr str; - default = null; + options = mkOption { + type = lspOptions; + default = servers.${cfg.lsp.server}.options; + description = '' + LSP options for C/C++ language support. + + This option is freeform, you may add options that are not set by default + and they will be merged into the final table passed to lspconfig. + ''; }; }; @@ -126,11 +146,13 @@ in { type = bool; default = config.vim.languages.enableDAP; }; + debugger = mkOption { description = "clang debugger to use"; type = enum (attrNames debuggers); default = defaultDebugger; }; + package = mkOption { description = "clang debugger package."; type = package; @@ -151,8 +173,9 @@ in { (mkIf cfg.lsp.enable { vim.lsp.lspconfig.enable = true; - - vim.lsp.lspconfig.sources.clang-lsp = servers.${cfg.lsp.server}.lspConfig; + vim.lsp.lspconfig.sources.clang-lsp = '' + lspconfig.${toLuaObject cfg.lsp.server}.setup(${toLuaObject cfg.lsp.options}) + ''; }) (mkIf cfg.dap.enable { diff --git a/modules/plugins/languages/csharp.nix b/modules/plugins/languages/csharp.nix index af7f36e0..32739614 100644 --- a/modules/plugins/languages/csharp.nix +++ b/modules/plugins/languages/csharp.nix @@ -6,13 +6,14 @@ ... }: let inherit (builtins) attrNames; - inherit (lib.options) mkEnableOption mkOption; - inherit (lib.types) either listOf package str enum; inherit (lib.modules) mkIf mkMerge; + inherit (lib.options) mkOption mkEnableOption; + inherit (lib.types) either listOf package str enum; inherit (lib.lists) isList; inherit (lib.strings) optionalString; + inherit (lib.generators) mkLuaInline; inherit (lib.nvim.types) mkGrammarOption; - inherit (lib.nvim.lua) expToLua; + inherit (lib.nvim.lua) expToLua toLuaObject; lspKeyConfig = config.vim.lsp.mappings; lspKeyOptions = options.vim.lsp.mappings; @@ -22,6 +23,11 @@ in optionalString (key != null) "vim.keymap.set('n', '${key}', ${action}, {buffer=bufnr, noremap=true, silent=true, desc='${desc}'})"; + packageToCmd = package: defaultCmd: + if isList package + then expToLua package + else ''{ "${package}/bin/${defaultCmd}" }''; + # 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. @@ -30,10 +36,10 @@ omnisharp = { package = pkgs.omnisharp-roslyn; internalFormatter = true; - lspConfig = '' - lspconfig.omnisharp.setup { - capabilities = capabilities, - on_attach = function(client, bufnr) + options = { + capabilities = mkLuaInline "capabilities"; + on_attach = mkLuaInline '' + function(client, bufnr) default_on_attach(client, bufnr) local oe = require("omnisharp_extended") @@ -42,35 +48,40 @@ ${mkLspBinding "listReferences" "oe.lsp_references"} ${mkLspBinding "listImplementations" "oe.lsp_implementation"} end, - cmd = ${ + ''; + filetypes = ["cs" "vb"]; + cmd = if isList cfg.lsp.package then expToLua cfg.lsp.package - else "{'${cfg.lsp.package}/bin/OmniSharp'}" - } - } - ''; + else ["${packageToCmd cfg.lsp.package "OmniSharp"}"]; + single_file_support = false; # upstream default + init_options = {}; + handlers = { + "textDocument/definition" = mkLuaInline "extended_handler"; + "textDocument/typeDefinition" = mkLuaInline "extended_handler"; + }; + }; }; csharp_ls = { package = pkgs.csharp-ls; internalFormatter = true; - lspConfig = '' - local extended_handler = require("csharpls_extended").handler - - lspconfig.csharp_ls.setup { - capabilities = capabilities, - on_attach = default_on_attach, - handlers = { - ["textDocument/definition"] = extended_handler, - ["textDocument/typeDefinition"] = extended_handler - }, - cmd = ${ + options = { + capabilities = mkLuaInline "capabilities"; + on_attach = mkLuaInline "default_on_attach"; + filetypes = ["cs"]; + offset_encoding = "utf-32"; + cmd = if isList cfg.lsp.package then expToLua cfg.lsp.package - else "{'${cfg.lsp.package}/bin/csharp-ls'}" - } - } - ''; + else ["${packageToCmd cfg.lsp.package "csharp-ls"}"]; + single_file_support = false; # upstream default + init_options = {AutomaticWorkspaceInit = true;}; + handlers = { + "textDocument/definition" = mkLuaInline "extended_handler"; + "textDocument/typeDefinition" = mkLuaInline "extended_handler"; + }; + }; }; }; @@ -116,7 +127,9 @@ 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.lsp.lspconfig.sources.csharp-lsp = '' + lspconfig.${toLuaObject cfg.lsp.server}.setup(${toLuaObject cfg.lsp.options}) + ''; }) ]); } diff --git a/modules/plugins/languages/cue.nix b/modules/plugins/languages/cue.nix index 313e3233..e8f8beb2 100644 --- a/modules/plugins/languages/cue.nix +++ b/modules/plugins/languages/cue.nix @@ -1,15 +1,38 @@ { - pkgs, config, + pkgs, lib, ... }: let + inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) package; + inherit (lib.types) enum either listOf package str; + inherit (lib.lists) isList; + inherit (lib.meta) getExe; + inherit (lib.generators) mkLuaInline; + inherit (lib.nvim.lua) expToLua toLuaObject; + inherit (lib.nvim.languages) lspOptions; inherit (lib.nvim.types) mkGrammarOption; cfg = config.vim.languages.cue; + + defaultServer = "cue"; + servers = { + cue = { + package = pkgs.cue; + options = { + capabilities = mkLuaInline "capabilities"; + on_attach = mkLuaInline "default_on_attach"; + filetypes = ["cue"]; + cmd = + if isList cfg.lsp.package + then expToLua cfg.lsp.package + else ["${getExe cfg.lsp.package}"]; + single_file_support = true; + }; + }; + }; in { options.vim.languages.cue = { enable = mkEnableOption "CUE language support"; @@ -23,10 +46,29 @@ in { lsp = { enable = mkEnableOption "CUE LSP support" // {default = config.vim.languages.enableLSP;}; + server = mkOption { + description = "CUE LSP server to use"; + type = enum (attrNames servers); + default = defaultServer; + }; + package = mkOption { - type = package; - default = pkgs.cue; - description = "cue lsp implementation"; + type = either package (listOf str); + default = servers.${cfg.lsp.server}.package; + description = '' + CUE LSP server package, or the command to run as a list of strings + ''; + }; + + options = mkOption { + type = lspOptions; + default = servers.${cfg.lsp.server}.options; + description = '' + LSP options for CUE language support. + + This option is freeform, you may add options that are not set by default + and they will be merged into the final table passed to lspconfig. + ''; }; }; }; @@ -38,14 +80,12 @@ 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.lspconfig = { + enable = true; + sources.cue-lsp = '' + lspconfig.${toLuaObject cfg.lsp.server}.setup(${toLuaObject cfg.lsp.options}) + ''; + }; }) ]); } diff --git a/modules/plugins/languages/dart.nix b/modules/plugins/languages/dart.nix index 4f8a7028..7e155d35 100644 --- a/modules/plugins/languages/dart.nix +++ b/modules/plugins/languages/dart.nix @@ -6,12 +6,15 @@ }: let inherit (builtins) attrNames; inherit (lib.modules) mkIf mkMerge; - 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 either listOf package str bool; + inherit (lib.lists) isList; inherit (lib.strings) optionalString; - inherit (lib.nvim.lua) expToLua; + inherit (lib.trivial) boolToString; + inherit (lib.meta) getExe; + inherit (lib.generators) mkLuaInline; + inherit (lib.nvim.lua) expToLua toLuaObject; + inherit (lib.nvim.languages) lspOptions; inherit (lib.nvim.types) mkGrammarOption; inherit (lib.nvim.dag) entryAnywhere; @@ -22,18 +25,29 @@ servers = { dart = { package = pkgs.dart; - lspConfig = '' - lspconfig.dartls.setup{ - capabilities = capabilities; - on_attach=default_on_attach; - cmd = ${ + options = { + capabilities = mkLuaInline "capabilities"; + on_attach = mkLuaInline "default_on_attach"; + filetypes = ["dart"]; + cmd = if isList cfg.lsp.package then expToLua cfg.lsp.package - else ''{"${cfg.lsp.package}/bin/dart", "language-server", "--protocol=lsp"}'' + else ["${getExe cfg.lsp.package}" "language-server" "--protocol=lsp"]; + single_file_support = true; + init_options = { + closingLabels = true; + flutterOutline = true; + onlyAnalyzeProjectsWithOpenFiles = true; + outline = true; + suggestFromUnimportedLibraries = true; }; - ${optionalString (cfg.lsp.opts != null) "init_options = ${cfg.lsp.dartOpts}"} - } - ''; + settings = { + dart = { + completeFunctionCalls = true; + showTodos = true; + }; + }; + }; }; }; in { @@ -52,6 +66,7 @@ in { type = enum (attrNames servers); default = defaultServer; }; + package = mkOption { type = either package (listOf str); default = servers.${cfg.lsp.server}.package; @@ -59,10 +74,15 @@ in { 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"; + options = mkOption { + type = lspOptions; + default = servers.${cfg.lsp.server}.options; + description = '' + LSP options for Dart language support. + + This option is freeform, you may add options that are not set by default + and they will be merged into the final table passed to lspconfig. + ''; }; }; @@ -129,8 +149,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.dart-lsp = servers.${cfg.lsp.server}.lspConfig; + vim.lsp.lspconfig = { + enable = true; + sources.dart-lsp = '' + lspconfig.${toLuaObject cfg.lsp.server}.setup(${toLuaObject cfg.lsp.options}) + ''; + }; }) (mkIf ftcfg.enable { diff --git a/modules/plugins/languages/elixir.nix b/modules/plugins/languages/elixir.nix index f8f338b1..50efbd56 100644 --- a/modules/plugins/languages/elixir.nix +++ b/modules/plugins/languages/elixir.nix @@ -7,10 +7,13 @@ 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.lists) isList; + inherit (lib.meta) getExe; + inherit (lib.generators) mkLuaInline; inherit (lib.nvim.types) mkGrammarOption; - inherit (lib.nvim.lua) expToLua; + inherit (lib.nvim.lua) expToLua toLuaObject; + inherit (lib.nvim.languages) lspOptions; inherit (lib.nvim.dag) entryAnywhere; cfg = config.vim.languages.elixir; @@ -19,18 +22,15 @@ servers = { elixirls = { package = pkgs.elixir-ls; - lspConfig = '' - -- elixirls setup - lspconfig.elixirls.setup { - capabilities = capabilities, - on_attach = default_on_attach, - cmd = ${ + options = { + capabilities = mkLuaInline "capabilities"; + on_attach = mkLuaInline "default_on_attach"; + filetypes = ["elixir" "eelixir" "heex" "surface"]; + cmd = if isList cfg.lsp.package then expToLua cfg.lsp.package - else ''{"${cfg.lsp.package}/bin/elixir-ls"}'' - } - } - ''; + else ["${getExe cfg.lsp.package}"]; + }; }; }; @@ -72,6 +72,17 @@ in { type = either package (listOf str); default = servers.${cfg.lsp.server}.package; }; + + options = mkOption { + type = lspOptions; + default = servers.${cfg.lsp.server}.options; + description = '' + LSP options for Elixir language support. + + This option is freeform, you may add options that are not set by default + and they will be merged into the final table passed to lspconfig. + ''; + }; }; format = { @@ -102,8 +113,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.elixir-lsp = servers.${cfg.lsp.server}.lspConfig; + vim.lsp.lspconfig = { + enable = true; + sources.elixir-lsp = '' + lspconfig.${toLuaObject cfg.lsp.server}.setup(${toLuaObject cfg.lsp.options}) + ''; + }; }) (mkIf cfg.format.enable { diff --git a/modules/plugins/languages/go.nix b/modules/plugins/languages/go.nix index 3ac9ae77..7e01a8a9 100644 --- a/modules/plugins/languages/go.nix +++ b/modules/plugins/languages/go.nix @@ -7,11 +7,13 @@ inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; - inherit (lib.meta) getExe; - inherit (lib.lists) isList; inherit (lib.types) bool enum either listOf package str; + inherit (lib.lists) isList; + inherit (lib.meta) getExe; + inherit (lib.generators) mkLuaInline; inherit (lib.nvim.types) mkGrammarOption; - inherit (lib.nvim.lua) expToLua; + inherit (lib.nvim.languages) lspOptions; + inherit (lib.nvim.lua) expToLua toLuaObject; inherit (lib.nvim.dag) entryAfter; cfg = config.vim.languages.go; @@ -20,17 +22,16 @@ servers = { gopls = { package = pkgs.gopls; - lspConfig = '' - lspconfig.gopls.setup { - capabilities = capabilities; - on_attach = default_on_attach; - cmd = ${ + options = { + capabilities = mkLuaInline "capabilities"; + on_attach = mkLuaInline "default_on_attach"; + filetypes = ["go" "gomod" "gowork" "gotmpl"]; + cmd = if isList cfg.lsp.package then expToLua cfg.lsp.package - else ''{"${cfg.lsp.package}/bin/gopls", "serve"}'' - }, - } - ''; + else ["${getExe cfg.lsp.package}" "serve"]; + single_file_support = true; + }; }; }; @@ -102,6 +103,17 @@ in { type = either package (listOf str); default = servers.${cfg.lsp.server}.package; }; + + options = mkOption { + type = lspOptions; + default = servers.${cfg.lsp.server}.options; + description = '' + LSP options for Go language support. + + This option is freeform, you may add options that are not set by default + and they will be merged into the final table passed to lspconfig. + ''; + }; }; format = { @@ -148,8 +160,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.lspconfig.enable = true; - vim.lsp.lspconfig.sources.go-lsp = servers.${cfg.lsp.server}.lspConfig; + vim.lsp.lspconfig = { + enable = true; + sources.go-lsp = '' + lspconfig.${toLuaObject cfg.lsp.server}.setup(${toLuaObject cfg.lsp.options}) + ''; + }; }) (mkIf cfg.format.enable { diff --git a/modules/plugins/languages/hcl.nix b/modules/plugins/languages/hcl.nix index e340e74d..5d4e15f7 100644 --- a/modules/plugins/languages/hcl.nix +++ b/modules/plugins/languages/hcl.nix @@ -8,6 +8,11 @@ inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; inherit (lib.types) package bool enum; + inherit (lib.lists) isList; + inherit (lib.meta) getExe; + inherit (lib.generators) mkLuaInline; + inherit (lib.lua) expToLua toLuaObject; + inherit (lib.nvim.languages) lspOptions; inherit (lib.nvim.types) mkGrammarOption; cfg = config.vim.languages.hcl; @@ -16,13 +21,15 @@ 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"}, - } - ''; + options = { + capabilities = mkLuaInline "capabilities"; + on_attach = mkLuaInline "default_on_attach"; + filetypes = ["terraform" "hcl"]; + cmd = + if isList cfg.lsp.package + then expToLua cfg.lsp.package + else ["${getExe cfg.lsp.package}" "serve"]; + }; }; }; @@ -51,12 +58,30 @@ in { lsp = { enable = mkEnableOption "HCL LSP support (terraform-ls)" // {default = config.vim.languages.enableLSP;}; + # 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)"; }; + + server = mkOption { + description = "HCL LSP server to use"; + type = enum (attrNames servers); + default = defaultServer; + }; + + options = mkOption { + type = lspOptions; + default = servers.${cfg.lsp.server}.options; + description = '' + LSP options for HCL language support. + + This option is freeform, you may add options that are not set by default + and they will be merged into the final table passed to lspconfig. + ''; + }; }; format = { @@ -65,11 +90,13 @@ in { default = config.vim.languages.enableFormat; description = "Enable HCL formatting"; }; + type = mkOption { type = enum (attrNames formats); default = defaultFormat; description = "HCL formatter to use"; }; + package = mkOption { type = package; default = formats.${cfg.format.type}.package; @@ -80,7 +107,7 @@ in { config = mkIf cfg.enable (mkMerge [ { - # hcl style official: https://developer.hashicorp.com/terraform/language/style#code-formatting + # HCL style official: https://developer.hashicorp.com/terraform/language/style#code-formatting vim.pluginRC.hcl = '' vim.api.nvim_create_autocmd("FileType", { pattern = "hcl", @@ -97,15 +124,18 @@ in { .set('hcl', '#%s') ''; } + (mkIf cfg.treesitter.enable { vim.treesitter.enable = true; vim.treesitter.grammars = [cfg.treesitter.package]; }) (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; + vim.lsp.lspconfig = { + enable = true; + sources.hcl-lsp = lib.optionalString (!config.vim.languages.terraform.lsp.enable) '' + lspconfig.${toLuaObject cfg.lsp.server}.setup(${toLuaObject cfg.lsp.options}) + ''; }; })