欢迎光临
我们一直在努力

LazyVim 15.x 如何用原生 vim.lsp.config 配置 LSP 服务器并添加服务器级 keys?

LazyVim 15.x 如何用原生 vim.lsp.config 配置 LSP 服务器并添加服务器级 keys?

【免费下载链接】LazyVim Neovim config for the lazy 【免费下载链接】LazyVim 项目地址: https://gitcode.com/GitHub_Trending/la/LazyVim

从 15.x 开始,LazyVim 要求 Neovim >= 0.11.2(需带 LuaJIT 编译),并移除了针对 Neovim < 0.11.2 的兼容代码。这带来一个直接影响:LazyVim 不再通过旧式 lspconfig 的方式注册 LSP 服务器,而是改用 Neovim 原生的 vim.lsp.config 来配置,同时 mason.nvim 与 mason-lspconfig.nvim 也迁移到了 v2.x。也就是说,升级后你之前写 lspconfig 风格 on_attach 的做法已经过时——现在应该在 servers 表里为每个服务器配置 settings,并在服务器的 keys 字段里定义该服务器专用的按键映射。

本文围绕一条完整路径展开:在 LazyVim 15.x 中声明(或覆盖)某个 LSP 服务器、为它添加服务器级 keymaps,并确认这些配置真正生效。

15.x 中 LSP 配置的加载机制

