首页 > 解决方案 > clang 格式的多行变量赋值

问题描述

对于某些项目,我正在尝试使用 clang-format 脚本为我自动格式化 c++ 文件。当变量赋值包含更多部分并且必须拆分为多行时,我希望在变量名之后有一个换行符。像这样:

anytype result = veerrrryyyyloooonnnnggggvaaarrriiiaabbblleeenameeee + seccconnnddverrryyyloooonnnggvarriaabbleeenammeeee + orjustalotofvariablesinvolvedinoneassignment;

应该变成:

anytype result = 
    veerrrryyyyloooonnnnggggvaaarrriiiaabbblleeenameeee +
    seccconnnddverrryyyloooonnnggvarriaabbleeenammeeee +
    orjustalotofvariablesinvolvedinoneassignment;

我一直在浏览 clang-format 样式选项,但找不到适合我的情况的任何东西。我将其作为格式脚本的输出:

    anytype result = veerrrryyyyloooonnnnggggvaaarrriiiaabbblleeenameeee +
             seccconnnddverrryyyloooonnnggvarriaabbleeenammeeee +
             orjustalotofvariablesinvolvedinoneassignment;

我查看了 clang-format 样式选项,最接近我想要的(我能找到的)的选项是AlwaysBreakBeforeMultilineStrings。这个选项附带的示例是我想要的,但是我想要它用于所有变量分配。

AlwaysBreakBeforeMultilineStrings (bool)

If true, always break before multiline string literals.

This flag is mean to make cases where there are multiple multiline strings in a file look more consistent. Thus, it will only take effect if wrapping the string at that point leads to it being indented ContinuationIndentWidth spaces from the start of the line.

true:                                  false:
aaaa =                         vs.     aaaa = "bbbb"
    "bbbb"                                    "cccc";
    "cccc";

但我希望它不仅适用于字符串,还适用于所有其他类型的多行变量声明。我如何实现这一目标?

编辑 我把问题具体化了,我提供了使用的文件。按照评论中的建议,丢弃我的包装脚本并在 .clang 格式文件中添加样式选项 AlwaysBreakBeforeMultilineStrings 后,问题仍然存在。我的 clang 格式版本是 9.0.1 。这是我的 clang 格式文件:.clang-format

 BasedOnStyle: Google
 IndentWidth: 4
 AlwaysBreakAfterReturnType: AllDefinitions
 AccessModifierOffset: -4
 AlignAfterOpenBracket: AlwaysBreak
 ColumnLimit: 78
 AlwaysBreakBeforeMultilineStrings: true

输入:main.c

int main(int argc, char** argv) {
    std::string stringname1 = "something that could be input from somehwere";
    std::string stringname2 = "another string we have from somewhere";
    std::string looooongstringname = "very loooooooonggggggg long striiiiiiiiiingggggggggg" + stringname1 + "more thingss and more " + stringname2 + :"strings";

    return 0;
}

我使用了命令: $clang-format main.c > formattedmain.c 这是输出的 formattedmain.c 文件:

int main(int argc, char** argv) {
    std::string stringname1 = "something that could be input from somehwere";
    std::string stringname2 = "another string we have from somewhere";
    std::string looooongstringname = "raaaannndddoooommm teexxtt hheeeerree" +
                                 stringname1 + "more thingss and more " +
                                 stringname2 + : "strings";
    return 0;
}

标签: c++clang-format

解决方案


推荐阅读