From 9769c24633e9302528bd04850e2acd70e2e16062 Mon Sep 17 00:00:00 2001 From: jdhao Date: Tue, 5 Nov 2024 22:07:09 +0100 Subject: [PATCH] Switch Python LSP for completion and add ruff pyright servers type checking, completion, and ruff servers linting and diagnostics (ruff can also format Python files, but it is slightly different from black) --- lua/config/lsp.lua | 119 ++++++++++++++++++++++++++++----------------- 1 file changed, 74 insertions(+), 45 deletions(-) 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 {