You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何scalafmt合并多行类型定义?如何保留原格式?

scalafmt 无法保留类型定义换行格式的问题

我有如下类型定义:

type Foo = Bar
   with Baz
   with Bat
   with Bak
   with Bar

我偏好当前的格式,但即使设置了newlines.source=keep,scalafmt仍将其合并为一行,若内容长度超出maxColumn还会拆分:

type Foo = Bar with Baz with Bat with Bak
  with Bar

这对我来说完全难以阅读。请问scalafmt为何会有此行为?是否存在可保留原格式的配置?

更新
回应评论,附上完整脚本:

[sandbox] [1123]> cat .scalafmt.conf
version = "3.7.16"
runner.dialect = scala213
newlines.source=keep
maxColumn = 40
[sandbox] [1124]> scalafmt --version
scalafmt 3.7.16
[sandbox] [1125]> scalafmt --test foobar.scala 
--- a/Users/dima/sandbox/foobar.scala
+++ b/Users/dima/sandbox/foobar.scala
@@ -1,9 +1,4 @@
 class Foo {
-  type It = Foo with
-    Bar with
-    Baz with
-    Bat with
-    Bak with
-    Bam with
-    Ban
+  type It = Foo with Bar with Baz
+    with Bat with Bak with Bam with Ban
 }
error: --test failed

原因

scalafmt 对with连接的类型组合有专属格式化逻辑,这类语法默认被当作链式结构处理,优先级高于newlines.source=keep配置,所以即使你开启了保留原换行,它还是会按照内置规则合并或拆分。

解决办法

修改.scalafmt.conf,添加以下配置:

version = "3.7.16"
runner.dialect = scala213
newlines.source=keep
maxColumn = 40
# 强制with操作符垂直对齐换行
style.indentOperator = "vertical"
# 禁用中缀式with,强制换行
rewrite.rules = [AvoidInfix]

如果上面的配置还达不到预期,再加一条更直接的规则:

newlines.before.with = always

这条规则会强制在每个with前插入换行,完全匹配你想要的格式。


内容的提问来源于stack exchange,提问作者Dima

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 20:12:32