在现代开发工具里,语言服务器协议(LSP)早已成为编辑器提供智能补全、诊断和跳转的标准方式。而 OpenCode 把这一能力带到了与大模型交互的层面——它可以直接对接各种 LSP 服务器,将实时的诊断信息反馈给大语言模型(LLM),帮助模型更准确地理解代码结构、发现潜在问题。这不仅让对话式编程更可靠,也让模型对项目上下文有了更“专业”的感知。

内置 LSP 服务器一览

OpenCode 预置了大量常用语言的支持,几乎覆盖了主流技术栈。只要系统中具备对应的运行时或 SDK,打开匹配的文件时就能自动启动相应的 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++ 项目自动安装。
  • C#.cs .csx)—— 需安装 .NET SDK。
  • Clojure.clj .cljs .cljc .edn)—— 需可使用 clojure-lsp 命令。
  • Dart.dart)—— 需可使用 dart 命令。
  • Deno.ts .tsx .js .jsx .mjs)—— 需可使用 deno 命令(会自动探测 deno.json / deno.jsonc)。
  • Elixir.ex .exs)—— 需可使用 elixir 命令。
  • ESLint.ts .tsx .js .jsx .mjs .cjs .mts .cts .vue)—— 项目中需存在 eslint 依赖。
  • F#.fs .fsi .fsx .fsscript)—— 需安装 .NET SDK。
  • Gleam.gleam)—— 需可使用 gleam 命令。
  • Go.go)—— 需可使用 go 命令(gopls)。
  • Haskell.hs .lhs)—— 需可使用 haskell-language-server-wrapper 命令。
  • Java.java)—— 需安装 Java SDK(21 或更高版本,使用 jdtls)。
  • Julia.jl)—— 需安装 Julia 以及 LanguageServer.jl
  • Kotlin.kt .kts)—— 在 Kotlin 项目中自动安装。
  • Lua.lua)—— 在 Lua 项目中自动安装。
  • Nix.nix)—— 需可使用 nixd 命令。
  • OCaml.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(rubocop 集成).rb .rake .gemspec .ru)—— 需可使用 rubygem 命令。
  • Rust.rs)—— 需可使用 rust-analyzer 命令。
  • Swift / Objective-C.swift .objc .objcpp)—— 需安装 Swift(macOS 下通过 Xcode 获得)。
  • Svelte.svelte)—— 在 Svelte 项目中自动安装。
  • Terraform.tf .tfvars)—— 从 GitHub Releases 自动安装。
  • Typst(tinymist).typ .typc)—— 从 GitHub Releases 自动安装。
  • TypeScript.ts .tsx .js .jsx .mjs .cjs .mts .cts)—— 项目中需存在 typescript 依赖。
  • Vue.vue)—— 在 Vue 项目中自动安装。
  • YAML.yaml .yml)—— 自动安装 Red Hat 的 yaml-language-server
  • Zig.zig .zon)—— 需可使用 zig 命令(zls)。

一旦开启了 LSP,OpenCode 会在检测到上述扩展名、且前置条件满足时,自动启动对应的语言服务器。如果出于某些原因不想让 OpenCode 自动下载这些服务器,可以通过设置环境变量 OPENCODE_DISABLE_LSP_DOWNLOADtrue 来关闭自动下载。

它是怎么工作的

启用 LSP 后,OpenCode 处理文件时会执行两个简单步骤:

  1. 检查当前打开文件的扩展名是否匹配任何一个已启用的 LSP 服务器。
  2. 如果对应的服务器尚未运行,则自动启动它。

然后,语言服务器就会源源不断地把诊断信息(错误、警告、提示等)推送给 OpenCode,OpenCode 再把这些信息作为上下文提供给大语言模型。这样,LLM 看到的就不只是静态代码,而是带有编译器/解释器级别反馈的“活”代码。

灵活的自定义配置

OpenCode 的 LSP 行为可以通过 opencode.json 配置文件精细调整。

启用所有内置服务器
如果希望直接启用全部内置 LSP,只需将 lsp 设为 true

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

保持内置启用,同时进行覆盖
如果想让内置服务器都生效,但又想修改其中某个的配置或添加自定义服务器,可以传一个空对象(或包含具体配置的对象):

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

在这种情况下,所有内置服务器默认启用,而开发者后续往里添加的配置会当作覆盖或补充。

单个 LSP 服务器条目可设置的属性
每个 LSP 服务器配置都支持以下字段(除非只是想禁用某个服务器,否则至少需要提供 command):

属性 类型 描述
disabled boolean 设为 true 来禁用该 LSP 服务器
command string[] 启动 LSP 服务器的命令
extensions string[] 该服务器应处理的文件扩展名
env object 启动服务器时设置的环境变量
initialization object 在 LSP 初始化请求中发送的初始化选项

示例一:为 LSP 服务器设置环境变量
比如在启动 Rust 的分析器时,想看到更详细的日志,可以这样配置:

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

示例二:传递初始化选项
不同语言服务器支持的初始化参数各有不同,OpenCode 允许通过 initialization 字段直接传递。例如为一个自定义 LSP 设置模块导入偏好:

{
  "$schema": "https://opencode.ai/config.json",
  "lsp": {
    "custom-lsp": {
      "command": ["custom-lsp-server", "--stdio"],
      "extensions": [".custom"],
      "initialization": {
        "preferences": {
          "importModuleSpecifierPreference": "relative"
        }
      }
    }
  }
}

需要注意的是,具体的初始化选项需参考对应 LSP 服务器的文档。

如何禁用 LSP 服务器
如果 opencode.json 中完全没有出现 lsp 字段,所有 LSP 都会被禁用。如果之前某个配置开启了 LSP,现在想全部关掉,直接设 false 即可:

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

若只想禁用某一个服务器,比如 TypeScript,可以这样写:

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

添加自定义 LSP 服务器
对于没有内置在 OpenCode 中的语言,或者想使用特定版本的 LSP 实现,可以通过指定 commandextensions 来添加自定义服务器:

{
  "$schema": "https://opencode.ai/config.json",
  "lsp": {
    "custom-lsp": {
      "command": ["custom-lsp-server", "--stdio"],
      "extensions": [".custom"]
    }
  }
}

这样,只要文件扩展名匹配,OpenCode 就会启动这个自定义服务器,并利用它提供的诊断信息来增强 LLM 的理解能力。

小贴士:PHP Intelephense 许可证

对于 PHP 开发者,OpenCode 内置的 Intelephense 支持付费许可证来解锁高级功能。如果需要提供许可证密钥,只需将密钥放在一个纯文本文件中,文件位置如下:

  • macOS / Linux$HOME/intelephense/license.txt
  • Windows%USERPROFILE%/intelephense/license.txt

文件内容包含许可证密钥本身,不能有多余文字。OpenCode 启动 PHP 的 LSP 时会自动读取该文件。


OpenCode 对 LSP 的深度整合,既保留了语言服务器生态的强大能力,又让大语言模型获得了实时、精准的代码诊断信息。无论是纯内置的开箱即用,还是通过配置文件精细调整,整个流程都保持了工具一贯的简洁风格。对于希望让 AI 更懂自己项目的开发者来说,这无疑是一项实用且可扩展的底层能力。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