vim.lsp.config 配置各语言 LSP,用 blink.cmp 获得代码补全,用 Tree-sitter 获得精准语法高亮和代码折叠。LSP(Language Server Protocol)是语言服务器协议——一个独立于编辑器的"代码理解引擎"。它负责分析你的代码,提供跳转定义、自动补全、错误诊断等功能。但每种语言的 LSP 服务器安装方式不同:Python 的 pyright 要 npm install,C 的 clangd 要 brew install。Mason.nvim 统一了这些安装——在 Neovim 内部用 :Mason 面板一键安装所有工具。
安装后用 :Mason 打开面板,可以浏览和安装 LSP 服务器、格式化工具、linter。也可以用命令直接安装::MasonInstall pyright ruff clangd。
~/.local/share/nvim/mason/bin/ 目录下。Neovim 的 LSP 配置会自动从这个路径找到它们,你不需要手动设置 PATH。但如果你在终端直接运行 pyright 会找不到——这些工具只在 Neovim 内可用。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() 启用:
Neovim 0.12 会自动从 ~/.config/nvim/lsp/ 目录加载以 .lua 结尾的配置文件,文件名就是服务器名。root_markers 决定项目根目录——打开文件时 Neovim 向上查找这些文件,找到后以该目录作为项目根。
LSP 启用后,Neovim 内置了以下跳转和诊断快捷键(Neovim 0.12 已默认绑定):
| 快捷键 | 功能 |
|---|---|
gd |
跳到定义 |
gr |
查看引用 |
K |
悬浮文档 |
gD |
跳到声明 |
gra |
代码操作(Code Action) |
grn |
重命名符号 |
require('lspconfig').pyright.setup{} 语法。0.12 用 vim.lsp.config() + vim.lsp.enable() 更简洁。
:checkhealth lsp 确认 LSP 状态,按 :LspInfo 查看当前文件的 LSP 连接情况
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 构建。
安装后,在 Insert 模式中输入代码会自动弹出补全菜单。用 Tab 确认补全,Ctrl-n / Ctrl-p 上下选择候选项。friendly-snippets 提供常见代码片段——输入 for 后选择 snippet,会展开完整的 for 循环结构并跳转到填空位置。
Neovim 0.12 还新增了 vim.o.autocomplete 原生补全选项——不装任何插件就能获得基础的单词补全。但功能有限(只有 buffer 内单词),适合在安装 blink.cmp 前过渡体验。
传统语法高亮用正则匹配——快但不准确,复杂语法会出错。Tree-sitter 用解析树——构建代码的抽象语法树后精确高亮每一个节点。函数名、变量名、关键字、字符串、注释,每个节点都有明确类型。
nvim-treesitter 插件为每种语言安装对应的解析器:
build = ":TSUpdate" 表示插件安装后自动运行 :TSUpdate 命令更新解析器。ensure_installed 列出要预装解析器的语言——首次启动会自动下载编译。
Tree-sitter 还驱动代码折叠——基于语法树的折叠比缩进折叠更精确。设置 vim.opt.foldmethod = "expr" 和 vim.opt.foldexpr = "v:lua.vim.treesitter.foldexpr()",用 zc 折叠、zo 展开。
LSP 提供诊断和补全,但格式化和 lint 通常用独立工具——LSP 的格式化能力有限,而 dedicated formatter(如 ruff、prettier)更专业。
conform.nvim 是轻量级格式化管理器,按文件类型调用对应的格式化工具:
format_on_save 在保存文件时自动格式化。timeout_ms = 500 设置超时——格式化工具超过 500ms 没响应就跳过,避免保存卡顿。
nvim-lint 在编辑时实时运行 linter,把警告和错误显示为虚拟文本或诊断标记:
这里用 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 | — |
:Mason 安装 pyright 和 ruff~/.config/nvim/lsp/pyright.lua,用 vim.lsp.enable("pyright") 启用gd 跳到函数定义,按 K 查看悬浮文档import o 观察补全弹出 os 候选ensure_installed = { "python", "c", "lua" },对比安装前后的高亮效果:checkhealth 中确认全部正常grn 重命名一个变量,确认全项目范围内的引用同步更新