diff --git a/lsp/lua_ls.lua b/lsp/lua_ls.lua new file mode 100644 index 0000000..2e40b98 --- /dev/null +++ b/lsp/lua_ls.lua @@ -0,0 +1,15 @@ +return { + cmd = { "lua-language-server" }, + filetypes = { "lua" }, + root_markers = { { ".luarc.json", ".luarc.jsonc" }, ".git" }, + settings = { + Lua = { + runtime = { + version = "LuaJIT", + }, + workspace = { + library = vim.api.nvim_get_runtime_file("", true), + }, + }, + }, +} diff --git a/lsp/python_ls.lua b/lsp/python_ls.lua new file mode 100644 index 0000000..2335ffe --- /dev/null +++ b/lsp/python_ls.lua @@ -0,0 +1,68 @@ +---@brief +--- +--- https://github.com/microsoft/pyright +--- +--- `pyright`, a static type checker and language server for python + +local function set_python_path(command) + local path = command.args + local clients = vim.lsp.get_clients { + bufnr = vim.api.nvim_get_current_buf(), + name = 'pyright', + } + for _, client in ipairs(clients) do + if client.settings then + client.settings.python = + vim.tbl_deep_extend('force', client.settings.python --[[@as table]], { 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 + +---@type vim.lsp.Config +return { + cmd = { 'pyright-langserver', '--stdio' }, + filetypes = { 'python' }, + root_markers = { + 'pyrightconfig.json', + 'pyproject.toml', + 'setup.py', + 'setup.cfg', + 'requirements.txt', + 'Pipfile', + '.git', + }, + ---@type lspconfig.settings.pyright + settings = { + python = { + analysis = { + autoSearchPaths = true, + useLibraryCodeForTypes = true, + diagnosticMode = 'openFilesOnly', + }, + }, + }, + on_attach = function(client, bufnr) + vim.api.nvim_buf_create_user_command(bufnr, 'LspPyrightOrganizeImports', function() + local params = { + command = 'pyright.organizeimports', + arguments = { vim.uri_from_bufnr(bufnr) }, + } + + -- Using client.request() directly because "pyright.organizeimports" is private + -- (not advertised via capabilities), which client:exec_cmd() refuses to call. + -- https://github.com/neovim/neovim/blob/c333d64663d3b6e0dd9aa440e433d346af4a3d81/runtime/lua/vim/lsp/client.lua#L1024-L1030 + ---@diagnostic disable-next-line: param-type-mismatch + client.request('workspace/executeCommand', params, nil, bufnr) + end, { + desc = 'Organize Imports', + }) + vim.api.nvim_buf_create_user_command(bufnr, 'LspPyrightSetPythonPath', set_python_path, { + desc = 'Reconfigure pyright with the provided python path', + nargs = 1, + complete = 'file', + }) + end, +} diff --git a/lua/config/lsp.lua b/lua/config/lsp.lua index b340521..e5640b2 100644 --- a/lua/config/lsp.lua +++ b/lua/config/lsp.lua @@ -1,51 +1,9 @@ vim.o.autocomplete = true vim.o.complete = ".^5,t^3,w,o" vim.o.pummaxwidth = 40 -vim.o.completeopt = 'menu,menuone,noselect' +vim.o.completeopt = "menu,menuone,noselect" -vim.lsp.config["lua"] = { - cmd = { "lua-language-server" }, - filetypes = { "lua" }, - root_markers = { { ".luarc.json", ".luarc.jsonc" }, ".git" }, - settings = { - Lua = { - runtime = { - version = "LuaJIT", - }, - workspace = { - library = vim.api.nvim_get_runtime_file("", true), - }, - }, - }, -} -vim.lsp.enable("lua") - -vim.lsp.config["python"] = { - cmd = { "pyright-langserver", "--stdio" }, - filetypes = { "python" }, - root_markers = { - "pyproject.toml", - ".git", - }, - settings = { - python = { - analysis = { - autoSearchPaths = true, - diagnosticMode = "workspace", - useLibraryCodeForTypes = true, - }, - }, - }, -} - -vim.lsp.enable("python") - --- vim.api.nvim_create_autocmd("LspAttach", { --- callback = function(args) --- local client = vim.lsp.get_client_by_id(args.data.client_id) --- --- if client:supports_method("textDocument/completion") then --- vim.bo[args.buf].omnifunc = "v:lua.vim.lsp.omnifunc" --- end --- end, --- }) +vim.lsp.enable({ + "lua_ls", + "python_ls" +})