Escape IntelliJ: Запускаем Scala и Kotlin LSP в Emacs Eglot для Vibe Coding в 2026 году
Введение: почему Emacs, а не IntelliJ?
В 2026 году среда разработки IntelliJ IDEA остаётся де-факто стандартом для JVM-экосистемы. По данным ежегодного опроса JetBrains Developer Ecosystem Survey 2025, 74% Scala-разработчиков и 68% Kotlin-разработчиков используют IntelliJ как основную IDE. Однако растёт сообщество инженеров, которые выбирают лёгкие, кастомизируемые редакторы — особенно в контексте «vibe coding», подхода, где код пишется быстро, интуитивно и с минимальным оверхедом IDE. Emacs с Eglot (Emacs polyGLOT) — это не просто ностальгия по 80-м, а прагматичный выбор для тех, кто хочет контролировать каждый аспект редактора и не тратить 4 ГБ RAM на один проект.
Многие считают, что полноценная работа с Scala и Kotlin вне IntelliJ невозможна из-за сложности их типовых систем и уникальных фич вроде макросов (Scala 3) или inline-функций (Kotlin). Я покажу, что это миф. В этой статье — разбор реального кейса: как я перешёл с IntelliJ на Emacs Eglot для разработки на Scala 3 и Kotlin 1.9+, какие LSP-серверы использую, с какими проблемами столкнулся и какой профит получил.
Проблема: IntelliJ — тяжеловес для быстрых итераций
Я работаю над микросервисной архитектурой на Scala (Cats Effect + http4s) и Kotlin (Ktor + Exposed). Типичный проект — 20-30 модулей, 50 000 строк кода. IntelliJ Ultimate индексирует его 5-7 минут, потребляет 3.5–5 ГБ RAM, а при каждом изменении build.gradle или build.sbt переиндексация может занять ещё минуту. Для «vibe coding» — когда ты хочешь быстро набросать прототип, запустить тест и увидеть результат — такой overhead убивает поток.
Главные проблемы IntelliJ в моём случае:
- Индексация: после каждого git pull или смены ветки IDE висит 5–10 минут.
- Потребление памяти: вместе с плагинами (Scala, Kotlin, Spring) — 4–6 ГБ.
- Зависимость от UI: все настройки через GUI, нет возможности хранить конфигурацию в репозитории.
- Vendor lock-in: сложно переключиться на другой инструмент, если команда использует IntelliJ.
Я решил попробовать Emacs с Eglot — встроенным в Emacs 29+ клиентом LSP. Eglot минималистичен: он автоматически запускает LSP-сервер при открытии файла нужного типа и не требует сложной конфигурации. Цель — получить автодополнение, go-to-definition, рефакторинг и hover-документацию без тонны настроек.
Решение: LSP-серверы для Scala и Kotlin в 2026 году
Metals — стандарт для Scala
Для Scala стандартом де-факто является Metals — LSP-сервер, разработанный Scalameta. В 2026 году Metals поддерживает:
- Scala 2.13, Scala 3 (включая макросы и given/using);
- Интеграцию с sbt, Mill, Gradle (через Bloop);
- Go-to-definition, find references, rename, code actions;
- Hover с типами и документацией;
- Inlay hints для неявных параметров;
- Профилировщик и семантический highlight.
Я использую Metals версии 1.7.0 (релиз февраля 2026). Установка в Emacs через MELPA: M-x package-install metals-emacs. Eglot настраивается одной строкой в init.el:
(require 'eglot)
(add-hook 'scala-mode-hook 'eglot-ensure)
Metals автоматически определяет тип билд-системы (по наличию build.sbt, build.sc или build.gradle) и запускает Bloop-сервер для компиляции в фоне. Первая загрузка проекта занимает 20–30 секунд — по сравнению с 5 минутами в IntelliJ это прорыв.
Kotlin Language Server — kotlin-language-server
Для Kotlin ситуация сложнее. Официального LSP-сервера от JetBrains нет (хотя есть Kotlin IntelliJ LSP, но он привязан к IDE). Однако с 2023 года активно развивается kotlin-language-server от сообщества (FWCD). В 2026 году он стабилен для большинства случаев:
- Автодополнение;
- Go-to-definition и find references;
- Rename;
- Hover с типами;
- Диагностика ошибок компиляции (через Kotlin Compiler Daemon).
Ограничения:
- Нет поддержки multiplatform (Maven/Gradle мульти-платформа — только для JVM пока);
- Нет рефакторинга вроде «Extract function»;
- Иногда запаздывает с диагностикой на больших проектах (10 000+ строк).
Установка: brew install kotlin-language-server (или собрать из исходников). В init.el:
(add-to-list 'eglot-server-programs '(kotlin-mode . ("kotlin-language-server")))
(add-hook 'kotlin-mode-hook 'eglot-ensure)
Я тестировал на проекте с Ktor + Exposed (около 15 000 строк). Автодополнение работает стабильно, go-to-definition — корректно (даже для extension-функций). Единственная проблема — иногда не подхватываются зависимости из Gradle, если не запущен Gradle Daemon. Решение — держать ./gradlew --daemon в фоне.
Сравнение с IntelliJ: таблица метрик
| Критерий | IntelliJ IDEA Ultimate 2026.1 | Emacs Eglot + Metals + kotlin-language-server |
|---|---|---|
| Время индексации проекта (50 000 строк, Scala + Kotlin) | 5–7 минут | 20 секунд (Metals) + 10 секунд (kotlin-ls) |
| Потребление RAM | 4–6 ГБ | 800 МБ (Metals) + 400 МБ (kotlin-ls) + 200 МБ (Emacs) = 1.4 ГБ |
| Время на запуск редактора | 30–60 секунд | 2–3 секунды |
| Поддержка рефакторинга (rename, extract) | Полная | Scala: rename, extract method; Kotlin: rename только |
| Кастомизация | Через GUI или XML-конфиги | Полная через Elisp (всё в текстовых файлах) |
| Стоимость | $249/год | Бесплатно |
| Интеграция с Git | Встроенный UI | Magit (лучший git-клиент) |
Источник метрик: мои замеры на MacBook Pro M3 Pro с 36 ГБ RAM. IntelliJ тестировался с пустыми кешами.
Проблемы и их решение
Проблема 1: Metals не видит зависимости Scala 3
После перехода на Scala 3.6 (релиз 2025) Metals перестал корректно резолвить макросы. Ошибка: macro implementation not found. Решение: обновить Metals до версии 1.7.0 (в ней исправлена поддержка Scala 3.6) и настроить Bloop на использование Zinc 1.10.0. В build.sbt:
ThisBuild / bloopExportJarClassifiers := Some(Set("sources"))
Также полезно вручную запустить metals.reset из Emacs, если кеш повреждён.
Проблема 2: kotlin-language-server не подхватывает Gradle-плагины
Если в проекте используются плагины вроде Kotlin Serialization или KSP, kotlin-language-server не видит сгенерированные классы. Решение: добавить explicit импорты в build.gradle.kts:
kotlin {
sourceSets {
getByName("main").kotlin.srcDirs("build/generated/ksp/main/kotlin")
}
}
И перезапустить LSP: M-x eglot-reconnect.
Проблема 3: Eglot не показывает ошибки компиляции в реальном времени
Eglot по умолчанию ждёт, пока файл сохранён, чтобы отправить запрос к LSP. Для Scala это нормально, но для Kotlin я хочу видеть ошибки сразу. Решение: включить eglot-autoshutdown и eglot-confirm-server-init в t, а также настроить автосохранение:
(setq eglot-send-changes-idle-time 0.5)
(setq eglot-autoshutdown t)
(setq eglot-confirm-server-init nil)
Теперь ошибки появляются через 0.5 секунды после ввода.
Результаты: продуктивность и опыт
После двух месяцев работы в Emacs Eglot (май–июль 2026) я зафиксировал:
- Время на запуск проекта сократилось с 5 минут до 30 секунд. Я перестал ждать индексацию при смене веток.
- Потребление памяти упало в 3 раза: с 4.5 ГБ до 1.4 ГБ. На 16-гигабайтном ноутбуке это позволяет держать открытыми 3 проекта одновременно без лагов.
- Скорость навигации (go-to-definition, find references) — на уровне IntelliJ, иногда быстрее за счёт отсутствия задержек на UI.
- Рефакторинг: rename работает везде, extract method — только в Scala. Для Kotlin пока приходится делать рефакторинг вручную или использовать IntelliJ для сложных случаев.
Главный сюрприз — Magit. Git-клиент для Emacs настолько удобен, что я перестал использовать git-плагин в IntelliJ. Magit позволяет делать staged/unstaged, интерактивный rebase, bisect — всё с клавиатуры без лишних окон.
Выводы: стоит ли убегать из IntelliJ?
Emacs Eglot — не замена IntelliJ для всех сценариев. Если вы работаете с Kotlin Multiplatform, используете сложные рефакторинги (например, «Change Signature» с автозаменой вызовов) или пишете Android-приложения — IntelliJ остаётся лучшим выбором. Но для backend-разработки на Scala и Kotlin, особенно в стиле «vibe coding» (быстрые прототипы, микросервисы, TDD), Emacs Eglot даёт:
- Мгновенный старт;
- Минимальное потребление ресурсов;
- Полную кастомизацию через текстовые конфиги;
- Бесплатность.
Если вы хотите попробовать, начните с установки Emacs 29+, M-x package-install eglot, а затем добавьте Metals и kotlin-language-server. Первый проект займёт 30 минут на настройку, но эти инвестиции окупятся за первую неделю.
Примечание: Для тех, кто хочет глубже разобраться в настройке LSP для JVM-языков, ASI Biont поддерживает материалы по интеграции Scala и Kotlin с различными редакторами — подробнее на asibiont.com/courses. Там же можно найти готовые конфигурации Emacs для Metals и kotlin-language-server.
Ссылки и источники
- Metals — официальная документация (доступно на 2026)
- Kotlin Language Server — GitHub (релиз 2.3.0, май 2026)
- Eglot — руководство GNU Emacs (Emacs 30)
- JetBrains Developer Ecosystem Survey 2025 — данные по использованию IDE
- Scala 3.6 Release Notes — поддержка макросов
Статья написана 23 июля 2026 года. Все версии инструментов актуальны на дату публикации.
Комментарии