跳转到内容

LSP 服务器

LSP 服务器

OpenCode 可以与语言服务器协议(LSP)服务器集成,以将诊断信息用作智能体的反馈。


内置

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(21 版或更高)
julials.jl已安装 juliaLanguageServer.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可用 rubygem 命令
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 默认是禁用的。启用后,当检测到上述文件扩展名之一且满足要求时,服务器会启动。


工作原理

当启用 LSP 且 opencode 打开文件时,它:

  1. 检查文件扩展名是否与所有启用的 LSP 服务器匹配。
  2. 如果尚未运行,则启动相应的 LSP 服务器。

最佳实践

LSP 可以通过提供来自语言服务器的诊断信息来帮助智能体查找和修复问题。这在某些项目中很有用,但并不总是净正值。

语言服务器可能会不同步、占用大量内存、按版本或项目而变化,并减慢智能体工作流程。在许多项目中,让智能体直接运行 lint、类型检查或其他诊断 CLI 工具会更好,这样错误会在没有这些权衡的情况下反馈到智能体循环中。在指令文件(如 AGENTS.md 或 skills)中记录这些命令,以便智能体知道要运行什么。当你的项目受益于额外的语言服务器反馈时,启用 LSP。


配置

你可以通过 opencode 配置中的 lsp 部分启用和自定义 LSP 服务器。

要启用所有内置 LSP 服务器,将 lsp 设置为 true

{
  "$schema": "https://opencode.ai/config.json",
  "lsp": true
}

使用对象保持内置服务器启用,同时配置覆盖或自定义服务器。

{
  "$schema": "https://opencode.ai/config.json",
  "lsp": {}
}

每个配置的 LSP 服务器条目支持以下内容:

服务器条目除非仅禁用服务器,否则需要 command

属性类型描述
disabledboolean设置为 true 以禁用 LSP 服务器
commandstring[]启动 LSP 服务器的命令
extensionsstring[]此 LSP 服务器应处理的文件扩展名
envobject启动服务器时设置的环境变量
initializationobject发送给 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 设置为 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

文件应仅包含许可证密钥,不含其他内容。