sublime text 不支持 scala 并发框架的特殊编译或运行,仅调用系统 scalac/scala 命令;需验证命令可用性、正确配置 build 系统捕获 stderr、区分编译与运行、依赖 sbt 或 metals 实现完整功能。

Sublime Text 本身不支持 Scala 并发框架(如 scala.concurrent、Future、Akka)的特殊编译或运行——它只调用系统已安装的 scalac 和 scala 命令,而这些命令对并发代码没有任何额外处理。所谓“配置并发框架编译”,本质仍是让 Sublime 正确编译任意 Scala 代码,包括用了 Future 或 ExecutionContext 的文件。
验证 scalac 和 scala 是否真能工作
90% 的“编译失败”其实卡在这一步。别跳过终端验证:
-
scalac -version和scala -version必须输出类似Scala compiler version 2.13.12的结果 -
which scalac和which scala必须返回非空路径,例如/usr/local/scala/bin/scalac - macOS 用户:从 Dock 启动 Sublime 时
PATH不继承,必须在终端执行open -a "Sublime Text";Windows 用户改完环境变量后要右键任务栏 → Exit Sublime,不能只关窗口 - 如果
scalac MyApp.scala在终端报error: not found: object concurrent,说明你缺的是依赖(比如没加-cp或没用 sbt),不是 Sublime 配置问题
写一个能跳转错误行的 Scala.sublime-build
网上抄的模板常失效,因为 scalac 把错误写进 stderr,而默认构建系统只捕获 stdout。双击错误不跳转?八成是这个原因。
- 用
shell_cmd+2>&1合并错误流:"shell_cmd": "scalac \"$file\" 2>&1" -
file_regex必须匹配 Scala 错误格式,例如"^([^:]+):([0-9]+):(?:[0-9]+):"—— 第一组捕获文件名,第二组捕获行号,第三段列号用非捕获组跳过 - 别用泛用正则
^.*?:([0-9]+):([0-9]+):,它会吞掉文件名,导致双击跳到错误文件 - 设
"working_dir": "$file_path",否则import scala.concurrent.Future这类语句可能因类路径问题报错(尤其涉及本地lib/时)
快捷键 Ctrl+B 能用,但运行不了 Future?不是快捷键的问题
Ctrl+B 只触发构建系统,它不启动 REPL、不加载 ExecutionContext.global、也不等 Future 完成——它只是跑 scalac 编译,或跑 scala 解释器执行脚本。
- 如果你写的是
object Main extends App { Future { println(1) } },Ctrl+B 编译成功后直接退出,看不到输出:因为Future是异步的,主线程结束就完了 - 想看到并发效果,得显式
Await.result(..., 5.seconds),或改用sbt run(需项目结构 +build.sbt) - 不要把编译和运行塞进同一个构建系统;推荐分设两个:
Scala (Compile)和Scala (Run),后者用"shell_cmd": "scala -cp . \"$file_base_name\""(确保编译产物在当前目录) - 若用
sbt,那就不是 Sublime 的事了:建好build.sbt,在终端跑sbt compile或sbt run,Sublime 只负责编辑
语法高亮和跳转 ≠ 框架支持
装了 Scala 插件、右下角显示 Scala、Ctrl+Click 能跳转到 Future 定义——这些都只是语言服务基础能力,不代表 Sublime 理解并发语义或能检查 Future 使用是否合理。
- 补全、跳转、重命名依赖 LSP + Metals,不是靠 Sublime 自身;需要 JDK 17+、
build.sbt、以及单独安装 Metals server - 没有
build.sbt的单文件项目,Metals 不会启动,此时所有“智能”功能都退化为纯文本匹配 - 如果你真在写 Akka 或 ZIO,别指望 Ctrl+B 能跑通——它们强依赖项目结构、依赖管理、类路径隔离,Sublime 的构建系统根本不适合这类场景
真正容易被忽略的点:Sublime 里写的每个 .scala 文件,无论有没有用 Future,编译行为和 println("hello") 完全一致。所谓“并发框架配置”,其实是你在混淆编辑器能力和运行时环境——前者只管文本和命令调用,后者才是决定 Future 能不能调度、能不能打印的关键。











