我想使用 clang-format 格式化代码,并保留 lambda 用作中间函数参数完整(按原样):
void f()
{
func(0, [] {}, 0);
}
我在 clang-format 9.0(以及 11.0.0-2663a25f)中尝试的所有内容都将参数包装到下一行,即:
void f()
{
func(
0, [] {}, 0); // not-ok
}
如果没有第一个或/和最后一个参数,即使内置
-style='WebKit'
选项也能给出所需的结果:
void f()
{
func([] {}, 0); // ok
func(0, [] {}); // ok
func([] {}); // ok
}
自 LLVM 8.0 以来,似乎有些东西发生了变化(损坏),因为 7.1 可以按需要工作。 IE。给我的和原来的一样:
void f()
{
func(0, [] {}, 0); // how to achieve this after clang-format?
}
最新版本的
clang-format
(即 10)具有特定于格式化 lambda 的配置选项。具体来说,您所要求的可以通过分配给配置指令AllowShortLambdasOnASingleLine
值SLS_Inline
来实现。
以下是官方文档中提供的其他选项:
允许ShortLambdasOnASingleLine
(ShortLambdaStyle)
根据值,auto lambda { return 0; } 可以放在一行中。
可能的值:
(在配置中:无)切勿将 lambda 合并到单行中。SLS_None
(配置中:空)仅合并空 lambda。SLS_Empty
auto lambda = [](int a) {}
auto lambda2 = [](int a) {
return a;
};
(在配置中:内联)如果函数的参数将 lambda 合并到单行中。SLS_Inline
auto lambda = [](int a) {
return a;
};
sort(a.begin(), a.end(), ()[] { return x < y; })
(配置中:全部)将所有 lambda 表达式合并到一条线上。SLS_All
auto lambda = [](int a) {}
auto lambda2 = [](int a) { return a; };
我没有找到在
clang-format
附带的 LLVM 8
上执行相同操作的方法。我发现的最接近的配置如下
clang-format -style={BasedOnStyle: WebKit, AllowShortFunctionsOnASingleLine: true, AllowShortBlocksOnASingleLine: true}
无论如何,它没有达到您的全部要求,这就是它在我的 Windows 笔记本电脑上的样子:
void f() {
func([this] { return false; },
this); // ok
func(this, [this] { return false; }); // ok
func([this] { return false; }); // ok
}
此问题已在 LLVM 18 中修复。 GitHub 上的相关已关闭错误报告此处。