diff --git a/modules/plugins/languages/python.nix b/modules/plugins/languages/python.nix index 1fc26e40..bec7ec8b 100644 --- a/modules/plugins/languages/python.nix +++ b/modules/plugins/languages/python.nix @@ -8,114 +8,57 @@ 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.nvim.attrsets) mapListToAttrs; - inherit (lib.generators) mkLuaInline; - inherit (lib.nvim.dag) entryBefore; + inherit (lib.lists) isList; + inherit (lib.types) enum either listOf package str bool; + inherit (lib.nvim.lua) expToLua; cfg = config.vim.languages.python; - defaultServers = ["basedpyright"]; + defaultServer = "basedpyright"; servers = { pyright = { - 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 + 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"}'' + } + } ''; }; basedpyright = { - 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 + 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"}'' + } + } ''; }; python-lsp-server = { - enable = true; - cmd = [(getExe pkgs.python3Packages.python-lsp-server)]; - filetypes = ["python"]; - root_markers = [ - "pyproject.toml" - "setup.py" - "setup.cfg" - "requirements.txt" - "Pipfile" - ".git" - ]; + 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"}'' + } + } + ''; }; }; @@ -228,10 +171,17 @@ in { lsp = { enable = mkEnableOption "Python LSP support" // {default = config.vim.lsp.enable;}; - servers = mkOption { + server = mkOption { description = "Python LSP server to use"; - type = listOf (enum (attrNames servers)); - default = defaultServers; + 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; }; }; @@ -284,34 +234,8 @@ in { }) (mkIf cfg.lsp.enable { - 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; + vim.lsp.lspconfig.enable = true; + vim.lsp.lspconfig.sources.python-lsp = servers.${cfg.lsp.server}.lspConfig; }) (mkIf cfg.format.enable { diff --git a/modules/plugins/languages/r.nix b/modules/plugins/languages/r.nix index 7f5ffc95..894c63f6 100644 --- a/modules/plugins/languages/r.nix +++ b/modules/plugins/languages/r.nix @@ -7,11 +7,10 @@ inherit (builtins) attrNames; inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.modules) mkIf mkMerge; - inherit (lib.types) enum listOf package; - inherit (lib.meta) getExe; + inherit (lib.lists) isList; + inherit (lib.types) enum either listOf package str; + inherit (lib.nvim.lua) expToLua; inherit (lib.nvim.types) mkGrammarOption; - inherit (lib.nvim.attrsets) mapListToAttrs; - inherit (lib.generators) mkLuaInline; cfg = config.vim.languages.r; @@ -51,16 +50,22 @@ }; }; - defaultServers = ["r_language_server"]; + defaultServer = "r_language_server"; servers = { r_language_server = { - enable = true; - cmd = [(getExe r-with-languageserver) "--no-echo" "-e" "languageserver::run()"]; - filetypes = ["r" "rmd" "quarto"]; - root_dir = mkLuaInline '' - function(bufnr, on_dir) - on_dir(vim.fs.root(bufnr, '.git') or vim.uv.os_homedir()) - end + 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}"}'' + } + } ''; }; }; @@ -76,10 +81,17 @@ in { lsp = { enable = mkEnableOption "R LSP support" // {default = config.vim.lsp.enable;}; - servers = mkOption { + server = mkOption { description = "R LSP server to use"; - type = listOf (enum (attrNames servers)); - default = defaultServers; + 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; }; }; @@ -115,12 +127,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.r-lsp = servers.${cfg.lsp.server}.lspConfig; }) ]); }