长期以来,IntelliJ IDEA凭借其强大的智能提示、重构和调试功能,一直是Scala和Kotlin开发者的首选IDE。然而,随着项目规模膨胀,IntelliJ的资源占用、启动速度以及频繁的索引延迟逐渐成为痛点。越来越多的开发者开始将目光投向轻量级、可高度定制的编辑器,其中Emacs结合Eglot与语言服务器协议(LSP)的方案正成为一股新潮流。本文带你了解如何用Emacs Eglot搭建一套高效、流畅的Scala和Kotlin开发环境。

为何要“逃离”IntelliJ?

IntelliJ IDEA在功能完整度上无可挑剔,但它的“重量级”特性也让不少开发者叫苦不迭。一个包含多个模块的Scala或Kotlin项目,启动时至少需要2-3分钟,而每次代码变更后的索引重算往往导致编辑器卡顿数秒。对于频繁切换上下文的开发者来说,这种体验直接影响了编程心流。此外,IntelliJ对内存的贪婪需求(推荐16GB起步)也让老旧笔记本用户苦不堪言。

相比之下,Emacs启动仅需数百毫秒,运行内存消耗常控制在200MB以内,且所有配置均通过文本化配置文件管理,天然支持Git版本化。而Eglot作为Emacs内置的LSP客户端(Emacs 29起正式集成),无需安装额外包即可与任何支持LSP的语言服务器通信,极大简化了配置流程。

Scala LSP:Metals的实战配置

Scala社区的LSP方案以Metals为主。Metals由Scala Center维护,支持自动补全、跳转定义、重构、隐式转换提示等绝大多数IntelliJ核心功能。在Emacs中启用Metals只需三步:

  1. 安装Eglot(若使用Emacs 28以下需手动添加包)并确保eglot已加载。
  2. 安装Metals:在项目目录下执行cs install metals(需Coursier工具),或使用sbt/gradle插件自动下载。
  3. 配置Emacs:在~/.emacs.d/init.el中添加以下内容:
(use-package eglot
  :ensure t
  :hook (scala-mode . eglot-ensure))

然后通过M-x eglot即可启动语言服务器。Metals会读取项目构建定义(如build.sbt),自动分析依赖。实际体验中,代码补全延迟低于100ms,跳转定义准确率超过95%,且支持sbt中的宏展开与泛型推断。唯一缺失的是IntelliJ的“自动导入”与“重命名所有引用”的深度整合——但Eglot提供的eglot-rename基本能覆盖90%的重命名需求。

Kotlin LSP:轻装上阵的Kotlin开发

Kotlin的LSP方案相对多样,最成熟的是kotlin-language-server(由fwcd维护)。它基于Kotlin编译器实现,支持代码补全、诊断、签名帮助、悬停类型显示等。配置方式与Scala类似:

(use-package eglot
  :hook (kotlin-mode . eglot-ensure))

并确保系统中安装了Kotlin编译器(kotlin命令可用)。启动后,Eglot会自动检测项目中的build.gradle.ktspom.xml,并启动对应的语言服务器。与IntelliJ相比,LSP版本缺少自动Kotlin到Java转换、多平台项目结构视图等功能,但核心编码体验(如作用域内补全、类型推断导航)已足够日常使用。一个显著优势是:即使是包含数百个文件的Android项目,kotlin-language-server的内存占用通常不超过500MB,而IntelliJ同样项目往往超过2GB。

性能与功能权衡

轻量化的代价是部分高级功能的缺失。例如,IntelliJ的“Find Usages”会跨项目递归搜索,而Eglot仅能查询当前工作区;IntelliJ内置的调试器可直接在IDE中设断点,而Emacs+Eglot需要搭配dap-mode(调试适配器协议)来连接外部调试器。但对于以编写代码为核心任务的开发者而言,LSP提供的智能感知已经足够应对日常开发——据社区统计,90%的编码活动(编写、跳转、重构)均可由LSP完成,而剩下10%的深度分析(如复杂重构、性能分析)才需要回到IntelliJ。

社区声音:从尝试到依赖

Hacker News与Reddit的Emacs社区中,多位用户分享了迁移经验。一位名为@kintel的开发者写道:“抛弃IntelliJ后,Emacs+Metals让我的工作流更流畅。我可以用Org-mode管理任务,用Magit管理Git,所有操作都不离开一个终端。”另一位Kotlin开发者@johntherippper则表示:“Eglot的Kotlin支持已经能胜任日常编码,唯一的遗憾是没有Android Layout预览——不过那本身就不该是编辑器的责任。”

未来展望

随着LSP协议的成熟,以及Emacs社区对Eglot的持续优化(如Eglot 1.12已支持工作区符号搜索、代码格式化等),这种组合正从“极客玩具”走向“生产工具”。对于尚未尝试的Scala或Kotlin开发者,不妨从一个小型项目开始体验:你或许会惊讶于Emacs的快速与可定制性,同时也学会欣赏IntelliJ在复杂场景下的不可替代性。毕竟,工具的选择从来不是非此即彼——能够在两者之间自由切换,才是现代开发者的真正优势。