先看清楚配置是如何被应用的,后面写配置才不会落空。LazyVim 在 lsp 插件定义 中做了以下事情:

  • 全局默认配置走 vim.lsp.config("*", …):opts.servers["*"] 的内容(capabilities 和默认 keymaps,如 gd 跳转定义、gr 查引用、K 悬停、<leader>ca code action 等)会通过 vim.lsp.config("*", opts.servers["*"]) 注册为所有客户端的默认值。
  • 每个具体服务器走 vim.lsp.config(server, sopts):遍历 opts.servers 的每个键,把该服务器的配置交给原生 vim.lsp.config。
  • 启用方式二选一:
    • 如果服务器在 mason-lspconfig 的映射表里且没有设置 mason = false,则由 mason-lspconfig 的 automatic_enable 负责启用(并可通过 Mason 自动安装);
    • 否则直接调用 vim.lsp.enable(server)。
  • keymaps 由 LazyVim 统一注册:对每个带 keys 字段的服务器,LazyVim 会调用 keymaps.set,以服务器名为过滤条件把按键映射注册到 Snacks.keymap 上,无需自己写 on_attach。
  • opts_extend = { "servers.*.keys" }:这意味着你在插件 spec 里为某个服务器写的 keys 会与默认配置中的 servers.<name>.keys 做表合并,而不是整体替换,所以覆盖某个默认映射时可以只写差异部分。
  • 另外两点行为值得注意(都来自 lsp/init.lua):

    • setup 表可以为某个服务器提供自定义安装函数:setup[server](或 setup["*"] 兜底)返回 true 时,该服务器会被排除在 mason 自动安装/启用之外,由你自行接管;
    • enabled = false 的服务器同样会被排除出 Mason 的自动安装列表。

    在哪里写配置

    LazyVim 通过 lazy.nvim 加载 neovim/nvim-lspconfig 这个插件 spec。lazy.nvim 会自动合并同名插件的 spec,所以把覆盖内容写成 lua/plugins/*.lua 下的一个文件即可(README 中也确认了 lua/plugins 目录下的 spec 会被自动加载):

    — ~/.config/nvim/lua/plugins/lsp.lua
    return {
    {
    "neovim/nvim-lspconfig",
    opts = {
    servers = {
    — 服务器名 = 原生 vim.lsp.Config(可再附加 mason/enabled/keys 字段)
    },
    },
    },
    }

    servers 里每个条目最终被当作 vim.lsp.Config 传给 vim.lsp.config(server, sopts)(类型注解为 vim.lsp.Config | {mason?: boolean, enabled?: boolean, keys?: LazyKeysLspSpec[]}),所以 cmd、filetypes、root_markers、settings、capabilities 等原生字段都按 Neovim 原生语义书写,额外字段只有 mason、enabled、keys 三个。

    添加服务器级 keys

    keys 里的每一项遵循 lazy.nvim 的按键格式,并支持两个 LSP 专属字段(定义见 keymaps.lua):

    • has = "definition":只有当某个客户端支持该 LSP 能力时才启用此映射。不带 / 的方法名会自动补上 textDocument/ 前缀;
    • enabled = function(buf) … end:自定义启用条件。

    LazyVim 内置的 servers["*"].keys 就大量使用了这种写法,例如 { "gd", vim.lsp.buf.definition, desc = "Goto Definition", has = "definition" } 和 { "K", function() return vim.lsp.buf.hover() end, desc = "Hover" }。

    一个完整示例:启用 lua_ls 并给它加一条专用 keymap(<localleader>e 触发 rust 风格的服务器命令是 CONTRIBUTING.md 中给出的官方示例格式,这里换成 lua 场景演示结构):

    return {
    {
    "neovim/nvim-lspconfig",
    opts = {
    servers = {
    lua_ls = {
    mason = false, — 设为 false 可阻止 mason 自动安装该服务器
    settings = {
    Lua = {
    workspace = {
    checkThirdParty = false,
    },
    hint = {
    enable = true,
    },
    },
    },
    keys = {
    { "<localleader>h", vim.lsp.buf.type_definition, desc = "Goto Type Definition", has = "typeDefinition" },
    },
    },
    },
    },
    },
    }

    说明几个要点:

    • settings 的内容原样透传给该服务器进程,写法与你直接写 vim.lsp.config 时一致;
    • keys 条目会由 LazyVim 以该服务器名为过滤条件自动注册,不需要再写 client:on_attach 之类的回调;
    • 由于 opts_extend 只合并 servers.*.keys,这里的 keys 会与默认的全局 keymaps 合并生效,不要重复定义 gd、K 这类默认映射,除非确有必要。CONTRIBUTING.md 也明确建议:语言专用映射用 <localleader>,LSP 相关 keymaps 写在服务器的 keys 字段而不是 on_attach。

    自定义安装路径与禁用服务器

    有两种情况你会绕过默认的 vim.lsp.config + Mason 流程:

  • 服务器不在 Mason 里,或需要自定义安装逻辑:在 setup 表里为该服务器(或 "*" 兜底)提供函数。函数返回 true 表示该服务器不由 LazyVim 自动设置,例如 lsp/init.lua 中的注释示例:
  • opts = {
    setup = {
    — 用 typescript.nvim 接管 tsserver
    — tsserver = function(_, opts)
    — require("typescript").setup({ server = opts })
    — return true
    — end,
    },
    }

  • 完全不启用某个服务器:直接给 enabled = false,它会被排除出 Mason 自动安装列表。
  • 验证配置是否生效

    • 查看 LSP 状态:在文件内按 <leader>cl 打开 LSP 信息视图。该映射定义在默认 servers["*"].keys 中,调用 Snacks.picker.lsp_config(),可以确认对应服务器的客户端已附加到当前 buffer。
    • 检查工具链安装:Mason 通过 <leader>cm 打开(默认 ensure_installed 为 stylua、shfmt),用于查看和安装 LSP 服务器二进制。
    • 升级后的整体健康检查:15.x 的 NEWS.md 建议更新后运行 :checkhealth nvim-treesitter(新版 treesitter 安装 parser 依赖 tree-sitter CLI)。
    • keymaps 是否注册:触发你新增的映射(如 <localleader>h)应执行对应动作;若映射带 has 条件而未生效,说明当前客户端未上报该能力,这正是 has 过滤的预期行为,而不是配置错误。

    限制与迁移注意

    • 旧版通过 require("lazyvim.plugins.lsp.keymaps").get() 添加 LSP 按键映射的方式已标记 @deprecated,调用时会发出警告,提示改用服务器配置里的 keys 字段(见 keymaps.lua);
    • 顶层 opts.capabilities 同样废弃,应写在 servers["*"].capabilities 中,使用旧字段会触发 LazyVim.deprecate 提示并自动迁移;
    • mason = false 的服务器不会走 Mason 安装,需确保二进制已在 PATH 中,否则 vim.lsp.enable 后无法启动客户端——该字段语义在源码注释中明确为"set to false if you don't want this server to be installed with mason"。

    按以上步骤完成 lua/plugins/lsp.lua 的编写后,重启 Neovim,打开对应语言文件,用 <leader>cl 确认服务器附加成功、新增 keymap 可正常触发,即完成 LazyVim 15.x 下的原生 LSP 配置与服务器级 keys 添加。

    【免费下载链接】LazyVim Neovim config for the lazy 【免费下载链接】LazyVim 项目地址: https://gitcode.com/GitHub_Trending/la/LazyVim

    创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

    赞(0)
    未经允许不得转载:171主机测评 » LazyVim 15.x 如何用原生 vim.lsp.config 配置 LSP 服务器并添加服务器级 keys?
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址