📚 Neovim 学习系列
阶段一至四 ✅
✓ 01-04 安装→核心操作→多文件管理→Lua配置
阶段五:插件管理 ✅
✓ 05 插件管理
阶段六:LSP 与补全
06 LSP 与补全(当前篇)
阶段七至八共2篇,后续持续更新
读完本篇你将能:用 Mason.nvim 安装语言服务器和格式化工具,用 Neovim 0.12 原生 vim.lsp.config 配置各语言 LSP,用 blink.cmp 获得代码补全,用 Tree-sitter 获得精准语法高亮和代码折叠。
📑 本文目录
01Mason.nvim 工具安装
02Neovim 0.12 原生 LSP 配置
03blink.cmp 补全引擎
04Tree-sitter 语法高亮与折叠
05格式化与 Lint

Neovim LSP 与补全:从编辑器到 IDE 的分水岭

难度:高阶 | 阅读约 25 分钟

01 Mason.nvim 工具安装

LSP(Language Server Protocol)是语言服务器协议——一个独立于编辑器的"代码理解引擎"。它负责分析你的代码,提供跳转定义、自动补全、错误诊断等功能。但每种语言的 LSP 服务器安装方式不同:Python 的 pyright 要 npm install,C 的 clangd 要 brew install。Mason.nvim 统一了这些安装——在 Neovim 内部用 :Mason 面板一键安装所有工具。

Lua
{ "williamboman/mason.nvim", lazy = false, opts = {} }

安装后用 :Mason 打开面板,可以浏览和安装 LSP 服务器、格式化工具、linter。也可以用命令直接安装::MasonInstall pyright ruff clangd。

💡 小贴士
Mason 装的工具在 ~/.local/share/nvim/mason/bin/ 目录下。Neovim 的 LSP 配置会自动从这个路径找到它们,你不需要手动设置 PATH。但如果你在终端直接运行 pyright 会找不到——这些工具只在 Neovim 内可用。

02 Neovim 0.12 原生 LSP 配置

Neovim 0.12 引入了原生的 LSP 配置 API:vim.lsp.config() 和 vim.lsp.enable()。网上旧教程用的 require('lspconfig').xxx.setup{} 已过时——0.12 不再需要 nvim-lspconfig 插件。

配置一个语言服务器的过程分两步:用 vim.lsp.config() 定义配置,再用 vim.lsp.enable() 启用:

Lua (~/.config/nvim/lsp/)
-- ~/.config/nvim/lsp/pyright.lua
return {
cmd = { "pyright-langserver", "--stdio" },
filetypes = { "python" },
root_markers = { "pyproject.toml", ".git" },
settings = {
python = { analysis = { typeCheckingMode = "basic" } },
},
}
Lua (~/.config/nvim/init.lua)
-- 启用语言服务器
vim.lsp.enable("pyright")
vim.lsp.enable("clangd")
vim.lsp.enable("lua_ls")

Neovim 0.12 会自动从 ~/.config/nvim/lsp/ 目录加载以 .lua 结尾的配置文件,文件名就是服务器名。root_markers 决定项目根目录——打开文件时 Neovim 向上查找这些文件,找到后以该目录作为项目根。

LSP 启用后,Neovim 内置了以下跳转和诊断快捷键(Neovim 0.12 已默认绑定):

快捷键 功能
gd 跳到定义
gr 查看引用
K 悬浮文档
gD 跳到声明
gra 代码操作(Code Action)
grn 重命名符号
⚠️ 常见错误
按网上教程安装 nvim-lspconfig 插件来配置 LSP — Neovim 0.12 已经内置了 LSP 配置能力,不需要 nvim-lspconfig。旧教程基于 0.11 及更早版本,用的是 require('lspconfig').pyright.setup{} 语法。0.12 用 vim.lsp.config() + vim.lsp.enable() 更简洁。
✓ 正确:用 :checkhealth lsp 确认 LSP 状态,按 :LspInfo 查看当前文件的 LSP 连接情况

03 blink.cmp 补全引擎

LSP 提供补全数据,但需要一个"补全引擎"来接收和展示。blink.cmp 是 2026 年的推荐方案——Rust 核心实现,0.5-4ms 按键响应,LSP / buffer / path / snippet 四个补全源全部内置,不需要额外配插件。

blink.cmp v1.10.0 于 2026 年 3 月发布,是 1.x 系列最终版本。它要求 Neovim 0.12+,模糊匹配已迁移到 stable Rust 构建。

Lua
{
"saghen/blink.cmp",
dependencies = {
"saghen/blink.lib",
"rafamadriz/friendly-snippets",
},
version = "1.*",
opts = {
keymap = { preset = "default" },
sources = {
default = { "lsp", "path", "snippets", "buffer" },
},
},
}

