diff --git a/modules/plugins/languages/ruby.nix b/modules/plugins/languages/ruby.nix index 6b2e63da..1f3ce82f 100644 --- a/modules/plugins/languages/ruby.nix +++ b/modules/plugins/languages/ruby.nix @@ -9,41 +9,44 @@ inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; inherit (lib.nvim.types) mkGrammarOption diagnostics; - inherit (lib.types) listOf package enum; - inherit (lib.nvim.attrsets) mapListToAttrs; + inherit (lib.nvim.lua) expToLua; + inherit (lib.lists) isList; + inherit (lib.types) either listOf package str enum; cfg = config.vim.languages.ruby; - defaultServers = ["solargraph"]; + defaultServer = "rubyserver"; servers = { - ruby_lsp = { - enable = true; - cmd = [(getExe pkgs.ruby-lsp)]; - filetypes = ["ruby" "eruby"]; - root_markers = ["Gemfile" ".git"]; - init_options = { - formatter = "auto"; - }; + 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" }'' + } + } + ''; }; - - 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; - }; + 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" }'' + } + } + ''; }; }; @@ -76,11 +79,17 @@ in { lsp = { enable = mkEnableOption "Ruby LSP support" // {default = config.vim.lsp.enable;}; - servers = mkOption { - type = listOf (enum (attrNames servers)); - default = defaultServers; + server = mkOption { + type = enum (attrNames servers); + default = defaultServer; 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 = { @@ -119,12 +128,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.ruby-lsp = servers.${cfg.lsp.server}.lspConfig; }) (mkIf cfg.format.enable { diff --git a/modules/plugins/languages/sql.nix b/modules/plugins/languages/sql.nix index bbe7ffc2..add46c15 100644 --- a/modules/plugins/languages/sql.nix +++ b/modules/plugins/languages/sql.nix @@ -8,27 +8,31 @@ inherit (lib.options) mkEnableOption mkOption; inherit (lib.meta) getExe; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) enum listOf package str; + inherit (lib.lists) isList; + inherit (lib.types) enum either listOf package str; + inherit (lib.nvim.lua) expToLua; inherit (lib.nvim.types) diagnostics; - inherit (lib.nvim.attrsets) mapListToAttrs; - inherit (lib.generators) mkLuaInline; cfg = config.vim.languages.sql; sqlfluffDefault = pkgs.sqlfluff; - defaultServers = ["sqls"]; + defaultServer = "sqls"; servers = { sqls = { - enable = true; - cmd = [(getExe pkgs.sqls)]; - filetypes = ["sql" "mysql"]; - root_markers = ["config.yml"]; - settings = {}; - on_attach = mkLuaInline '' - function(client, bufnr) - client.server_capabilities.execute_command = true - require'sqls'.setup{} - end + 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()) }'' + } + } ''; }; }; @@ -77,10 +81,17 @@ in { lsp = { enable = mkEnableOption "SQL LSP support" // {default = config.vim.lsp.enable;}; - servers = mkOption { + server = mkOption { description = "SQL LSP server to use"; - type = listOf (enum (attrNames servers)); - default = defaultServers; + 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; }; }; @@ -121,12 +132,10 @@ in { vim = { startPlugins = ["sqls-nvim"]; - lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + lsp.lspconfig = { + enable = true; + sources.sql-lsp = servers.${cfg.lsp.server}.lspConfig; + }; }; }) diff --git a/modules/plugins/languages/svelte.nix b/modules/plugins/languages/svelte.nix index dd0bbc21..4cc9ffe9 100644 --- a/modules/plugins/languages/svelte.nix +++ b/modules/plugins/languages/svelte.nix @@ -7,39 +7,28 @@ 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 listOf package; + inherit (lib.types) enum either listOf package str; + inherit (lib.nvim.lua) expToLua; inherit (lib.nvim.types) mkGrammarOption diagnostics; - inherit (lib.nvim.attrsets) mapListToAttrs; - inherit (lib.generators) mkLuaInline; cfg = config.vim.languages.svelte; - defaultServers = ["svelte"]; + defaultServer = "svelte"; servers = { svelte = { - enable = true; - cmd = [(getExe pkgs.svelte-language-server) "--stdio"]; - filetypes = ["svelte"]; - root_dir = mkLuaInline '' - function(bufnr, on_dir) - local root_files = { 'package.json', '.git' } - local fname = vim.api.nvim_buf_get_name(bufnr) - -- Svelte LSP only supports file:// schema. https://github.com/sveltejs/language-tools/issues/2777 - if vim.uv.fs_stat(fname) ~= nil then - on_dir(vim.fs.dirname(vim.fs.find(root_files, { path = fname, upward = true })[1])) - end - end - ''; - on_attach = mkLuaInline '' - function(client, bufnr) - vim.api.nvim_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 + 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"}'' + } + } ''; }; }; @@ -89,10 +78,17 @@ in { lsp = { enable = mkEnableOption "Svelte LSP support" // {default = config.vim.lsp.enable;}; - servers = mkOption { + server = mkOption { description = "Svelte LSP server to use"; - type = listOf (enum (attrNames servers)); - default = defaultServers; + 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; }; }; @@ -130,12 +126,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.svelte-lsp = servers.${cfg.lsp.server}.lspConfig; }) (mkIf cfg.format.enable { diff --git a/modules/plugins/languages/tailwind.nix b/modules/plugins/languages/tailwind.nix index be895387..fbe707ba 100644 --- a/modules/plugins/languages/tailwind.nix +++ b/modules/plugins/languages/tailwind.nix @@ -7,142 +7,26 @@ 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.generators) mkLuaInline; + inherit (lib.lists) isList; + inherit (lib.types) enum either listOf package str; + inherit (lib.nvim.lua) expToLua; cfg = config.vim.languages.tailwind; - defaultServers = ["tailwindcss"]; + defaultServer = "tailwindcss-language-server"; servers = { - 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 + 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"}'' + } + } ''; }; }; @@ -153,22 +37,25 @@ in { lsp = { enable = mkEnableOption "Tailwindcss LSP support" // {default = config.vim.lsp.enable;}; - servers = mkOption { + server = mkOption { description = "Tailwindcss LSP server to use"; - type = listOf (enum (attrNames servers)); - default = defaultServers; + 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; }; }; }; config = 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.tailwindcss-lsp = servers.${cfg.lsp.server}.lspConfig; }) ]); } diff --git a/modules/plugins/languages/terraform.nix b/modules/plugins/languages/terraform.nix index 4e13ecf0..095da072 100644 --- a/modules/plugins/languages/terraform.nix +++ b/modules/plugins/languages/terraform.nix @@ -4,25 +4,12 @@ lib, ... }: 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.types) package; 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"; @@ -35,10 +22,10 @@ in { lsp = { 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; + package = mkOption { + description = "terraform-ls package"; + type = package; + default = pkgs.terraform-ls; }; }; }; @@ -49,12 +36,14 @@ 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.terraform-ls = '' + lspconfig.terraformls.setup { + capabilities = capabilities, + on_attach=default_on_attach, + cmd = {"${cfg.lsp.package}/bin/terraform-ls", "serve"}, + } + ''; }) ]); } diff --git a/modules/plugins/languages/typst.nix b/modules/plugins/languages/typst.nix index 720b3f7a..08a2252b 100644 --- a/modules/plugins/languages/typst.nix +++ b/modules/plugins/languages/typst.nix @@ -6,87 +6,52 @@ }: let inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) nullOr enum attrsOf listOf package str; + inherit (lib.lists) isList; + inherit (lib.types) nullOr enum either 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; - defaultServers = ["tinymist"]; + defaultServer = "tinymist"; servers = { - typst_lsp = { - enable = true; - cmd = [(getExe pkgs.typst-lsp)]; - filetypes = ["typst"]; - root_markers = [".git"]; - on_attach = mkLuaInline '' - function(client, bufnr) - -- Disable semantic tokens as a workaround for a semantic token error when using non-english characters - client.server_capabilities.semanticTokensProvider = nil - end + 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"}'' + }, + } ''; }; 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 + 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"}'' + }, + } ''; }; }; @@ -113,10 +78,17 @@ in { lsp = { enable = mkEnableOption "Typst LSP support (typst-lsp)" // {default = config.vim.lsp.enable;}; - servers = mkOption { + server = mkOption { description = "Typst LSP server to use"; - type = listOf (enum (attrNames servers)); - default = defaultServers; + 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; }; }; @@ -159,7 +131,7 @@ in { dependencies_bin = mkOption { type = attrsOf str; default = { - "tinymist" = getExe pkgs.tinymist; + "tinymist" = getExe servers.tinymist.package; "websocat" = getExe pkgs.websocat; }; @@ -197,12 +169,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.typst-lsp = servers.${cfg.lsp.server}.lspConfig; }) # Extensions diff --git a/modules/plugins/languages/vala.nix b/modules/plugins/languages/vala.nix index 5bc91def..220926d0 100644 --- a/modules/plugins/languages/vala.nix +++ b/modules/plugins/languages/vala.nix @@ -7,57 +7,36 @@ inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge; - inherit (lib.meta) getExe; - inherit (lib.types) enum listOf; + inherit (lib.lists) isList; + inherit (lib.types) enum either listOf package str; inherit (lib.nvim.types) mkGrammarOption; - inherit (lib.nvim.attrsets) mapListToAttrs; - inherit (lib.generators) mkLuaInline; + inherit (lib.nvim.lua) expToLua; cfg = config.vim.languages.vala; - defaultServers = ["vala_ls"]; + defaultServer = "vala_ls"; 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 - ''; - })) - ]; - 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 + package = 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 + ''; + }; + 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"}'' + }, + } ''; }; }; @@ -72,10 +51,16 @@ in { lsp = { enable = mkEnableOption "Vala LSP support" // {default = config.vim.lsp.enable;}; - servers = mkOption { + server = mkOption { description = "Vala LSP server to use"; - type = listOf (enum (attrNames servers)); - default = defaultServers; + 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; }; }; }; @@ -87,12 +72,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.vala_ls = servers.${cfg.lsp.server}.lspConfig; }) ]); } diff --git a/modules/plugins/languages/wgsl.nix b/modules/plugins/languages/wgsl.nix index 3b278a27..f374543e 100644 --- a/modules/plugins/languages/wgsl.nix +++ b/modules/plugins/languages/wgsl.nix @@ -5,23 +5,31 @@ ... }: 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) mkEnableOption mkOption; - inherit (lib.types) enum listOf; - inherit (lib.meta) getExe; - inherit (lib.nvim.attrsets) mapListToAttrs; + inherit (lib.options) literalExpression mkEnableOption mkOption; + inherit (lib.types) either enum listOf package str; cfg = config.vim.languages.wgsl; - defaultServers = ["wgsl_analyzer"]; + defaultServer = "wgsl-analyzer"; servers = { - wgsl_analyzer = { - enable = true; - cmd = [(getExe pkgs.wgsl-analyzer)]; - filetypes = ["wgsl"]; - root_markers = [".git"]; - settings = {}; + 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'}" + } + } + ''; }; }; in { @@ -36,11 +44,18 @@ in { lsp = { enable = mkEnableOption "WGSL LSP support" // {default = config.vim.lsp.enable;}; - servers = mkOption { - type = listOf (enum (attrNames servers)); - default = defaultServers; + server = mkOption { + type = enum (attrNames servers); + default = defaultServer; 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; + }; }; }; @@ -53,12 +68,12 @@ in { }) (mkIf cfg.lsp.enable { - vim.lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + vim = { + lsp.lspconfig = { + enable = true; + sources.wgsl_analyzer = servers.${cfg.lsp.server}.lspConfig; + }; + }; }) ]); } diff --git a/modules/plugins/languages/zig.nix b/modules/plugins/languages/zig.nix index db38cc51..89307eab 100644 --- a/modules/plugins/languages/zig.nix +++ b/modules/plugins/languages/zig.nix @@ -7,21 +7,29 @@ inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption; inherit (lib.modules) mkIf mkMerge mkDefault; - inherit (lib.types) bool listOf package enum; + inherit (lib.lists) isList; + inherit (lib.types) bool either listOf package str enum; + inherit (lib.nvim.lua) expToLua; inherit (lib.nvim.types) mkGrammarOption; - inherit (lib.meta) getExe; - inherit (lib.nvim.attrsets) mapListToAttrs; cfg = config.vim.languages.zig; - defaultServers = ["zls"]; + defaultServer = "zls"; servers = { zls = { - enable = true; - cmd = [(getExe pkgs.zls)]; - filetypes = ["zig" "zir"]; - root_markers = ["zls.json" "build.zig" ".git"]; - workspace_required = false; + 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'}" + } + } + ''; }; }; @@ -66,11 +74,17 @@ in { lsp = { enable = mkEnableOption "Zig LSP support" // {default = config.vim.lsp.enable;}; - servers = mkOption { - type = listOf (enum (attrNames servers)); - default = defaultServers; + server = mkOption { + type = enum (attrNames servers); + default = defaultServer; 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 = { @@ -104,12 +118,10 @@ in { (mkIf cfg.lsp.enable { vim = { - lsp.servers = - mapListToAttrs (n: { - name = n; - value = servers.${n}; - }) - cfg.lsp.servers; + lsp.lspconfig = { + enable = true; + sources.zig-lsp = servers.${cfg.lsp.server}.lspConfig; + }; # nvf handles autosaving already globals.zig_fmt_autosave = mkDefault 0;