Python中如何解决Neovim的代码检查与补全问题

Neovim 采用 nvim-cmp + pyright 进行 Python 代码检查、补全,但是对于复杂的代码,譬如自定义类,继承自父类的一些属性、方法就检测不到,提示错误。如图: 自定义类 MoneyAgent 中有继承自父类 CellAgent 的对象 cell ,cell 具有属性 neighborhood ,pyright 完全意识不到。 请教: 1 、是不是有设置方法可以改进、提升 2 、除了 pyright 或者 nvim-cmp ,是不是还有更好的补全工具? 谢谢,请各位 V 友不吝赐教。


Python中如何解决Neovim的代码检查与补全问题

6 回复

我觉得应该是 lsp 能力有限, 之前在 vsc 上试过也是一样的, 嵌套过深就不行, 最终还是得用 ide.包括 pyrefly 的跳转也是完全不能用.


针对在Neovim中配置Python代码检查与补全的问题,核心在于集成LSP(Language Server Protocol)和代码补全引擎。以下是基于当前最佳实践的完整配置方案。

1. 核心工具选择

  • LSP客户端: nvim-lspconfig (Neovim内置LSP客户端的配置助手)
  • Python语言服务器: pyright (微软出品,类型检查精准) 或 ruff-lsp (基于Ruff,速度极快)
  • 补全引擎: nvim-cmp (当前社区最主流的补全插件)

2. 完整配置示例 (init.lua)

假设你已使用包管理器(如 lazy.nvim)。以下是一个最小化但功能完整的配置:

-- 1. 安装必要的插件
local plugins = {
  -- LSP配置与管理器
  {
    "neovim/nvim-lspconfig",
    dependencies = {
      "williamboman/mason.nvim",           -- 用于安装LSP、linter等工具
      "williamboman/mason-lspconfig.nvim", -- 连接mason和lspconfig的桥梁
    },
  },
  -- 补全引擎
  {
    "hrsh7th/nvim-cmp",
    dependencies = {
      "hrsh7th/cmp-nvim-lsp",           -- LSP作为补全源
      "hrsh7th/cmp-buffer",             -- 缓冲区文本作为补全源
      "hrsh7th/cmp-path",               -- 文件路径作为补全源
      "L3MON4D3/LuaSnip",               -- 代码片段引擎
      "saadparwaiz1/cmp_luasnip",       -- 代码片段作为补全源
    },
  },
}

-- 使用lazy.nvim加载插件(请根据你的包管理器调整)
require("lazy").setup(plugins)

-- 2. 配置mason自动安装语言服务器
require("mason").setup()
require("mason-lspconfig").setup({
  ensure_installed = { "pyright" }, -- 或 "ruff_lsp"
})

-- 3. 配置LSP客户端
local lspconfig = require("lspconfig")
local on_attach = function(client, bufnr) -- 通用LSP附件配置
  local opts = { buffer = bufnr, remap = false }
  -- 快捷键映射示例
  vim.keymap.set("n", "gd", vim.lsp.buf.definition, opts)          -- 跳转到定义
  vim.keymap.set("n", "K", vim.lsp.buf.hover, opts)                -- 悬停文档
  vim.keymap.set("n", "<leader>rn", vim.lsp.buf.rename, opts)      -- 重命名
  vim.keymap.set("n", "<leader>ca", vim.lsp.buf.code_action, opts) -- 代码操作
end

-- 为pyright配置LSP
lspconfig.pyright.setup({
  on_attach = on_attach,
  settings = {
    pyright = {
      -- 禁用与类型检查器(如mypy)的重叠功能
      disableOrganizeImports = false,
      analysis = {
        typeCheckingMode = "basic", -- 可设置为 "strict" 进行更严格检查
        autoSearchPaths = true,
        useLibraryCodeForTypes = true,
      },
    },
  },
})

-- 4. 配置nvim-cmp补全引擎
local cmp = require("cmp")
cmp.setup({
  snippet = {
    expand = function(args)
      require("luasnip").lsp_expand(args.body)
    end,
  },
  mapping = cmp.mapping.preset.insert({
    ["<C-b>"] = cmp.mapping.scroll_docs(-4),
    ["<C-f>"] = cmp.mapping.scroll_docs(4),
    ["<C-Space>"] = cmp.mapping.complete(),
    ["<C-e>"] = cmp.mapping.abort(),
    ["<CR>"] = cmp.mapping.confirm({ select = true }), -- 回车确认补全
  }),
  sources = cmp.config.sources({
    { name = "nvim_lsp" }, -- LSP
    { name = "luasnip" },  -- 代码片段
  }, {
    { name = "buffer" },   -- 缓冲区文本
    { name = "path" },     -- 文件路径
  }),
})

3. 安装与验证步骤

  1. 保存配置: 将以上配置写入你的Neovim配置文件(通常为 ~/.config/nvim/init.lua)。
  2. 重启Neovim: 重启后,包管理器会自动安装配置中声明的插件。
  3. 安装语言服务器: 在Neovim中执行 :Mason 命令,确保 pyrightruff_lsp 已安装。
  4. 验证: 打开一个Python文件,输入 import os 后键入 .,应触发补全建议。使用 gd 应能跳转到定义。

4. 高级优化建议

  • 格式化: 可安装 null-ls.nvimconform.nvim 并集成 blackisort 进行自动格式化。
  • 诊断UI: 安装 nvim-lint 进行实时语法检查,或使用 trouble.nvim 美化诊断信息显示。
  • 项目管理: 对于复杂项目,在项目根目录创建 pyproject.tomlsetup.cfg 能帮助LSP更好地理解你的代码结构和依赖。

总结建议:采用 nvim-lspconfig + pyright/ruff-lsp + nvim-cmp 的组合是当前最高效稳定的方案。

或许可以试试 basepyright

一样的,存在同样的问题。

给 cell 手动加个 type hint 就好了,比如 def init(self, model, cell: CLASS_TYPE)

pylance /pyrefly/ty
虽然 ty/prefly 有很多功能没有支持
可以用 pylance 的 crack 版本 delance😄

回到顶部