4

我正在使用clang-format(3.5 版)和 Emacs(24.5.2 版)。这是一段clang-format以 LLVM 样式格式化的简单代码:

int main() {
    std::cout << "> ";
    std::string word;
    while (std::cin >> word) {
        std::cout << std::accumulate(word.cbegin(), word.cend(), 0,
                                     [](int cur, char ch) {
                         return cur + (ch - '0');
                     }) << std::endl << "> ";
    }
    return 0;
}

注意它是如何对齐主体和lambda. 这种格式是否有任何逻辑,或者只是缺乏对lambdas 的支持?是否有clang-format我需要设置的配置参数以获得更好的格式?

4

2 回答 2

3

std::accumulate(word.cbegin(), word.cend(), 0, [](int cur, char ch) { return cur + (ch - '0'); })

这里我们有一个很长的函数调用。为了清理它,我们采用长参数,并将其拆分为自己的行:

std::accumulate(word.cbegin(), word.cend(), 0,
[](int cur, char ch) { return cur + (ch - '0'); })

当我们这样做时,我们缩进参数以对齐(

std::accumulate(word.cbegin(), word.cend(), 0,
                [](int cur, char ch) { return cur + (ch - '0'); })

到目前为止,一切都很好。现在我们有一个开放的{. 嗯,这意味着一条新线路

std::accumulate(word.cbegin(), word.cend(), 0,
                [](int cur, char ch) {
return cur + (ch - '0'); })

带有缩进。缩进的基础在哪里?嗯,开始了std::accumulate。添加4个空格:

std::accumulate(word.cbegin(), word.cend(), 0,
                [](int cur, char ch) {
    return cur + (ch - '0'); })

然后我们点击了}。新行,后退:

std::accumulate(word.cbegin(), word.cend(), 0,
                [](int cur, char ch) {
    return cur + (ch - '0');
})

最后,将它嵌入到一个更大的表达式的中间,你就会得到上面的混乱。

以上纯属合理的故事,并非基于clang-format. 我不能告诉你如何让它变得更好。

于 2015-07-09T20:56:22.570 回答
0

你可能想把AlignAfterOpenBracket: false它带到[]左边。

在我看来,开括号后对齐会浪费太多空间,它如此受欢迎是一个奇迹。用于ContinuationIndentWidth控制延续的缩进程度。

Lambda 仍然不能完美对齐,但至少你的 lambda 开口不是向右一英里。我对 clang-format 的 lambda 格式也不完全满意。

于 2016-04-21T18:45:21.097 回答