中文
文档
LSP 服务器

LSP 服务器

OpenCode 与你的 LSP 服务器集成。

OpenCode 可以与你的 Language Server Protocol (LSP) 集成,帮助 LLM 与你的代码库交互。它通过诊断信息向 LLM 提供反馈。


内置

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已安装 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 后,当检测到上述某个文件扩展名且满足相应要求时,对应的服务器就会启动。

注意: 你可以通过将 OPENCODE_DISABLE_LSP_DOWNLOAD 环境变量设置为 true 来禁用 LSP 服务器的自动下载。


工作原理

当启用了 LSP 且 opencode 打开一个文件时,它会:

  1. 将文件扩展名与所有已启用的 LSP 服务器进行比对。
  2. 如果对应的 LSP 服务器尚未运行,则启动它。

配置

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

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

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

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

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

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

服务器条目需要 command,除非它们仅用于禁用某个服务器。

属性类型描述
disabledboolean将其设为 true 以禁用该 LSP 服务器
commandstring[]启动 LSP 服务器的命令
extensionsstring[]该 LSP 服务器应处理的文件扩展名
envobject启动服务器时设置的环境变量
initializationobject发送给 LSP 服务器的初始化选项

我们来看一些示例。


环境变量

使用 env 属性在启动 LSP 服务器时设置环境变量:

opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "lsp": {
    "rust": {
      "command": ["rust-analyzer"],
      "env": {
        "RUST_LOG": "debug"
      }
    }
  }
}

初始化选项

使用 initialization 属性向 LSP 服务器传递初始化选项。这些是在 LSP initialize 请求期间发送的、特定于服务器的设置:

opencode.json
{
  "$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

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

要禁用某个特定的 LSP 服务器,将 disabled 设置为 true

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

自定义 LSP 服务器

你可以通过指定命令和文件扩展名来添加自定义 LSP 服务器:

opencode.json
{
  "$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

该文件应只包含授权密钥,不含任何其他内容。