为何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
相关产品推荐
相关产品推荐

