Clang 格式的换行符
Clang-format line breaks
我正在寻找一个 clang-format
设置来防止该工具删除换行符。
例如,我将 ColumnLimit
设置为 120,下面是我重新格式化一些示例代码时发生的情况。
之前:
#include <vector>
#include <string>
std::vector<std::string> get_vec()
{
return std::vector<std::string> {
"this is a test",
"some of the lines are longer",
"than other, but I would like",
"to keep them on separate lines"
};
}
int main()
{
auto vec = get_vec();
}
之后:
#include <vector>
#include <string>
std::vector<std::string> get_vec()
{
return std::vector<std::string>{"this is a test", "some of the lines are longer", "than other, but I would like",
"to keep them on separate lines"};
}
int main()
{
auto vec = get_vec();
}
我想要的是该工具会断开超过 120 个字符的行,但不会仅仅因为它们少于 120 个字符就决定合并行。
有这样的选择吗?文档中没有任何内容对我来说很突出。
我目前在 documentation 中没有看到任何允许您这样做的内容。
将 ColumnLimit 设置为 0 仍会保留文本换行。
clang-format-mp-3.4 test.c -style="{ ColumnLimit: 0 }"
#include <vector>
#include <memory>
#include <string>
int main() {
std::vector<std::string> vec = {
"this is a test",
"with some strings",
"that I want on separate lines"
};
}
我不确定您的 clang-format 是否完全符合您的要求,但可以告诉 clang-format 单独保留部分代码。我将它用于您正在谈论的那种场景,其中非常特殊的格式使其更易于阅读的代码块。
std::vector<std::string> get_vec()
{
// clang-format off
return std::vector<std::string> {
"this is a test",
"some of the lines are longer",
"than other, but I would like",
"to keep them on separate lines"
};
// clang-format on
}
参见:
http://clang.llvm.org/docs/ClangFormatStyleOptions.html#disabling-formatting-on-a-piece-of-code
所以,在弄乱了 clang 格式代码并做了一些补丁之后,这是我的两分钱:
Clang 格式基于
- 使用
libclang
解析 AST,这基本上消除了所有空格
- 将令牌序列分解为 "unwrapped lines",类似于 "logical" 代码行
- 应用规则/配置信息有时将 "unwrapped lines" 分成更小的单元
- 用新的空格/缩进再次吐出所有内容
让它尊重原始的whitepsace并不容易,当你第一次解析代码时,那种东西会被扔掉。
您可以通过
最轻松地控制换行符的放置位置
- 设置列限制
- 使用 "bin pack parameters" 选项
- 设置各种中断的惩罚 -- 在 return 函数类型之后中断,在第一次调用参数之前中断,中断字符串文字,中断注释...
- 在行尾放置注释(clang 格式无法删除注释,因此必须拆分行)
- 使用 clang 格式关闭/打开指令
这是您可以尝试的一件事:
std::vector<std::string> get_vec()
{
return std::vector<std::string> { //
"this is a test", //
"some of the lines are longer", //
"than other, but I would like", //
"to keep them on separate lines" //
};
}
与 // clang-format off
相比的优势在于,如果您稍后更改制表符宽度或其他一些选项,这些代码行仍会进行格式更改,因此您无需手动进入// clang-format off
个区域来修复它。然而,它仍然有点骇人听闻,YMMV。
最终,clang-format
主要是在整个代码库上采用统一的格式,确保所有字符串文字在程序的任何位置都采用相同的格式。如果您想对换行决策进行微观控制,这不符合该工具的精神,您将不得不做一些事情,比如禁用它。
这有时会令人沮丧,尤其是。当你想用数组做事并对齐列或其他东西时——例如,这里有一些来自 lua C api:
的自然代码
static luaL_Reg const methods[] = {
{"matches", &dispatch::intf_match_unit},
{"to_recall", &dispatch::intf_put_recall_unit},
{"to_map", &dispatch::intf_put_unit},
{"erase", &dispatch::intf_erase_unit},
{"clone", intf_copy_unit},
{"extract", &dispatch::intf_extract_unit},
{"advance", intf_advance_unit},
};
当 clang-format 运行s 超过它时,它通常不会对齐右列,它会在逗号后放置固定数量的空格,你对此无能为力阿法克
或者,如果您有用于 OpenGL 的 4 x 4 矩阵:
constexpr float shadow_skew_hardcoded[16] =
{ 1.0f, 0.0f, 0.0f, 0.0f,
0.5f, 0.5f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f };
如果你让 clang-format 运行 处理这样的事情,它只会破坏它们,而且 afaik 没有简单的方法让它很好地格式化它们,所以你只能求助于 "lots of trivial comments" hack,或者当你有这样的事情时使用 clang-format off。这些只是该工具的固有限制。如果您不喜欢做那样的事情,那么它可能不适合您。
在最后一个字符串后添加一个逗号。这告诉 clang-format 垂直格式化它。前任:
https://godbolt.org/z/bZxr__ 右击 > 格式化文本
#include <string>
#include <vector>
std::vector<std::string> get_vec() {
return std::vector<std::string>{
"this is a test",
"some of the lines are longer",
"than other, but I would like",
"to keep them on separate lines", // comma here after last element
};
}
int main() { auto vec = get_vec(); }
使用 .clang 格式的这些规则
BasedOnStyle: LLVM
AlignAfterOpenBracket: AlwaysBreak
AllowShortBlocksOnASingleLine: Empty
BreakConstructorInitializers: AfterColon
BinPackArguments: false // Important for this case
BinPackParameters: false // Important for this case
AlignEscapedNewlines: DontAlign
SpacesBeforeTrailingComments: 2
AllowShortBlocksOnASingleLine: Never
AllowShortFunctionsOnASingleLine: None
ContinuationIndentWidth: 2
IndentWidth: 2
Standard: c++17
UseTab: Never
我得到的格式接近预期结果
#include <string>
#include <vector>
std::vector<std::string> get_vec() {
return std::vector<std::string>{
"this is a test",
"some of the lines are longer",
"than other, but I would like",
"to keep them on separate lines"};
}
int main() {
auto vec = get_vec();
}
我正在寻找一个 clang-format
设置来防止该工具删除换行符。
例如,我将 ColumnLimit
设置为 120,下面是我重新格式化一些示例代码时发生的情况。
之前:
#include <vector>
#include <string>
std::vector<std::string> get_vec()
{
return std::vector<std::string> {
"this is a test",
"some of the lines are longer",
"than other, but I would like",
"to keep them on separate lines"
};
}
int main()
{
auto vec = get_vec();
}
之后:
#include <vector>
#include <string>
std::vector<std::string> get_vec()
{
return std::vector<std::string>{"this is a test", "some of the lines are longer", "than other, but I would like",
"to keep them on separate lines"};
}
int main()
{
auto vec = get_vec();
}
我想要的是该工具会断开超过 120 个字符的行,但不会仅仅因为它们少于 120 个字符就决定合并行。
有这样的选择吗?文档中没有任何内容对我来说很突出。
我目前在 documentation 中没有看到任何允许您这样做的内容。
将 ColumnLimit 设置为 0 仍会保留文本换行。
clang-format-mp-3.4 test.c -style="{ ColumnLimit: 0 }"
#include <vector>
#include <memory>
#include <string>
int main() {
std::vector<std::string> vec = {
"this is a test",
"with some strings",
"that I want on separate lines"
};
}
我不确定您的 clang-format 是否完全符合您的要求,但可以告诉 clang-format 单独保留部分代码。我将它用于您正在谈论的那种场景,其中非常特殊的格式使其更易于阅读的代码块。
std::vector<std::string> get_vec()
{
// clang-format off
return std::vector<std::string> {
"this is a test",
"some of the lines are longer",
"than other, but I would like",
"to keep them on separate lines"
};
// clang-format on
}
参见: http://clang.llvm.org/docs/ClangFormatStyleOptions.html#disabling-formatting-on-a-piece-of-code
所以,在弄乱了 clang 格式代码并做了一些补丁之后,这是我的两分钱:
Clang 格式基于
- 使用
libclang
解析 AST,这基本上消除了所有空格 - 将令牌序列分解为 "unwrapped lines",类似于 "logical" 代码行
- 应用规则/配置信息有时将 "unwrapped lines" 分成更小的单元
- 用新的空格/缩进再次吐出所有内容
让它尊重原始的whitepsace并不容易,当你第一次解析代码时,那种东西会被扔掉。
- 使用
您可以通过
最轻松地控制换行符的放置位置- 设置列限制
- 使用 "bin pack parameters" 选项
- 设置各种中断的惩罚 -- 在 return 函数类型之后中断,在第一次调用参数之前中断,中断字符串文字,中断注释...
- 在行尾放置注释(clang 格式无法删除注释,因此必须拆分行)
- 使用 clang 格式关闭/打开指令
这是您可以尝试的一件事:
std::vector<std::string> get_vec()
{
return std::vector<std::string> { //
"this is a test", //
"some of the lines are longer", //
"than other, but I would like", //
"to keep them on separate lines" //
};
}
与 // clang-format off
相比的优势在于,如果您稍后更改制表符宽度或其他一些选项,这些代码行仍会进行格式更改,因此您无需手动进入// clang-format off
个区域来修复它。然而,它仍然有点骇人听闻,YMMV。
最终,clang-format
主要是在整个代码库上采用统一的格式,确保所有字符串文字在程序的任何位置都采用相同的格式。如果您想对换行决策进行微观控制,这不符合该工具的精神,您将不得不做一些事情,比如禁用它。
这有时会令人沮丧,尤其是。当你想用数组做事并对齐列或其他东西时——例如,这里有一些来自 lua C api:
的自然代码static luaL_Reg const methods[] = {
{"matches", &dispatch::intf_match_unit},
{"to_recall", &dispatch::intf_put_recall_unit},
{"to_map", &dispatch::intf_put_unit},
{"erase", &dispatch::intf_erase_unit},
{"clone", intf_copy_unit},
{"extract", &dispatch::intf_extract_unit},
{"advance", intf_advance_unit},
};
当 clang-format 运行s 超过它时,它通常不会对齐右列,它会在逗号后放置固定数量的空格,你对此无能为力阿法克
或者,如果您有用于 OpenGL 的 4 x 4 矩阵:
constexpr float shadow_skew_hardcoded[16] =
{ 1.0f, 0.0f, 0.0f, 0.0f,
0.5f, 0.5f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f };
如果你让 clang-format 运行 处理这样的事情,它只会破坏它们,而且 afaik 没有简单的方法让它很好地格式化它们,所以你只能求助于 "lots of trivial comments" hack,或者当你有这样的事情时使用 clang-format off。这些只是该工具的固有限制。如果您不喜欢做那样的事情,那么它可能不适合您。
在最后一个字符串后添加一个逗号。这告诉 clang-format 垂直格式化它。前任: https://godbolt.org/z/bZxr__ 右击 > 格式化文本
#include <string>
#include <vector>
std::vector<std::string> get_vec() {
return std::vector<std::string>{
"this is a test",
"some of the lines are longer",
"than other, but I would like",
"to keep them on separate lines", // comma here after last element
};
}
int main() { auto vec = get_vec(); }
使用 .clang 格式的这些规则
BasedOnStyle: LLVM
AlignAfterOpenBracket: AlwaysBreak
AllowShortBlocksOnASingleLine: Empty
BreakConstructorInitializers: AfterColon
BinPackArguments: false // Important for this case
BinPackParameters: false // Important for this case
AlignEscapedNewlines: DontAlign
SpacesBeforeTrailingComments: 2
AllowShortBlocksOnASingleLine: Never
AllowShortFunctionsOnASingleLine: None
ContinuationIndentWidth: 2
IndentWidth: 2
Standard: c++17
UseTab: Never
我得到的格式接近预期结果
#include <string>
#include <vector>
std::vector<std::string> get_vec() {
return std::vector<std::string>{
"this is a test",
"some of the lines are longer",
"than other, but I would like",
"to keep them on separate lines"};
}
int main() {
auto vec = get_vec();
}