ClangFormat 参数和参数 binpacking 设置未按预期工作
ClangFormat argument and parameter binpacking setting not working as expected
如果我有一个参数对于列宽而言太长的函数,它将按预期将它们全部放在新行上。但是,这似乎有时会破坏我的指针对齐方式:
格式化前:
struct ConnectionResult *connect_to_server(struct Folders *start_folder, struct Config *config, struct CTypet *conn_type)
格式化后:
struct ConnectionResult *connect_to_server(struct Folders *start_folder
struct Config * config,
struct CTypet * conn_type);
似乎更喜欢对齐实际变量名而忽略指针对齐规则。这导致我的函数有时看起来与其他函数的样式不一致。我的.clang_format
是
AlignAfterOpenBracket: Align
AlignConsecutiveMacros: 'true'
AlignConsecutiveAssignments: 'true'
AlignConsecutiveDeclarations: 'true'
AlignTrailingComments: 'true'
BreakBeforeBraces: Allman
IndentCaseLabels: 'true'
IndentWidth: '4'
Language: Cpp
PointerAlignment: Right
SortIncludes: 'true'
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: 'true'
SpaceInEmptyParentheses: 'false'
BinPackParameters: 'false'
BinPackArguments: 'false'
UseTab: Never
ColumnLimit: 80
附带说明一下,这种配置有时也会以一种非常丑陋的方式中断长循环:
之前:
for(size_t current_conn = initial_conn; current_connection <= max_connections; current_conn += connection_offset) { ...}
格式后:
for (size_t current_conn = initial_conn; current_conn <= max_connections;
current_conn += connection_offset)
{
...
}
在现实中,我希望 for 循环的每个参数都在自己的行上。
我对使用 C 的 clang 格式还比较陌生,我不确定如何解决这个问题。有什么好方法可以让我的 clang 格式在这两种情况下都像我期望的那样工作?
简短回答:不,clang-format
不会做任何一个。
AlignConsecutiveDeclarations
使参数声明对齐,PointerAlignment
控制声明中 *
和 &
周围的间距。但似乎 AlignConsecutiveDeclarations
忽略了 PointerAlignment
,而 PointerAlignment: Right
实际上只是意味着“在 *
或 &
之前添加一个 space”。
None这个好像是documented,可惜了
对于 for-loop,您似乎需要一个假设的新样式选项,称为 AllowBinPackForLoop
,默认为 true(为了向后兼容),但 false 将允许 for-loop 像您询问是否需要多行一样拆分。但据我所知,不存在这样的东西。
如果我有一个参数对于列宽而言太长的函数,它将按预期将它们全部放在新行上。但是,这似乎有时会破坏我的指针对齐方式:
格式化前:
struct ConnectionResult *connect_to_server(struct Folders *start_folder, struct Config *config, struct CTypet *conn_type)
格式化后:
struct ConnectionResult *connect_to_server(struct Folders *start_folder
struct Config * config,
struct CTypet * conn_type);
似乎更喜欢对齐实际变量名而忽略指针对齐规则。这导致我的函数有时看起来与其他函数的样式不一致。我的.clang_format
是
AlignAfterOpenBracket: Align
AlignConsecutiveMacros: 'true'
AlignConsecutiveAssignments: 'true'
AlignConsecutiveDeclarations: 'true'
AlignTrailingComments: 'true'
BreakBeforeBraces: Allman
IndentCaseLabels: 'true'
IndentWidth: '4'
Language: Cpp
PointerAlignment: Right
SortIncludes: 'true'
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: 'true'
SpaceInEmptyParentheses: 'false'
BinPackParameters: 'false'
BinPackArguments: 'false'
UseTab: Never
ColumnLimit: 80
附带说明一下,这种配置有时也会以一种非常丑陋的方式中断长循环:
之前:
for(size_t current_conn = initial_conn; current_connection <= max_connections; current_conn += connection_offset) { ...}
格式后:
for (size_t current_conn = initial_conn; current_conn <= max_connections;
current_conn += connection_offset)
{
...
}
在现实中,我希望 for 循环的每个参数都在自己的行上。
我对使用 C 的 clang 格式还比较陌生,我不确定如何解决这个问题。有什么好方法可以让我的 clang 格式在这两种情况下都像我期望的那样工作?
简短回答:不,clang-format
不会做任何一个。
AlignConsecutiveDeclarations
使参数声明对齐,PointerAlignment
控制声明中 *
和 &
周围的间距。但似乎 AlignConsecutiveDeclarations
忽略了 PointerAlignment
,而 PointerAlignment: Right
实际上只是意味着“在 *
或 &
之前添加一个 space”。
None这个好像是documented,可惜了
对于 for-loop,您似乎需要一个假设的新样式选项,称为 AllowBinPackForLoop
,默认为 true(为了向后兼容),但 false 将允许 for-loop 像您询问是否需要多行一样拆分。但据我所知,不存在这样的东西。