Настройка LSP-сервера OpenCode
OpenCode глубоко интегрируется с Language Server Protocol (LSP), используя LSP-серверы для предоставления LLM обратной связи в реальном времени, такой как диагностика кода и подсказки об ошибках, помогая ИИ более точно понимать вашу кодовую базу и работать с ней.
Проще говоря, LSP-сервер — это компонент, который даёт OpenCode возможность «читать код», подобно плагинам в VS Code, обеспечивающим автодополнение кода и подсказки об ошибках. Когда в файле появляется синтаксическая ошибка или несоответствие типов, LSP-сервер передаёт эту диагностическую информацию обратно в LLM, позволяя ей вносить более точные изменения.
Как это работает
Интеграция LSP в OpenCode полностью автоматическая и не требует ручного вмешательства. Когда OpenCode открывает файл, он последовательно выполняет следующий процесс:
打开文件 │ ▼ 读取文件扩展名(如 .ts、.py、.go) │ ▼ 与所有已启用的 LSP 服务器进行匹配 │ ├── 匹配成功且服务器已运行 → 直接使用 │ └── 匹配成功但服务器未运行 → 自动启动对应 LSP 服务器
Весь процесс выполняется незаметно в фоновом режиме. После запуска LSP-сервер непрерывно предоставляет диагностическую информацию для текущего сеанса.
Встроенные LSP-серверы
OpenCode имеет встроенную поддержку LSP-серверов для популярных языков,Когда обнаружено соответствующее расширение файла и выполнены соответствующие требования, 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 |
Требуется установка .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 |
требуется установка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зависимость для установки |
ruby-lsp |
.rb, .rake, .gemspec, .ru |
Требуетсяrubyиgemкоманда должна быть доступна |
rust |
.rs |
Требуетсяrust-analyzerкоманда должна быть доступна |
sourcekit-lsp |
.swift, .objc, .objcpp |
Требуется установленный Swift (устанавливается через Xcode на macOS) |
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команда должна быть доступна |
Если вы не хотите, чтобы OpenCode автоматически скачивал LSP-серверы, можно задать переменную окруженияOPENCODE_DISABLE_LSP_DOWNLOADвtrueчтобы отключить поведение автоматической загрузки. Подробности см. в примечаниях в конце этой статьи.
Настройка LSP-серверов
Конфигурация, связанная с LSP, записывается вopencode.jsonизlspполе. В большинстве случаев настройка не требуется, и LSP будет включён автоматически; но когда требуется нестандартное поведение, каждый сервер LSP поддерживает следующие параметры конфигурации:
| Свойство | Type | Описание |
|---|---|---|
disabled |
boolean |
Установить вtrueчтобы отключить этот сервер LSP |
command |
string[] |
Команда для запуска сервера LSP (в виде массива; первый элемент — имя исполняемого файла, остальные — аргументы) |
extensions |
string[] |
Список расширений файлов, обрабатываемых этим сервером LSP |
env |
object |
Переменные среды, внедряемые при запуске сервера; ключи — имена переменных, значения — значения переменных |
initialization |
object |
Во время LSPinitializeфазы рукопожатия, параметры инициализации, отправляемые серверу; содержимое зависит от сервера |
1. Настройка переменных среды (env)
Используйтеenvсвойство для внедрения переменных среды при запуске сервера LSP. Обычно используется для включения отладочного логирования или указания путей, необходимых среде выполнения:
Пример
"$schema": "https://opencode.ai/config.json",
"lsp": {
"rust": {
"env": {
"RUST_LOG": "debug" // Включает логирование уровня debug для rust-analyzer, чтобы упростить диагностику проблем с LSP
}
}
}
}
2. Настройка параметров инициализации (initialization)
initializationИспользуются для передачи конфигурации, специфичной для сервера, LSP-серверу. Эти параметры отправляются один раз во время фазы LSP-рукопожатия (initializerequest) и влияют на всё последующее поведение сервера:
Пример
"$schema": "https://opencode.ai/config.json",
"lsp": {
"typescript": {
"initialization": {
"preferences": {
"importModuleSpecifierPreference": "relative"
// Сообщает TypeScript LSP, что следует предпочитать импорты с относительными путями (например, ./utils)
// вместо абсолютных путей (например, /src/utils) или псевдонимов путей, настроенных в tsconfig.json
}
}
}
}
}
Параметры инициализации различаются в зависимости от LSP-сервера. Например,typescriptпараметры дляgoplsполностью отличаются; перед использованием обратитесь к официальной документации соответствующего LSP-сервера, чтобы не передать недопустимую конфигурацию.
Отключение LSP-серверов
1. Отключение всех LSP-серверов
Если вам вообще не нужна функциональность LSP, вы можете установитьlspполностью вfalse, отключив все LSP-серверы сразу:
Пример
"$schema": "https://opencode.ai/config.json",
"lsp": false // Глобально отключает все LSP-серверы; подходит для сред, которым не нужна диагностика кода или у которых ограничены сеть/ресурсы
}
2. Отключение конкретного LSP-сервера
Если вы хотите отключить только один LSP-сервер, сохранив остальные, задайте это индивидуально для этого сервераdisabled: true:
Пример
"$schema": "https://opencode.ai/config.json",
"lsp": {
"typescript": {
"disabled": true // Отключает только LSP для TypeScript; LSP-серверы для других языков не затрагиваются
}
}
}
Добавление пользовательских LSP-серверов
Если используемого вами языка нет в списке встроенной поддержки, вы можете указатьcommandиextensionsчтобы вручную добавить любой LSP-сервер, при условии, что сервер соответствует стандартному протоколу LSP и поддерживает--stdioрежим (связь через стандартный ввод/вывод):
Пример
"$schema": "https://opencode.ai/config.json",
"lsp": {
"custom-lsp": { // Имя пользовательского ключа; может быть произвольным, используется для идентификации сервера в конфигурации
"command": ["custom-lsp-server", "--stdio"], // Команда запуска: первый элемент — имя исполняемого файла,
// остальные элементы — это аргументы запуска, передаваемые ему
// --stdio указывает на связь с OpenCode через стандартный ввод/вывод
"extensions": [".custom"] // Указывает, какие расширения файлов обрабатывает этот LSP-сервер
}
}
}
Вы также можете настроить переменные окружения и параметры инициализации для пользовательского LSP-сервера, точно так же, как для встроенных серверов:
Пример
"$schema": "https://opencode.ai/config.json",
"lsp": {
"my-lang-server": {
"command": ["my-lang-server", "--stdio", "--log-level", "warn"],
"extensions": [".mylang", ".ml2"], // Поддерживает привязку нескольких расширений файлов одновременно
"env": {
"MY_LSP_HOME": "/usr/local/my-lang" // Внедряет необходимые переменные окружения для процесса сервера
},
"initialization": {
"formatOnSave": true // Передаёт параметры инициализации, определённые в документации сервера
}
}
}
}
Дополнительные примечания
Лицензия PHP Intelephense
PHP Intelephense предлагает бесплатную версию и платную премиум-версию. Премиум-версия разблокируется с помощью лицензионного ключа и включает расширенные функции, такие как сортировка импортов, свёртывание кода, просмотр иерархии вызовов и многое другое. Если вы приобрели лицензию, просто запишите ключ в текстовый файл по следующему пути, чтобы автоматически активировать лицензию, без дополнительной настройки:
| Операционная система | Путь к файлу лицензии |
|---|---|
| macOS / Linux | $HOME/intelephense/license.txt |
| Windows | %USERPROFILE%/intelephense/license.txt |
Файл лицензии должен содержать только сам лицензионный ключ. Не добавляйте никакого другого содержимого (включая лишние пробелы или переносы строк), иначе активация может не удаться.
Отключить автоматическую загрузку
По умолчанию OpenCode автоматически загружает необходимый LSP-сервер из сети, когда обнаруживает соответствующее расширение файла. Если вы находитесь в среде с ограниченным доступом к сети или предпочитаете управлять инструментами LSP полностью вручную, вы можете отключить автоматическую загрузку, установив следующую переменную окружения:
# Linux / macOS:临时禁用(仅当前终端会话有效) export OPENCODE_DISABLE_LSP_DOWNLOAD=true # Linux / macOS:永久禁用(写入 shell 配置文件) echo 'export OPENCODE_DISABLE_LSP_DOWNLOAD=true' >> ~/.bashrc source ~/.bashrc # Windows(PowerShell:仅当前会话) $env:OPENCODE_DISABLE_LSP_DOWNLOAD = "true"
После отключения OpenCode больше не будет автоматически загружать LSP-серверы, но уже предварительно установленные в системе инструменты LSP по-прежнему могут обнаруживаться и использоваться как обычно.
Другие расширения