VSCode 默认不支持 Scala 格式化,需安装 Metals 和 Scala Syntax Highlighter 插件,并在 .vscode/settings.json 中配置 "[scala]": { "editor.defaultFormatter": "scalameta.metals" } 等三项,否则 Shift+Alt+F 无响应。

VSCode 默认不支持 Scala 格式化,必须装插件 + 显式指定格式化器,否则 Shift + Alt + F 会静默失败或退化为缩进对齐。
为什么 Scala 文件按 Shift + Alt + F 没反应?
VSCode 内置语言服务对 Scala 几乎无格式化能力。即使安装了 scala-lang 官方扩展(如 scalameta.metals),也需手动启用格式化支持,且默认不接管 editor.formatOnSave。
- 常见现象:保存后缩进没变、case class 字段没对齐、
match分支没缩进、长函数链没换行 - 根本原因:VSCode 不知道该用哪个 formatter 处理
.scala文件 —— 缺少"[scala]": { "editor.defaultFormatter": "..." }配置 - Metals 扩展本身依赖
scalafmt或scalafix,但不会自动下载或激活它们;你得自己配好.scalafmt.conf或启用metals.scalafmtOnSave
必须装的两个插件:Metals + Scala Syntax Highlighter
仅装 Prettier 或 Beautify 对 Scala 完全无效 —— 它们根本不识别 def、given、using 等关键字。
-
scalameta.metals:提供语义格式化(基于 AST),支持scalafmt集成、case class 字段垂直对齐、for推导式缩进等函数式排版特性 -
scala-lang.scala(或scala-syntax):补全语法高亮和基础折叠,避免 Metals 启动失败 - 别装
Scala (sbt)这类过时插件,它已废弃,且与 Metals 冲突
关键配置:让 Shift + Alt + F 真正生效
在工作区根目录的 .vscode/settings.json 中必须写明以下三项,缺一不可:
{
"editor.formatOnSave": true,
"[scala]": {
"editor.defaultFormatter": "scalameta.metals",
"editor.formatOnSave": true
},
"metals.scalafmtOnSave": true
}
-
"[scala]"块是硬性要求:没有它,VSCode 就不会把Shift + Alt + F路由给 Metals -
"metals.scalafmtOnSave"开启后,Metals 会读取项目根目录的.scalafmt.conf(若存在),否则用内置默认规则(如runner.dialect = scala213) - 如果想强制用
scalafix替代scalafmt,需额外配置"metals.scalafixOnSave": true并确保.scalafix.conf存在
函数式排版实际效果与易踩坑点
正确配置后,你会看到:match 分支自动缩进对齐、for 表达式每行一个子句、given 实例字段垂直排列、长类型签名自动折行 —— 这些不是靠空格/Tab 实现的,而是基于语法树的语义格式化。
- 坑:修改
.scalafmt.conf后不重启 Metals,新规则不生效;需执行命令面板中的Metals: Restart build server - 坑:
def foo(a: Int)(using ctx: Ctx): String中的using参数默认不换行,需在.scalafmt.conf加newlines.beforeCurlyLambdaParams = always - 坑:Windows 用户若看到
^M换行符污染格式结果,检查"files.eol": "\n"是否全局启用,否则 Metals 可能混用\r\n
真正起作用的是 Metals 调用本地 scalafmt CLI 的过程,而不是 VSCode 自身逻辑 —— 所以任何排版异常,第一反应应是看 Metals 输出面板里的 Formatting 日志,而非查快捷键绑定。











