Навигация по коду в Claude Code стала быстрее в 900 раз. Разбираемся, как включить LSP и зачем это нужно

Я уже год периодически думал - почему Клод не использует встроенные функции Vs code - форматирование, поиск, заменить все и т.п. Команда Антропика сделала первую, супер важную фичу с использованием LSP, который встроен в Vs Code.

Представьте: вы просите Claude Code найти определение функции processPayment в проекте на 200 тысяч строк. Раньше он честно грепал весь проект, перебирая 847 совпадений в 203 файлах: имена классов, переменные, комментарии, импорты, CSS-классы, SQL-колонки. Где-то среди всего этого шума - то, что вам реально нужно. На это уходило 30-60 секунд.

А теперь тот же запрос выполняется за 50 миллисекунд. С точностью 100%. Один файл, одна строка, без мусора.

Это не маркетинговое преувеличение. Anthropic добавила в Claude Code (начиная с версии 2.0.74) нативную поддержку Language Server Protocol, и разница настолько драматическая, что хочется разобраться, как это работает и почему оно не включено по умолчанию.

Что вообще такое LSP и почему это важно

LSP (Language Server Protocol) - протокол, который Microsoft придумала в 2016 году для стандартизации взаимодействия между редакторами кода и языковыми серверами. Именно благодаря LSP ваш VS Code умеет делать "Go to Definition", подсвечивать ошибки на лету и показывать типы при наведении.

До LSP каждый редактор должен был реализовывать поддержку каждого языка отдельно. Комбинаторный взрыв, который тормозил всё развитие инструментов. LSP решил эту проблему элегантно: один языковой сервер для Python (тот же Pyright) работает одинаково хорошо в VS Code, Neovim, Sublime Text и теперь - в Claude Code.

Вывод: LSP - это не просто ускорение. Это переход от текстового поиска к семантическому пониманию кода. grep обращается с кодом как с текстом. LSP понимает его структуру, типы и взаимосвязи.

Было/стало: что меняется на практике

Без LSP у Claude Code есть три инструмента навигации: Grep, Glob и Read. По сути, это очень быстрый разработчик с терминалом, который умеет искать паттерны в тексте. Умный - но всё равно текстовый поиск.

С LSP Claude Code получает:

  • Go to Definition - переход к определению символа за миллисекунды вместо секунд перебора файлов
  • Find References - поиск всех мест использования функции, класса или переменной (реальных использований, а не текстовых совпадений)
  • Hover - информация о типах и документация по наведению
  • Real-time Diagnostics - после каждого редактирования языковой сервер анализирует изменения и сообщает об ошибках автоматически

Интересно: по данным из дебаг-логов, навигация через LSP занимает около 50мс на запрос. Тот же запрос через grep - 30-60 секунд. Это разница не в проценты, а в порядки.

На практике это означает: рефакторинг становится точнее (Claude видит все реальные ссылки на символ), меньше токенов тратится на контекст (не нужно читать 200 файлов, чтобы понять структуру), а навигация по незнакомым кодовым базам превращается из мучения в удовольствие.

Как включить: пошаговая инструкция

А вот здесь начинается самое интересное. LSP не включён по умолчанию, и документация по его настройке... скажем так, не самая очевидная. Фича была обнаружена сообществом через GitHub issue #15619, а не через официальные доки.

Шаг 1: Включаем флаг ENABLE_LSP_TOOL

Вариант А: Временно, на одну сессию

ENABLE_LSP_TOOL=1 claude

Вариант Б: Постоянно

Добавляем в профиль оболочки (~/.bashrc или ~/.zshrc):

export ENABLE_LSP_TOOL=1

Не забудьте перезагрузить профиль:

source ~/.zshrc

Вариант В: Через настройки Claude Code

Добавьте в файл ~/.claude/settings.json:

{ "ENABLE_LSP_TOOL": "1" }

Шаг 2: Устанавливаем языковой сервер

Сам флаг без языкового сервера бесполезен. Нужно установить бинарник для вашего языка:

Python:

pip install pyright # или brew install pyright

TypeScript/JavaScript:

npm install -g typescript-language-server typescript

Go:

go install golang.org/x/tools/gopls@latest

Rust:

rustup component add rust-analyzer

C#:

choco install omnisharp

Шаг 3: Устанавливаем плагин в Claude Code

Запускаем Claude Code и в сессии вводим /plugin, затем выбираем нужный плагин из маркетплейса. Или через CLI:

Для Python - claude plugin install typescript-lsp

Для TS - claude plugin install vtsls@claude-code-lsps