安装后,在 Insert 模式中输入代码会自动弹出补全菜单。用 Tab 确认补全,Ctrl-n / Ctrl-p 上下选择候选项。friendly-snippets 提供常见代码片段——输入 for 后选择 snippet,会展开完整的 for 循环结构并跳转到填空位置。

Neovim 0.12 还新增了 vim.o.autocomplete 原生补全选项——不装任何插件就能获得基础的单词补全。但功能有限(只有 buffer 内单词),适合在安装 blink.cmp 前过渡体验。

04 Tree-sitter 语法高亮与折叠

传统语法高亮用正则匹配——快但不准确,复杂语法会出错。Tree-sitter 用解析树——构建代码的抽象语法树后精确高亮每一个节点。函数名、变量名、关键字、字符串、注释,每个节点都有明确类型。

nvim-treesitter 插件为每种语言安装对应的解析器:

Lua
{
"nvim-treesitter/nvim-treesitter",
build = ":TSUpdate",
opts = {
ensure_installed = { "python", "c", "lua", "javascript", "html", "css" },
highlight = { enable = true },
indent = { enable = true },
},
}

build = ":TSUpdate" 表示插件安装后自动运行 :TSUpdate 命令更新解析器。ensure_installed 列出要预装解析器的语言——首次启动会自动下载编译。

Tree-sitter 还驱动代码折叠——基于语法树的折叠比缩进折叠更精确。设置 vim.opt.foldmethod = "expr" 和 vim.opt.foldexpr = "v:lua.vim.treesitter.foldexpr()",用 zc 折叠、zo 展开。

05 格式化与 Lint

LSP 提供诊断和补全,但格式化和 lint 通常用独立工具——LSP 的格式化能力有限,而 dedicated formatter(如 ruff、prettier)更专业。

conform.nvim(格式化)

conform.nvim 是轻量级格式化管理器,按文件类型调用对应的格式化工具:

Lua
{
"stevearc/conform.nvim",
event = "BufWritePre",
opts = {
formatters_by_ft = {
python = { "ruff_format" },
c = { "clang_format" },
javascript = { "prettier" },
lua = { "stylua" },
},
format_on_save = { timeout_ms = 500 },
},
}

format_on_save 在保存文件时自动格式化。timeout_ms = 500 设置超时——格式化工具超过 500ms 没响应就跳过,避免保存卡顿。

nvim-lint(代码检查)

nvim-lint 在编辑时实时运行 linter,把警告和错误显示为虚拟文本或诊断标记:

Lua
{
"mfussenegger/nvim-lint",
event = "BufRead",
config = function()
require("lint").linters_by_ft = {
python = { "ruff" },
javascript = { "eslint_d" },
}
end,
}

这里用 config 函数而非 opts,因为 nvim-lint 的配置方式不是标准 .setup() 接口,需要手动 require 后设置 linters_by_ft。

各语言的工具链一览(都通过 Mason 安装):

语言 LSP 格式化 Lint
Python pyright ruff ruff
C/C++ clangd clang-format clangd 内置
HTML html-ls prettier —
CSS css-ls prettier stylelint
JavaScript ts_ls prettier eslint_d
Lua lua_ls stylua —
🎯 分级练习
基础(巩固记忆)
1.安装 Mason.nvim,用 :Mason 安装 pyright 和 ruff
2.创建 ~/.config/nvim/lsp/pyright.lua,用 vim.lsp.enable("pyright") 启用
3.打开一个 Python 文件,按 gd 跳到函数定义,按 K 查看悬浮文档
进阶(组合应用)
4.安装 blink.cmp,在 Python 文件中输入 import o 观察补全弹出 os 候选
5.安装 nvim-treesitter,配 ensure_installed = { "python", "c", "lua" },对比安装前后的高亮效果
6.配置 conform.nvim 保存时自动用 ruff 格式化 Python 代码
挑战(综合实战)
7.为 Python、C、Lua 三种语言配置完整的 LSP + 格式化 + Lint,在 :checkhealth 中确认全部正常
8.用 grn 重命名一个变量,确认全项目范围内的引用同步更新
#Mason.nvim #vim.lsp.config #blink.cmp #Tree-sitter #conform.nvim #代码折叠 #LSP诊断
下一篇预告
07 工作流集成 — LSP 让 Neovim 有了 IDE 的代码能力,下一篇将集成完整的开发工作流:Telescope 模糊搜索(文件 / grep / buffer)、文件管理器(neo-tree)、Git 集成(gitsigns)、DAP 调试器、内置终端——打造端到端的开发环境。