Neovim中的lspconfig升级修复

2025-09-26 15:16 在更新ArchLinux后,再打开Neovim后提示

1
2
The `require('lspconfig')` "framework" is deprecated, use vim.lsp.config (see :help lspconfig-nvim-0.11) instead.
Feature will be removed in nvim-lspconfig v3.0.0

问题解读

你遇到的这个提示意味着你正在使用的 nvim-lspconfig 插件版本已经弃用了旧的配置方式,需要迁移到新的 Neovim 内置接口。新旧语法对照如下:

配置方面旧语法(己弃用)新语法(Neovim 0.11+)
基本服务器配置require('lspconfig').pyright.setup({…})vim.lsp.config('pyright',{…})
启用服务器在setup后自动或通过其他机制调用vim.lsp.enable('server_name')
通用配置(如按键映射)在单个服务器的setup的on_attach中定义使用vim.api.nvim_create_autocmd监听"LspAttach"事件

迁移步骤与示例

  1. 更新Neovim和插件: 确保你的 Neovim 版本在 0.11.0 或以上,因为新的 vim.lsp.config API 是从这个版本开始引入的。同时,将你的 nvim-lspconfig 插件更新到最新版本。

  2. 重写配置语法:找到你配置文件中所有使用 require(’lspconfig’).XX.setup({…}) 的地方,将其改为新的格式。

  3. 迁移实例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
-- 这是已弃用的旧写法
require('lspconfig').pyright.setup({
  settings = {
    python = {
      analysis = {
        typeCheckingMode = "strict"
      }
    }
  },
  on_attach = function(client, bufnr)
    -- 一些按键映射...
  end
})
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
-- 使用新的 API 进行配置
vim.lsp.config('pyright', {
  settings = {
    python = {
      analysis = {
        typeCheckingMode = "strict"
      }
    }
  }
})
-- 启用这个服务器
vim.lsp.enable('pyright')
  1. 处理全局设置(如按键映射) : 在新的模式中,建议将通用的、不针对特定语言服务器的设置(如按键映射)通过全局的 LspAttach 自动命令来设置。这可以避免为每个服务器重复编写 on_attach 函数。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
-- 定义一个通用的附加回调函数
local my_on_attach = function(client, bufnr)
  -- 在这里设置你的按键映射等通用配置
  vim.keymap.set('n', 'gd', vim.lsp.buf.definition, { buffer = bufnr, desc = 'Goto Definition' })
  vim.keymap.set('n', 'K', vim.lsp.buf.hover, { buffer = bufnr, desc = 'Hover Documentation' })
  -- ... 其他映射
end

-- 使用自动命令在LSP客户端附加到缓冲区时应用这个函数
vim.api.nvim_create_autocmd("LspAttach", {
  callback = function(args)
    local client = vim.lsp.get_client_by_id(args.data.client_id)
    local bufnr = args.buf
    my_on_attach(client, bufnr)
  end
})

验证与排查

完成修改后,你可以通过以下方式验证配置是否正确:

  • 重新加载你的配置文件(例如执行 :source $MYVIMRC)。

  • 打开一个相关类型的文件(如 .lua 文件),使用 :LspInfo 命令查看对应的语言服务器(如 lua_ls)是否正常启动。

  • 如果服务器没有启动,检查 Neovim 的 :messages 或 LSP 日志(通过 :LspLog)来排查错误。