diff --git a/lua/config/lsp.lua b/lua/config/lsp.lua index 6d0b286..8cd83d5 100644 --- a/lua/config/lsp.lua +++ b/lua/config/lsp.lua @@ -3,6 +3,7 @@ local api = vim.api local keymap = vim.keymap local lsp = vim.lsp local diagnostic = vim.diagnostic +local lspconfig = require("lspconfig") local utils = require("utils") @@ -114,69 +115,97 @@ local custom_attach = function(client, bufnr) end local capabilities = require('cmp_nvim_lsp').default_capabilities() + -- required by nvim-ufo capabilities.textDocument.foldingRange = { dynamicRegistration = false, lineFoldingOnly = true } -local lspconfig = require("lspconfig") +-- For what diagnostic is enabled in which type checking mode, check doc: +-- https://github.com/microsoft/pyright/blob/main/docs/configuration.md#diagnostic-settings-defaults +-- Currently, the pyright also has some issues displaying hover documentation: +-- https://www.reddit.com/r/neovim/comments/1gdv1rc/what_is_causeing_the_lsp_hover_docs_to_looks_like/ -if utils.executable("pylsp") then - local venv_path = os.getenv('VIRTUAL_ENV') - local py_path = nil - -- decide which python executable to use for mypy - if venv_path ~= nil then - py_path = venv_path .. "/bin/python3" - else - py_path = vim.g.python3_host_prog - end +if utils.executable('pyright') then + local new_capability = { + -- this will remove some of the diagnostics that duplicates those from ruff, idea taken and adapted from + -- here: https://github.com/astral-sh/ruff-lsp/issues/384#issuecomment-1989619482 + textDocument = { + publishDiagnostics = { + tagSupport = { + valueSet = { 2 } + } + } + } + } + local merged_capability = vim.tbl_deep_extend("force", capabilities, new_capability) - lspconfig.pylsp.setup { + lspconfig.pyright.setup { + cmd = { "delance-langserver", "--stdio" }, on_attach = custom_attach, + -- capabilities = merged_capability, + capabilities = capabilities, settings = { - pylsp = { - plugins = { - -- formatter options - black = { enabled = true }, - autopep8 = { enabled = false }, - yapf = { enabled = false }, - -- linter options - pylint = { enabled = true, executable = "pylint" }, - ruff = { enabled = false }, - pyflakes = { enabled = false }, - pycodestyle = { enabled = false }, - -- type checker - pylsp_mypy = { - enabled = true, - overrides = { "--python-executable", py_path, true }, - report_progress = true, - live_mode = false + pyright = { + -- disable import sorting and use Ruff for this + disableOrganizeImports = true, + disableTaggedHints = false, + }, + python = { + analysis = { + autoSearchPaths = true, + diagnosticMode = "workspace", + typeCheckingMode = "standard", + useLibraryCodeForTypes = true, + -- we can this setting below to redefine some diagnostics + diagnosticSeverityOverrides = { + deprecateTypingAliases = false, + }, + -- inlay hint settings are provided by pylance? + inlayHints = { + callArgumentNames = "partial", + functionReturnTypes = true, + pytestParameters = true, + variableTypes = true, }, - -- auto-completion options - jedi_completion = { fuzzy = true }, - -- import sorting - isort = { enabled = true }, }, }, }, - flags = { - debounce_text_changes = 200, - }, - capabilities = capabilities, } else - vim.notify("pylsp not found!", vim.log.levels.WARN, { title = "Nvim-config" }) + vim.notify("pyright not found!", vim.log.levels.WARN, { title = 'Nvim-config' }) end --- if utils.executable('pyright') then --- lspconfig.pyright.setup{ --- on_attach = custom_attach, --- capabilities = capabilities --- } --- else --- vim.notify("pyright not found!", vim.log.levels.WARN, {title = 'Nvim-config'}) --- end +if utils.executable("ruff") then + require('lspconfig').ruff.setup({ + on_attach = custom_attach, + capabilities = capabilities, + init_options = { + -- the settings can be found here: https://docs.astral.sh/ruff/editors/settings/ + settings = { + organizeImports = true, + } + } + }) +end + +-- Disable ruff hover feature in favor of Pyright +vim.api.nvim_create_autocmd("LspAttach", { + group = vim.api.nvim_create_augroup('lsp_attach_disable_ruff_hover', { clear = true }), + callback = function(args) + local client = vim.lsp.get_client_by_id(args.data.client_id) + -- vim.print(client.name, client.server_capabilities) + + if client == nil then + return + end + if client.name == 'ruff' then + client.server_capabilities.hoverProvider = false + end + end, + desc = 'LSP: Disable hover capability from Ruff', +}) if utils.executable("ltex-ls") then lspconfig.ltex.setup {