什么是 LSP
LSP(Language Server Protocol)是微软提出的协议,标准化了编程语言与编辑器/IDE 之间的通信。通过 LSP,编辑器可以获得:
- 诊断信息:语法错误、类型错误、警告
- 代码补全:智能提示
- 跳转定义:Go to Definition
- 查找引用:Find References
- 悬停信息:类型、文档
- 重构支持:重命名、提取函数等
OpenCode 的 LSP 集成
OpenCode 内置了 30+ LSP Server,覆盖主流编程语言:
| 语言 | LSP Server | 功能 |
|---|---|---|
| TypeScript/JavaScript | typescript-language-server | 完整支持 |
| Python | pyright | 完整支持 |
| Rust | rust-analyzer | 完整支持 |
| Go | gopls | 完整支持 |
| Java | eclipse.jdt.ls | 完整支持 |
| C/C++ | clangd | 完整支持 |
| Ruby | solargraph | 基础支持 |
| PHP | intelephense | 基础支持 |
工作原理
当你在 OpenCode 中编辑代码时:
- 文件检测:OpenCode 根据文件扩展名自动识别语言
- 启动 LSP:启动对应的 Language Server
- 实时诊断:LSP 返回错误、警告信息
- 反馈给 LLM:诊断信息作为上下文传递给 AI
这意味着 AI 不仅看到你的代码,还能看到编译器的反馈,从而生成更准确的修改。
实际效果
没有 LSP 时:
> 修复这个函数的类型错误
[AI 猜测可能的错误并修改]
有 LSP 时:
> 修复这个函数的类型错误
[LSP 提供具体错误信息]
错误:src/utils.ts:15:8 - Type 'string' is not assignable to type 'number'
[AI 精确定位并修复]
配置 LSP
自动检测
默认情况下,OpenCode 会自动检测并启动 LSP:
{
"lsp": {
"enabled": true
}
}
禁用特定语言
{
"lsp": {
"languages": {
"python": { "enabled": false },
"rust": { "enabled": true }
}
}
}
自定义 LSP 配置
{
"lsp": {
"languages": {
"typescript": {
"command": "typescript-language-server",
"args": ["--stdio"],
"settings": {
"typescript.preferences.quoteStyle": "single",
"typescript.format.semicolons": "insert"
}
}
}
}
}
LSP Tools(实验性)
OpenCode 提供实验性的 LSP Tool,让 AI 主动查询代码信息:
| Tool | 说明 |
|---|---|
goToDefinition | 跳转到定义 |
findReferences | 查找所有引用 |
getHoverInfo | 获取悬停信息 |
getDiagnostics | 获取诊断信息 |
renameSymbol | 重命名符号 |
启用方式:
{
"lsp": {
"tools": {
"enabled": true,
"allowed": ["goToDefinition", "findReferences"]
}
}
}
安装 LSP Server
大部分 LSP Server 需要单独安装:
TypeScript
npm install -g typescript typescript-language-server
Python
pip install pyright
Rust
rustup component add rust-analyzer
Go
go install golang.org/x/tools/gopls@latest
故障排查
检查 LSP 状态
> /lsp status
LSP Servers:
✓ typescript - running (pid: 12345)
✓ python - running (pid: 12346)
✗ rust - not found (install rust-analyzer)
常见问题
| 问题 | 解决方案 |
|---|---|
| LSP not found | 安装对应的 Language Server |
| Slow startup | 大项目首次索引需要时间,耐心等待 |
| High CPU usage | 检查是否有大量文件变更,考虑排除 node_modules |
| Inaccurate diagnostics | 检查 tsconfig.json 等配置文件 |
启用调试
export OPENCODE_LOG_LEVEL=debug
opencode 2>&1 | grep lsp