我试图弄清楚当有一个块作为参数时,阻止clang格式添加换行符.
例如,我想要这个:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(500 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"here");
});
Run Code Online (Sandbox Code Playgroud)
不是这个:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(500 * NSEC_PER_SEC)),
dispatch_get_main_queue(),
^{
NSLog(@"here");
});
Run Code Online (Sandbox Code Playgroud)
为了解决问题,我还希望将多个块参数分解为:
[self method:argument success:^(NSString* result) {
// Do stuff
} failure:^(NSError *error) {
// Do other stuff
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮我解决这个问题吗?是否有可能使用clang格式?
我的.clang格式
Clang 格式在 VSCode Linux (Ubuntu) 中不起作用。在 VSCode 中安装后clang-format,我尝试调用它,但出现以下错误:
executable not found; please configure clang-executable.
Clang-format is available under '/home/alex/.vscode/extensions/ms-vscode.cpptools-0.10.3/LLVM/bin/clang-format'
Run Code Online (Sandbox Code Playgroud) #include <iostream>\n\nint main()\n{\n auto func = []() { \n std::cout << "hello, world" << std::endl; \n };\n func();\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我想以这种方式保留我的短 lambda 表达式。但 clang-format 总是使其在一行上。
\n\nauto func = []() { std::cout << "hello, world" << std::endl; };\nRun Code Online (Sandbox Code Playgroud)\n\n我已阅读文档,但找不到正确的设置。这是我的配置\xef\xbc\x9a
\n\nBasedOnStyle: LLVM\nLanguage: Cpp\nAccessModifierOffset: -4\nAlignAfterOpenBracket: Align\nAlignConsecutiveAssignments: true\nAlignConsecutiveDeclarations: true\nAlignEscapedNewlines: Left\nAlignOperands: true\nAlignTrailingComments: true\nAllowAllParametersOfDeclarationOnNextLine: true\nAllowShortBlocksOnASingleLine: false\nAllowShortCaseLabelsOnASingleLine: false\nAllowShortFunctionsOnASingleLine: Empty\nAllowShortIfStatementsOnASingleLine: true\nAllowShortLoopsOnASingleLine: false\nAlwaysBreakAfterDefinitionReturnType: None\nAlwaysBreakAfterReturnType: None\nAlwaysBreakBeforeMultilineStrings: false\nAlwaysBreakTemplateDeclarations: false\nBinPackArguments: false\nBinPackParameters: false\nBraceWrapping: \n AfterClass: true\n AfterControlStatement: true \n AfterEnum: true \n AfterFunction: true\n AfterNamespace: false\n AfterObjCDeclaration: false\n AfterStruct: true\n AfterUnion: …Run Code Online (Sandbox Code Playgroud) 我想用clang-format格式化代码,并完整保留lambda用作中间函数参数:
void f()
{
func(this, [this] { return false; }, this);
}
Run Code Online (Sandbox Code Playgroud)
我尝试用clang格式9.0进行的所有操作都将参数包装到下一行,即:
void f()
{
func(
this, [this] { return false; }, this);
}
Run Code Online (Sandbox Code Playgroud)
如果没有第一个或/和最后一个参数,则即使内置-style='WebKit'选项也可以提供所需的结果:
void f()
{
func([this] { return false; }, this); // ok
func(this, [this] { return false; }); // ok
func([this] { return false; }); // ok
}
Run Code Online (Sandbox Code Playgroud)
自LLVM 8.0起,似乎有所更改(损坏),因为7.1可根据需要工作。
我想为我的所有项目使用相同的 clang 格式文件,因为我有多个。但是我不想在每个工作区中都有它们,而且我的主目录中已经有一个 clang 格式的文件,我该如何进行这项工作?或者这是不可能的?
我已经看到这个问题: 如何在每个工作区中配置没有 .clang-format 文件的 clang 格式?
但是我的 clang 格式文件大约有 80 行,我只想在家中本地编辑这些内容,而不必在 vscode 中进行更改。
IE浏览器,这个:
if (x > 5)
return test;
Run Code Online (Sandbox Code Playgroud)
总是会变成:
if (x > 5)
{
return test;
}
Run Code Online (Sandbox Code Playgroud)
我不是在谈论大括号样式(Allman、GNU、Whiteman 等),我只是说完全有大括号。
有一些东西可以防止/启用单行控制语句,例如:
if (x > 5) return test;
这是AllowShortBlocksOnASingleLine,但这不是我在这里寻找的东西。
如果它适用于 clang 7 那是理想的,但如果不是让我知道。
我正在寻找一种使用 clang-format(版本 9.0.0)格式化下面的 C++ 代码的方法,这样超过 80 列限制的函数定义在参数声明而不是 C++ 函数限定符之后被破坏,例如noexcept:
void scheduler::stop_mark(service ¤t, service const &stopped) const
noexcept {
// ...
}
Run Code Online (Sandbox Code Playgroud)
上面的代码片段显示了我使用LLVM默认样式格式化的代码,下面的代码是我在正确格式化后想要的代码:
void scheduler::stop_mark(service& current,
service const& stopped) const noexcept {
// ...
}
Run Code Online (Sandbox Code Playgroud)
两个片段之间的区别在于,该行在 之后service& current,而不是 之后被断开noexcept。
使用LLVM默认样式时,此行为可重现,但我使用以下选项作为参考:
---
BasedOnStyle: LLVM
AlignAfterOpenBracket: Align
AllowAllArgumentsOnNextLine: 'true'
AllowAllConstructorInitializersOnNextLine: 'true'
AllowAllParametersOfDeclarationOnNextLine: 'true'
AllowShortCaseLabelsOnASingleLine: 'false'
AllowShortFunctionsOnASingleLine: Empty
AllowShortLambdasOnASingleLine: Empty
AlwaysBreakTemplateDeclarations: 'Yes'
BinPackArguments: 'true'
BinPackParameters: 'true'
BreakConstructorInitializers: BeforeComma
BreakConstructorInitializersBeforeComma: 'true'
ConstructorInitializerIndentWidth: 2
FixNamespaceComments: 'true' …Run Code Online (Sandbox Code Playgroud) 我遇到的问题是 clang-format 太容易在模板实例化参数中插入换行符。
例如,这个:
return std::is_trivially_constructible_v<T> && std::is_trivially_destructible_v<T>;
Run Code Online (Sandbox Code Playgroud)
变成:
return std::is_trivially_constructible_v<
T> && std::is_trivially_destructible_v<T>;
Run Code Online (Sandbox Code Playgroud)
出于某种原因,这真的让我很恼火。如果可能的话,有没有办法让它更喜欢将模板实例化参数保留在同一行?
例如,这样的事情会很棒:
return std::is_trivially_constructible_v<T>
&& std::is_trivially_destructible_v<T>;
Run Code Online (Sandbox Code Playgroud) 我已.clang-format在项目中放置了一个文件,并且可以使用Ctrl+K, Ctrl+D. 我还在 下配置并启用了“保存时运行代码清理配置文件” Options -> Text Editor -> Code Cleanup。但是当我保存文件时,格式不会应用。
我有什么遗漏的吗?
先感谢您!
编辑:由于 C++ 似乎不可能(截至 2022 年 6 月),我现在将使用VS2022 的扩展“保存格式”,与 Sedenion 的建议相比,它具有更多功能。
这是我的代码:
if constexpr (requires { { N::uuid() } -> std::convertible_to<score::uuid_t>; })
Run Code Online (Sandbox Code Playgroud)
clang-format (14, 15) 坚持将其格式化为 5 行:
if constexpr (requires {
{
N::uuid()
} -> std::convertible_to<score::uuid_t>;
})
Run Code Online (Sandbox Code Playgroud)
这太疯狂了,我怎样才能确保它保持在一行上而不必注释每一行?
clang-format ×10
c++ ×5
braces ×1
c++20 ×1
curly-braces ×1
lambda ×1
line-breaks ×1
llvm ×1
objective-c ×1
templates ×1