如何禁用pylsp内置linter 解决Neovim编辑Python卡顿重复提示问题
问题概述
- 运行环境:Neovim 0.6.1,使用nvim-lint管理pylint做代码检查,pylsp提供代码补全、悬停文档、签名帮助能力
- 故障表现:
- 编辑导入numpy、scipy等重型科学计算库的Python文件时,补全、悬停、签名帮助响应卡顿,单核心CPU占用达100%
- 编辑器内出现重复的lint提示
- 手动在pylsp配置中关闭内置linter插件后配置未生效,重复提示问题依然存在
- 原有配置如下:
opts = { cmd = { "pylsp" }, filetypes = { "python" }, root_dir = function() return vim.fn.getcwd() end, single_file_support = true, configurationSources = {""}, -- default is pycodestyle rope = {extensionModules = "", ropeFolder = {} }, plugins = { jedi_completion = { enabled = true, eager = true, cache_for = {"numpy", "scipy"} }, jedi_definition = { enabled = true, follow_imports = true, follow_builtin_imports = true, }, jedi_hover = { enabled = true }, jedi_references = { enabled = true }, jedi_signature_help = { enabled = true }, jedi_symbols = { enabled = true, all_scopes = true, include_import_symbols = true }, preload = { enabled = true, modules = {"numpy", "scipy"} }, mccabe = { enabled = false }, mypy = { enabled = false }, isort = { enabled = false }, spyder = { enabled = false }, memestra = { enabled = false }, pycodestyle = { enabled = false }, -- not work flake8 = { enabled = false }, pyflakes = { enabled = false }, yapf = { enabled = false }, pylint = { enabled = false, args = { "-f", "json", "--rcfile=" .. "~/.pylintrc" } }, rope = { enabled = false }, rope_completion = { enabled = false, eager = false }, }, } pylsp.setup(opts)
故障原因
- 配置层级错误:pylsp的所有功能开关、插件配置必须放在
settings.pylsp命名空间下才能被LSP客户端传递给服务端。原有配置把插件配置、configurationSources、rope配置直接平铺在opts根目录,这些配置不会被pylsp进程读取,因此内置linter始终处于开启状态,和nvim-lint运行的pylint产生重复提示。 - 性能参数配置不合理:开启
preload模块预加载+jedi_completion.eager = true是CPU占满、响应卡顿的核心原因。numpy、scipy包含大量C扩展接口,全量解析的计算量极高;eager模式会在触发补全时提前解析所有补全项的全量信息,而非按需加载,直接阻塞LSP响应线程;预加载逻辑会在打开文件时就全量解析指定库,进一步拉高CPU占用。 - 存在无效配置:根目录下的
rope、configurationSources不属于nvim-lspconfig的启动参数,放在根目录不会被任何程序识别。
修复方案
使用以下修正后的配置替换原有配置即可:
opts = { cmd = { "pylsp" }, filetypes = { "python" }, root_dir = function() return vim.fn.getcwd() end, single_file_support = true, -- 所有pylsp服务端配置必须放在settings.pylsp层级下 settings = { pylsp = { configurationSources = {}, plugins = { -- Jedi补全性能优化 jedi_completion = { enabled = true, eager = false, -- 关闭eager预解析,选中补全项时再加载详情 cache_for = {"numpy", "scipy"} -- 保留重型库缓存逻辑 }, jedi_definition = { enabled = true, follow_imports = true, follow_builtin_imports = true, }, jedi_hover = { enabled = true }, jedi_references = { enabled = true }, jedi_signature_help = { enabled = true }, jedi_symbols = { enabled = true, all_scopes = true, include_import_symbols = true }, preload = { enabled = false }, -- 关闭模块预加载,避免打开文件时CPU打满 -- 全量禁用pylsp内置的检查、格式化插件,避免和外部工具冲突 mccabe = { enabled = false }, mypy = { enabled = false }, isort = { enabled = false }, spyder = { enabled = false }, memestra = { enabled = false }, pycodestyle = { enabled = false }, flake8 = { enabled = false }, pyflakes = { enabled = false }, yapf = { enabled = false }, pylint = { enabled = false }, rope = { enabled = false }, rope_completion = { enabled = false }, autopep8 = { enabled = false }, black = { enabled = false } } } } } pylsp.setup(opts)
关键修改点说明
- 修正配置层级:将所有pylsp服务端配置移动到
settings.pylsp下,确保插件禁用规则能被服务端正确读取,彻底解决重复lint提示问题。 - 关闭eager补全模式:补全触发时只返回补全项列表,选中对应项时再加载文档、签名信息,大幅降低重型库场景下的补全延迟。
- 关闭预加载功能:取消打开文件时对numpy、scipy的全量解析,依赖jedi自带的缓存机制,首次访问接口后自动缓存结果,不会影响后续使用速度。
- 补全autopep8、black两个默认可能开启的格式化插件的禁用规则,避免后续和独立格式化工具产生冲突。
配置生效验证
重启Neovim后打开任意Python文件,执行以下命令查看pylsp实际加载的配置:
:LspInfo
确认pylsp处于已附加状态后,执行以下命令打印服务端配置,检查plugins下所有linter、格式化插件的enabled字段均为false即代表配置生效:
:lua print(vim.inspect(vim.lsp.get_active_clients({name = "pylsp"})[1].settings))
生效后编辑numpy、scipy文件时CPU占用会回落至正常水平,补全响应延迟可控制在100ms内,重复lint提示会完全消失。
内容的提问来源于stack exchange,提问作者daiweihero
相关产品推荐
相关产品推荐

