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

如何在Kotlin中强制执行自定义换行代码规范?适配ktlint等工具

自定义Kotlin代码换行格式:寻找支持紧凑括号内换行的格式化工具

期望的紧凑换行格式

仅在内容超出长度时换行,换行前尽可能保留完整表达式:

fun foo() {
    return true && ("aaaaaaaaaaaaaaa" ==
        "ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd")
}

当前ktlint的格式化问题

使用ktlint会强制在左括号后添加不必要的换行,不符合需求:

fun foo() {
    return true && (
        "aaaaaaaaaaaaaaa" ==
        "ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"
    )
}

已尝试的.editorconfig配置

[*]
indent_size = 4
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true

[{*.kt,*.kts}]
ij_kotlin_code_style_defaults = KOTLIN_OFFICIAL
ij_kotlin_continuation_indent_in_if_conditions = false

各工具的可行配置方案

  • ktfmt:默认的google风格就能实现这种紧凑格式,它的换行逻辑只在表达式过长时拆分,不会强制在左括号后换行。在.editorconfig里添加:
    [{*.kt,*.kts}]
    ktfmt_style = google
    
  • diktat:支持细粒度自定义,在diktat-analysis.yml里调整换行和括号规则,控制仅内容超长度时换行,且不在左括号后强制换行:
    rules:
      - id: LINE_LENGTH
        configuration:
          maxLineLength: 120
          excludePatterns: []
      - id: BRACES
        configuration:
          avoidLineBreakAfterOpeningBrace: true
    
  • prettier(kotlin插件):使用prettier-plugin-kotlin插件,配置合适的printWidth,就能实现仅表达式过长时拆分,不会在左括号后换行。在.prettierrc里设置:
    {
      "printWidth": 120,
      "plugins": ["prettier-plugin-kotlin"]
    }
    
  • ktlint调整方案:如果坚持用ktlint,切换代码风格为INTELLIJ_IDEA,同时禁用括号后强制换行的配置:
    [{*.kt,*.kts}]
    ij_kotlin_code_style_defaults = INTELLIJ_IDEA
    ij_kotlin_force_new_line_after_opening_paren_in_expressions = false
    ij_kotlin_keep_line_breaks = true
    
    不过ktlint的官方风格对括号换行约束较强,可能需要结合禁用部分规则才能完全匹配需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 20:13:12