lsp.vim 配置指南:30+ 种语言服务器注册代码全收录
【免费下载链接】lspLanguage Server Protocol (LSP) plugin for Vim9项目地址: https://gitcode.com/gh_mirrors/lsp/lsp
如果你正在寻找一款轻量、纯 Vim9 脚本编写、无需 Neovim 也能畅享 Language Server Protocol(LSP)能力的插件,那么lsp.vim就是答案。本篇文章是一份面向新手的lsp.vim 配置指南,重点解决"语言服务器注册"这一核心问题,并一次性全收录 30+ 种语言服务器注册代码:从 clangd、gopls、rust-analyzer 到 pyright、tsserver、omnisharp,复制粘贴即可用,帮你快速搭建完整的 Vim 智能开发环境。✨
什么是 lsp.vim?为什么选择它?
lsp.vim 是 Language Server Protocol (LSP) 的 Vim 插件,要求 Vim 9.0 及以上版本,全程使用 Vim9 脚本编写,性能出色且零外部运行时依赖。
它支持的功能非常全面:代码补全、跳转定义、悬停文档、签名帮助、诊断信息、重命名、代码操作、折叠、Inlay Hints、语义高亮等 20+ 项 LSP 核心能力。更难得的是,它不依赖 Node.js、Python 等运行时,只要 Vim 本体即可工作。
快速开始:lsp.vim 安装与基础配置
使用 vim-plug 等插件管理器安装最省心,在.vimrc中加上:
call plug#begin('~/.vim/plugged') Plug 'yegappan/lsp' call plug#end()也可以手动安装到 packpath 中(packadd lsp后执行helptags生成帮助标签)。
安装完成后,最关键的一步就是注册语言服务器。lsp.vim 本身不打包任何语言服务器,你需要为所用语言单独安装对应的 server 可执行文件,再通过注册代码告诉插件"哪个 server 服务哪种文件类型"。完整的注册示例可参考官方文档 doc/configs.md,API 说明见 doc/lsp.txt。
理解 LspAddServer 注册语法
lsp.vim 通过LspAddServer()(或全局g:LspAddServer())函数注册服务器,接受一个字典列表,每个字典描述一个服务器。核心字段如下:
| 字段 | 说明 | 示例 |
|---|---|---|
name | 服务器名称,用于日志与调试 | 'clangd' |
filetype | 服务的文件类型,字符串或列表 | ['c', 'cpp'] |
path | 服务器可执行文件路径 | '/usr/local/bin/clangd' |
args | 启动参数列表 | ['--background-index'] |
syncInit | 是否同步等待初始化完成 | v:true |
rootSearch | 项目根目录识别标记 | ['*.cabal', 'hie.yaml'] |
initializationOptions | 传给服务器的初始化选项 | #{enable: v:true} |
workspaceConfig | 工作区配置(如 gopls、yaml schemas) | #{gopls: #{...}} |
注册逻辑的源码实现位于 autoload/lsp/lsp.vim 的AddServer()函数(约 L934 行),它会自动校验filetype和path是否有效,并支持ignoreMissingServer选项跳过缺失的服务器。
30+ 种语言服务器注册代码全收录
下面按语言分类给出注册代码,全部来自官方配置文件 doc/configs.md,你可以按需挑选。路径如与你的实际安装位置不符,直接改成你的可执行文件路径即可。
C/C++:clangd
call LspAddServer([#{name: 'clangd', \ filetype: ['c', 'cpp'], \ path: '/usr/local/bin/clangd', \ args: ['--background-index', '--clang-tidy'] \ }])Go:gopls
call LspAddServer([#{name: 'gopls', \ filetype: 'go', \ path: '/usr/local/bin/gopls', \ args: ['serve'] \ }])gopls 还支持 Inlay Hints,只需在注册代码中追加workspaceConfig里的hints配置,即可显示参数名、变量类型等提示。
Rust:rust-analyzer
call LspAddServer([#{name: 'rustanalyzer', \ filetype: ['rust'], \ path: '/usr/local/bin/rust-analyzer', \ args: [], \ syncInit: v:true \ }])Rust 项目通常较大,建议加上syncInit: v:true等待服务器初始化完成,避免首次操作卡顿。
Python:四种服务器任选
Python 生态选择最多,按需选用:
" Pyright(微软官方,类型检查强) call LspAddServer([#{name: 'pyright', \ filetype: 'python', \ path: '/usr/local/node_modules/.bin/pyright-langserver', \ args: ['--stdio'] \ }]) " Pylsp(python-lsp-server,社区经典) call LspAddServer([#{name: 'pylsp', \ filetype: 'python', \ path: '/usr/local/bin/pylsp', \ args: [] \ }]) " Jedi(轻量、启动快) call LspAddServer([#{name: 'jedi', \ filetype: 'python', \ path: '/usr/local/bin/jedi-language-server', \ args: [] \ }]) " Ruff(Rust 写的超快 linter + 语言服务器) call LspAddServer([#{name: 'ruff', \ filetype: 'python', \ path: '/usr/local/bin/ruff', \ args: ['server'] \ }])JavaScript / TypeScript:tsserver 与全家桶
" typescript-language-server call LspAddServer([#{name: 'tsserver', \ filetype: ['javascript', 'typescript'], \ path: '/usr/local/bin/typescript-language-server', \ args: ['--stdio'] \ }]) " Deno(Deno 自带 LSP) call LspAddServer([#{name: 'deno', \ filetype: ['javascript', 'typescript'], \ path: '/usr/local/bin/deno', \ args: ['lsp'] \ }]) " Biome(新一代前端工具链) call LspAddServer([#{name: 'biome', \ filetype: ['javascript', 'javascriptreact', 'typescript', 'typescriptreact'], \ path: '/usr/local/bin/biome', \ args: ['lsp-proxy'] \ }])Java:Eclipse JDTLS
call LspAddServer([#{name: 'jdtls', \ filetype: 'java', \ path: '/usr/local/jdtls/bin/jdtls', \ args: [], \ initializationOptions: #{ \ settings: #{ \ java: #{ \ completion: #{ \ filteredTypes: ["com.sun.*", "java.awt.*", "jdk.*", "sun.*"] \ } \ } \ } \ } \ }])C#:Omnisharp
call LspAddServer([#{name: 'omnisharp', \ filetype: 'cs', \ path: expand('$HOME/omnisharp/omnisharp.exe'), \ args: ['-z', '--languageserver', '--encoding', 'utf-8'] \ }])PHP:Intelephense
call LspAddServer([#{name: 'intelephense', \ filetype: ['php'], \ path: '/usr/local/bin/intelephense', \ args: ['--stdio'] \ }])Ruby:Solargraph
call LspAddServer([#{name: 'solargraph', \ filetype: ['ruby'], \ path: 'solargraph', \ args: ['stdio'], \ initializationOptions: #{ formatting: v:true } \ }])Lua:lua-language-server
call LspAddServer([#{name: 'luals', \ filetype: 'lua', \ path: '/usr/local/luals/bin/lua-language-server', \ args: [] \ }])前端框架:Volar(Vue)与 Svelte
" Volar 2.x call LspAddServer([#{name: 'vue-ls', \ filetype: ['vue'], \ path: 'vue-language-server', \ args: ['--stdio'], \ initializationOptions: #{ \ typescript: #{ \ tsdk: '/usr/local/node_modules/typescript/lib' \ } \ } \ }]) " Svelte call LspAddServer([#{name: 'svelte', \ filetype: ['svelte'], \ path: '/usr/local/node_modules/.bin/svelteserver', \ args: ['--stdio'] \ }])脚本语言:Bash、AWK、Perl、Vimscript
" Bash call LspAddServer([#{name: 'bashls', \ filetype: 'sh', \ path: '/usr/local/bin/bash-language-server', \ args: ['start'] \ }]) " AWK call LspAddServer([#{name: 'awkls', \ filetype: 'awk', \ path: '/usr/local/bin/awk-language-server', \ args: [] \ }]) " Perl Navigator call LspAddServer([#{name: 'perlnavigator', \ filetype: ['perl'], \ path: '/usr/bin/node', \ args: ['/usr/local/PerlNavigator/server/out/server.js', '--stdio'] \ }]) " Vimscript(用 Vim 写 Vim 插件也能智能补全) call LspAddServer([#{name: 'vimls', \ filetype: 'vim', \ path: '/usr/local/bin/vim-language-server', \ args: ['--stdio'] \ }])Markdown 与文档:Marksman
call LspAddServer([#{name: 'marksman', \ filetype: 'md', \ path: 'marksman-linux-x64', \ args: ['server'] \ }])更多语言服务器一览
除了上面贴出代码的,官方配置还收录了以下服务器的注册代码,全部可以在 doc/configs.md 中直接复制:
| 语言/场景 | 服务器名称 |
|---|---|
| Haskell | haskell-language-server (hls) |
| Julia | JETLS.jl |
| Dart | dart language-server |
| Swift | sourcekit-lsp (swiftls) |
| Fortran | fortls |
| Vala | vala-language-server |
| Verilog/SystemVerilog | verible |
| VHDL | vhdl_ls |
| Odin | ols |
| PKL | pkl-lsp |
| HTML | html-languageserver / vscode-html-language-server |
| CSS / Tailwind | cssls / tailwindcss-language-server |
| JSON | vscode-json-language-server |
| YAML | yaml-language-server |
| Markdown | vscode-markdown-language-server |
| ESLint | vscode-eslint-language-server |
| Angular 模板 | ngserver |
| Bitbake | bitbake-language-server / language-server-bitbake |
| 拼写检查 | cspell-lsp |
| 通用 linter/formatter | efm-langserver |
| HTML 快速编辑 | emmet-language-server |
至此,语言服务器注册已覆盖 30+ 种,几乎囊括主流编程语言。💪
注册代码进阶技巧
1. 用 rootSearch 精确识别项目根目录
对 Haskell 等依赖项目结构的语言,指定根目录标记可让服务器更快找到配置:
call LspAddServer([#{name: 'hls', \ filetype: ['haskell', 'lhaskell'], \ rootSearch: ['*.cabal', 'stack.yaml', 'cabal.project', 'hie.yaml'], \ path: 'haskell-language-server-wrapper', \ args: ['--lsp'] \ }])2. 用 LspOptionsSet 微调体验
注册服务器后,可通过LspOptionsSet()调整插件行为,常用选项包括:autoComplete(自动补全)、showInlayHints(内联提示)、highlightDiagInline(行内诊断高亮)、hoverInPreview(预览窗口悬停)等。完整选项列表见 doc/lsp.txt 的lsp-options章节。
call LspOptionsSet(#{autoComplete: v:true, \ showInlayHints: v:true, \ snippetSupport: v:true \ })3. 一个文件类型挂多个服务器
通过features字段可以为同一文件类型挂载多个服务器并各司其职,比如 clangd 负责补全、cspell-lsp 负责拼写检查。
常用 LSP 命令速查
注册完成并打开对应语言的文件后,以下命令立即可用(命令定义见 plugin/lsp.vim):
| 命令 | 功能 |
|---|---|
:LspHover | 悬停查看类型与文档 |
:LspGotoDefinition/:LspGotoImpl | 跳转定义 / 实现 |
:LspPeekReferences | 预览窗口查看引用 |
:LspRename | 全局重命名符号 |
:LspFormat | 格式化代码 |
:LspDiag next/:LspDiag show | 诊断跳转 / 列表 |
:LspDocumentSymbol/:LspOutline | 符号列表 / 大纲 |
:LspCodeAction/:LspFixAll | 代码操作 / 快速修复 |
:LspShowAllServers | 查看已注册服务器 |
:LspServer | 查看服务器状态与日志 |
常见问题排查
- 注册后无反应?先用
:LspShowAllServers确认服务器已注册,再用:LspServer查看日志;path必须指向真实可执行文件,缺失时插件会提示 "LSP server xxx is not found"。 - 补全不弹出?检查
LspOptionsSet中autoComplete是否为v:true;CSS/HTML/JSON 服务器还需要开启snippetSupport才能获得补全。 - 多语言项目混乱?合理使用
rootSearch和features字段,让每个服务器只管自己负责的文件类型。
配置好这些语言服务器注册代码后,你的 Vim 就拥有了媲美 IDE 的智能开发体验。还想要更多语言?欢迎补充到官方配置文档,让这份"全收录"更完整!🚀
【免费下载链接】lspLanguage Server Protocol (LSP) plugin for Vim9项目地址: https://gitcode.com/gh_mirrors/lsp/lsp
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考