LSP 服务器
OpenCode 与你的 LSP 服务器集成。
OpenCode 可以与 Language Server Protocol (LSP) 服务器集成,将诊断信息作为反馈提供给 agent。
内置
OpenCode 为流行的语言内置了若干 LSP 服务器:
| LSP 服务器 | 扩展名 | 要求 |
|---|---|---|
| astro | .astro | 为 Astro 项目自动安装 |
| bash | .sh, .bash, .zsh, .ksh | 自动安装 bash-language-server |
| clangd | .c, .cpp, .cc, .cxx, .c++, .h, .hpp, .hh, .hxx, .h++ | 为 C/C++ 项目自动安装 |
| csharp | .cs, .csx | 已安装 .NET SDK |
| clojure-lsp | .clj, .cljs, .cljc, .edn | 可用 clojure-lsp 命令 |
| dart | .dart | 可用 dart 命令 |
| deno | .ts, .tsx, .js, .jsx, .mjs | 可用 deno 命令(自动检测 deno.json/deno.jsonc) |
| elixir-ls | .ex, .exs | 可用 elixir 命令 |
| eslint | .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts, .vue | 项目中有 eslint 依赖 |
| fsharp | .fs, .fsi, .fsx, .fsscript | 已安装 .NET SDK |
| gleam | .gleam | 可用 gleam 命令 |
| gopls | .go | 可用 go 命令 |
| hls | .hs, .lhs | 可用 haskell-language-server-wrapper 命令 |
| jdtls | .java | 已安装 Java SDK (version 21+) |
| julials | .jl | 已安装 julia 和 LanguageServer.jl |
| kotlin-ls | .kt, .kts | 为 Kotlin 项目自动安装 |
| lua-ls | .lua | 为 Lua 项目自动安装 |
| nixd | .nix | 可用 nixd 命令 |
| ocaml-lsp | .ml, .mli | 可用 ocamllsp 命令 |
| oxlint | .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts, .vue, .astro, .svelte | 项目中有 oxlint 依赖 |
| php intelephense | .php | 为 PHP 项目自动安装 |
| prisma | .prisma | 可用 prisma 命令 |
| pyright | .py, .pyi | 已安装 pyright 依赖 |
| razor | .razor, .cshtml | 已安装 .NET SDK 和 VS Code C# 扩展 |
| ruby-lsp (rubocop) | .rb, .rake, .gemspec, .ru | 可用 ruby 和 gem 命令 |
| rust | .rs | 可用 rust-analyzer 命令 |
| sourcekit-lsp | .swift, .objc, .objcpp | 已安装 swift(macOS 上需 xcode) |
| svelte | .svelte | 为 Svelte 项目自动安装 |
| terraform | .tf, .tfvars | 从 GitHub releases 自动安装 |
| tinymist | .typ, .typc | 从 GitHub releases 自动安装 |
| typescript | .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts | 项目中有 typescript 依赖 |
| vue | .vue | 为 Vue 项目自动安装 |
| yaml-ls | .yaml, .yml | 自动安装 Red Hat 的 yaml-language-server |
| zls | .zig, .zon | 可用 zig 命令 |
LSP 默认处于禁用状态。启用后,当检测到上述某个文件扩展名且满足相应要求时,对应的服务器就会启动。
注意: 你可以通过将
OPENCODE_DISABLE_LSP_DOWNLOAD环境变量设置为true来禁用 LSP 服务器的自动下载。
工作原理
当启用了 LSP 且 opencode 打开一个文件时,它会:
- 将文件扩展名与所有已启用的 LSP 服务器进行比对。
- 如果对应的 LSP 服务器尚未运行,则启动它。
Best Practices
LSP 可以通过提供来自语言服务器的诊断信息,帮助 agent 发现并修复问题。这在某些项目中很有用,但并不总是净收益。
语言服务器可能会失去同步、占用大量内存、因版本或项目而异,并拖慢 agent 的工作流程。在许多项目中,更好的做法是让 agent 直接运行 lint、类型检查或其他诊断类 CLI 工具,这样错误信息可以反馈进 agent 循环,同时避免上述这些代价。请在诸如 AGENTS.md 或技能之类的指令文件中记录这些命令,以便 agent 知道该运行什么。当你的项目能从额外的语言服务器反馈中受益时,再启用 LSP。
配置
你可以通过 opencode 配置中的 lsp 部分来启用和自定义 LSP 服务器。
要启用所有内置 LSP 服务器,将 lsp 设置为 true。
{
"$schema": "https://opencode.ai/config.json",
"lsp": true
}使用对象,可以在保持内置服务器启用的同时,配置覆盖项或自定义服务器。
{
"$schema": "https://opencode.ai/config.json",
"lsp": {}
}每个已配置的 LSP 服务器条目支持以下内容:
服务器条目需要 command,除非它们仅用于禁用某个服务器。
| 属性 | 类型 | 描述 |
|---|---|---|
disabled | boolean | 将其设为 true 以禁用该 LSP 服务器 |
command | string[] | 启动 LSP 服务器的命令 |
extensions | string[] | 该 LSP 服务器应处理的文件扩展名 |
env | object | 启动服务器时设置的环境变量 |
initialization | object | 发送给 LSP 服务器的初始化选项 |
我们来看一些示例。
环境变量
使用 env 属性在启动 LSP 服务器时设置环境变量:
{
"$schema": "https://opencode.ai/config.json",
"lsp": {
"rust": {
"command": ["rust-analyzer"],
"env": {
"RUST_LOG": "debug"
}
}
}
}初始化选项
使用 initialization 属性向 LSP 服务器传递初始化选项。这些是在 LSP initialize 请求期间发送的、特定于服务器的设置:
{
"$schema": "https://opencode.ai/config.json",
"lsp": {
"custom-lsp": {
"command": ["custom-lsp-server", "--stdio"],
"extensions": [".custom"],
"initialization": {
"preferences": {
"importModuleSpecifierPreference": "relative"
}
}
}
}
}注意: 初始化选项因 LSP 服务器而异。请查看你的 LSP 服务器文档了解可用选项。
禁用 LSP 服务器
如果省略 lsp,则所有 LSP 服务器都会被禁用。要在另一份配置启用它们之后禁用所有 LSP 服务器,将 lsp 设置为 false:
{
"$schema": "https://opencode.ai/config.json",
"lsp": false
}要禁用某个特定的 LSP 服务器,将 disabled 设置为 true:
{
"$schema": "https://opencode.ai/config.json",
"lsp": {
"typescript": {
"disabled": true
}
}
}自定义 LSP 服务器
你可以通过指定命令和文件扩展名来添加自定义 LSP 服务器:
{
"$schema": "https://opencode.ai/config.json",
"lsp": {
"custom-lsp": {
"command": ["custom-lsp-server", "--stdio"],
"extensions": [".custom"]
}
}
}附加信息
PHP Intelephense
PHP Intelephense 通过授权密钥提供高级功能。你可以将(仅)密钥放入一个文本文件来提供授权密钥,路径为:
- 在 macOS/Linux 上:
$HOME/intelephense/license.txt - 在 Windows 上:
%USERPROFILE%/intelephense/license.txt
该文件应只包含授权密钥,不含任何其他内容。