Skip to content

Latest commit

 

History

History
206 lines (159 loc) · 9.56 KB

File metadata and controls

206 lines (159 loc) · 9.56 KB
title LSP Servers
description OpenCode integrates with your LSP servers.

OpenCode can integrate with your Language Server Protocol (LSP) to help the LLM interact with your codebase. It uses diagnostics to provide feedback to the LLM.


Built-in

OpenCode comes with several built-in LSP servers for popular languages:

LSP Server Extensions Requirements
astro .astro Auto-installs for Astro projects
bash .sh, .bash, .zsh, .ksh Auto-installs bash-language-server
clangd .c, .cpp, .cc, .cxx, .c++, .h, .hpp, .hh, .hxx, .h++ Auto-installs for C/C++ projects
csharp .cs, .csx .NET SDK installed
clojure-lsp .clj, .cljs, .cljc, .edn clojure-lsp command available
dart .dart dart command available
deno .ts, .tsx, .js, .jsx, .mjs deno command available (auto-detects deno.json/deno.jsonc)
elixir-ls .ex, .exs elixir command available
eslint .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts, .vue eslint dependency in project
fsharp .fs, .fsi, .fsx, .fsscript .NET SDK installed
gleam .gleam gleam command available
gopls .go go command available
hls .hs, .lhs haskell-language-server-wrapper command available
jdtls .java Java SDK (version 21+) installed
julials .jl julia and LanguageServer.jl installed
kotlin-ls .kt, .kts Auto-installs for Kotlin projects
lua-ls .lua Auto-installs for Lua projects
nixd .nix nixd command available
ocaml-lsp .ml, .mli ocamllsp command available
oxlint .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts, .vue, .astro, .svelte oxlint dependency in project
php intelephense .php Auto-installs for PHP projects
prisma .prisma prisma command available
pyright .py, .pyi pyright dependency installed
razor .razor, .cshtml .NET SDK and VS Code C# extension installed
ruby-lsp (rubocop) .rb, .rake, .gemspec, .ru ruby and gem commands available
rust .rs rust-analyzer command available
sourcekit-lsp .swift, .objc, .objcpp swift installed (xcode on macOS)
svelte .svelte Auto-installs for Svelte projects
terraform .tf, .tfvars Auto-installs from GitHub releases
tinymist .typ, .typc Auto-installs from GitHub releases
typescript .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts typescript dependency in project
vue .vue Auto-installs for Vue projects
yaml-ls .yaml, .yml Auto-installs Red Hat yaml-language-server
zls .zig, .zon zig command available

When LSP is enabled, servers start when one of the above file extensions is detected and the requirements are met.

:::note You can disable automatic LSP server downloads by setting the OPENCODE_DISABLE_LSP_DOWNLOAD environment variable to true. :::


How It Works

When LSP is enabled and opencode opens a file, it:

  1. Checks the file extension against all enabled LSP servers.
  2. Starts the appropriate LSP server if not already running.

Configure

You can enable and customize LSP servers through the lsp section in your opencode config.

To enable all built-in LSP servers, set lsp to true.

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

Use an object to keep built-ins enabled while configuring overrides or custom servers.

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

Each configured LSP server entry supports the following:

Server entries need command unless they only disable a server.

Property Type Description
disabled boolean Set this to true to disable the LSP server
command string[] The command to start the LSP server
extensions string[] File extensions this LSP server should handle
env object Environment variables to set when starting server
initialization object Initialization options to send to the LSP server

Let's look at some examples.


Environment variables

Use the env property to set environment variables when starting the LSP server:

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

Initialization options

Use the initialization property to pass initialization options to the LSP server. These are server-specific settings sent during the LSP initialize request:

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

:::note Initialization options vary by LSP server. Check your LSP server's documentation for available options. :::


Disabling LSP servers

If lsp is omitted, all LSP servers are disabled. To disable all LSP servers after another config enabled them, set lsp to false:

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

To disable a specific LSP server, set disabled to true:

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

Custom LSP servers

You can add custom LSP servers by specifying the command and file extensions:

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

Additional Information

PHP Intelephense

PHP Intelephense offers premium features through a license key. You can provide a license key by placing (only) the key in a text file at:

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

The file should contain only the license key with no additional content.