Для C# - claude plugin install omnisharp@claude-code-lsps

Важно: команды claude plugin install нужно выполнять вне активной сессии Claude Code. Изнутри сессии они не работают.

Шаг 4: Перезапускаем Claude Code

После установки плагинов нужно перезапустить Claude Code, чтобы языковые серверы загрузились. Проверить, что всё заработало, можно через /plugin - вкладка Errors покажет проблемы, если что-то пошло не так.

Devhack: Если видите ошибку "Executable not found in $PATH", значит бинарник языкового сервера не установлен или не доступен в PATH. Вернитесь к шагу 2.

Заставляем Claude реально использовать LSP

Дааа, тут есть нюанс. Даже после полной настройки Claude Code может по привычке тянуться к старым инструментам - Grep и Glob. Это самая частая жалоба после установки.

Решение: явно сказать Claude, что предпочитать. Добавьте в ваш CLAUDE.md (глобально в ~/.claude/CLAUDE.md или в корень проекта):

Code Navigation Rules When tracing where a symbol is defined or finding all references to it, use LSP (goToDefinition, findReferences, hover) instead of Grep. LSP gives exact results; Grep gives text matches. Use Grep/Glob for discovery (finding files, searching patterns). Use LSP for understanding (definitions, references, type info). After locating a file with Grep/Glob, use LSP to navigate within it rather than reading the whole file.

Ключевая идея здесь - не просто "предпочитай LSP", а описать рабочий процесс: Grep/Glob для поиска, LSP для понимания. Это работает значительно лучше, чем абстрактное указание.

Альтернативный способ: просто скажите Claude в разговоре "remember to always prefer LSP over Grep for code navigation". Он сохранит это в auto memory и будет следовать в будущих сессиях. Но учитывайте, что auto memory привязана к рабочей директории, так что для каждого репозитория придётся повторить.

Поддерживаемые языки

На момент написания LSP-плагины доступны для 14+ языков:

  • Python (Pyright)
  • TypeScript/JavaScript (vtsls)
  • Go (gopls)
  • Rust (rust-analyzer)
  • Java (Eclipse JDT)
  • C/C++ (clangd)
  • C# (OmniSharp)
  • PHP (Intelephense)
  • Kotlin
  • Ruby
  • PowerShell
  • HTML/CSS
  • OCaml
  • Dart/Flutter
  • Vue.js (vue-language-server 2.x)

Внимание: поддержка Vue ограничена версией 2.x языкового сервера. Версия 3.x убрала внутренний коммуникационный слой TypeScript, и простая LSP-интеграция Claude Code с ней не работает. А для Svelte плагина пока нет вообще - LSP обрабатывает только .ts и .js файлы, а .svelte возвращает "No LSP server available for file type".

Подводные камни и честные ограничения

Было бы нечестно писать только о плюсах. Вот что стоит учитывать:

  • Фича ещё сырая. Anthropic сами предупреждают: ожидайте баги с разными языковыми серверами
  • LSP не замена grep. LSP требует конкретный путь к файлу, номер строки и позицию символа. Он не умеет "искать" в абстрактном смысле. Grep и Glob - инструменты обнаружения, LSP - инструмент точного понимания
  • Потребление памяти. Языковые серверы потребляют память пропорционально размеру проекта. Для типичных проектов до 100K строк - ожидайте 200-500МБ дополнительной памяти. Для крупных монорепозиториев может понадобиться больше
  • Не все операции используются. По наблюдениям разработчиков, Claude чаще всего вызывает goToDefinition и hover, реже - findReferences, и почти никогда - call hierarchy
  • Флаг недокументированный. ENABLE_LSP_TOOL был обнаружен через GitHub issue, а не официальную документацию. Это означает, что поведение может измениться в будущих версиях

Что в итоге

LSP в Claude Code - это переход от "полезного ИИ-ассистента" к "полноценной среде разработки". Семантическое понимание кода вместо текстового поиска, точная навигация вместо перебора, мгновенная диагностика вместо ручной проверки.

Настройка занимает буквально пару минут. Даже если LSP срабатывает не в 100% случаев, в те моменты, когда он работает - результат заметно лучше: один точный ответ вместо трёх приблизительных.

Два действия прямо сейчас:

  • Добавьте export ENABLE_LSP_TOOL=1 в ваш .zshrc
  • Установите плагин для вашего основного языка через /plugin

А какой языковой сервер вы бы хотели увидеть следующим? Делитесь в комментариях.

Ссылки:

2
Начать дискуссию