clang-format 对已格式化的文件进行更改
clang-format makes changes to an already formatted file
当使用 clang-format 命令行工具格式化同一个文件两次时,两次都会进行更改。
我的理解是,一旦格式化,尝试重新格式化同一个文件应该不会产生任何变化。
这是我的测试 运行:
输入文件
$ cat test.c
//********************************************** AAAAAAA BBBB***************************************************//
- 第一种格式 - 按预期进行的更改
$ clang-format -i test.c
$ cat test.c
//********************************************** AAAAAAA
//BBBB***************************************************//
- 第二种格式 - 第二行的意外更改(在
BBBB
之前添加了额外的 space)**
$ clang-format -i test.c
$ cat test.c
//********************************************** AAAAAAA
// BBBB***************************************************//
- 第三种格式 - 最后得到相同的结果。
我使用的版本是:10.0.0-++20200323042644+d32170dbd5b-1~exp1~20200323154014.129
on Ubuntu 18.04.2
(请注意,我也在 clang-format-9
中重现了此行为)
这是我 运行 遇到的错误,还是我最初的假设不正确?
编辑: 也可在 10.0.1-++20200507062652+bab8d1790a3-1~exp1~20200507163249.158
中重现
我可以重现这种幂等性的不足。您可以在这里做三件事:使用不同的样式、使用更少的规则或将其作为错误提交。
1。使用不同的风格
clang-format
10.0.0 附带的样式在 --help
中列出:
--style=<string> - Coding style, currently supports:
LLVM, Google, Chromium, Mozilla, WebKit.
其中 LLVM 是默认设置。要指定样式,请使用 clang-format --style=<style> ...
。除了 Webkit 之外的每个样式都会重现此错误(但 webkit 样式不会更改初始文件):
$ clang-format --style=webkit test.c > test2.c
$ clang-format --style=webkit test2.c > test3.c
$ diff test2.c test3.c
$
您的情况可能有所不同,因为您说过这是您遇到的众多幂等性问题之一。
2。使用规则子集
每种样式都包含您可以根据需要修改的规则。您可以使用 clang-format --dump-config
转储当前配置(默认 llvm
)。
$ clang-format --dump-config | tee .clang-format
---
Language: Cpp
# BasedOnStyle: LLVM
AccessModifierOffset: -2
AlignAfterOpenBracket: Align
AlignConsecutiveMacros: false
AlignConsecutiveAssignments: false
<output truncated>
您可以手动选择 these rules 的较小子集来使用,或者消除规则,直到实现幂等性。
如果你把这个 .clang-format
文件放在你的项目的根目录下,然后你可以告诉 clang-format
用 --style=file
去寻找它。请注意,如果您希望在该目录中应用不同的格式规则,您可以将 .clang-format
文件放在子目录中。
3。提交错误
你的问题的一个关键组成部分是 clang-format 是否处理缺少 idempotency as a bug. This is the case, based on reviews where this issue has been treated as a bug 0, 1.
我可以在 Macos 的 10.0.0 上复制这个。根据 bug report docs 中的介绍,您拥有将其作为错误归档所需的所有信息。显然,此选项要求您等到修复程序可用。
当使用 clang-format 命令行工具格式化同一个文件两次时,两次都会进行更改。
我的理解是,一旦格式化,尝试重新格式化同一个文件应该不会产生任何变化。
这是我的测试 运行:
输入文件
$ cat test.c
//********************************************** AAAAAAA BBBB***************************************************//
- 第一种格式 - 按预期进行的更改
$ clang-format -i test.c
$ cat test.c
//********************************************** AAAAAAA
//BBBB***************************************************//
- 第二种格式 - 第二行的意外更改(在
BBBB
之前添加了额外的 space)**
$ clang-format -i test.c
$ cat test.c
//********************************************** AAAAAAA
// BBBB***************************************************//
- 第三种格式 - 最后得到相同的结果。
我使用的版本是:10.0.0-++20200323042644+d32170dbd5b-1~exp1~20200323154014.129
on Ubuntu 18.04.2
(请注意,我也在 clang-format-9
中重现了此行为)
这是我 运行 遇到的错误,还是我最初的假设不正确?
编辑: 也可在 10.0.1-++20200507062652+bab8d1790a3-1~exp1~20200507163249.158
中重现
我可以重现这种幂等性的不足。您可以在这里做三件事:使用不同的样式、使用更少的规则或将其作为错误提交。
1。使用不同的风格
clang-format
10.0.0 附带的样式在 --help
中列出:
--style=<string> - Coding style, currently supports:
LLVM, Google, Chromium, Mozilla, WebKit.
其中 LLVM 是默认设置。要指定样式,请使用 clang-format --style=<style> ...
。除了 Webkit 之外的每个样式都会重现此错误(但 webkit 样式不会更改初始文件):
$ clang-format --style=webkit test.c > test2.c
$ clang-format --style=webkit test2.c > test3.c
$ diff test2.c test3.c
$
您的情况可能有所不同,因为您说过这是您遇到的众多幂等性问题之一。
2。使用规则子集
每种样式都包含您可以根据需要修改的规则。您可以使用 clang-format --dump-config
转储当前配置(默认 llvm
)。
$ clang-format --dump-config | tee .clang-format
---
Language: Cpp
# BasedOnStyle: LLVM
AccessModifierOffset: -2
AlignAfterOpenBracket: Align
AlignConsecutiveMacros: false
AlignConsecutiveAssignments: false
<output truncated>
您可以手动选择 these rules 的较小子集来使用,或者消除规则,直到实现幂等性。
如果你把这个 .clang-format
文件放在你的项目的根目录下,然后你可以告诉 clang-format
用 --style=file
去寻找它。请注意,如果您希望在该目录中应用不同的格式规则,您可以将 .clang-format
文件放在子目录中。
3。提交错误
你的问题的一个关键组成部分是 clang-format 是否处理缺少 idempotency as a bug. This is the case, based on reviews where this issue has been treated as a bug 0, 1.
我可以在 Macos 的 10.0.0 上复制这个。根据 bug report docs 中的介绍,您拥有将其作为错误归档所需的所有信息。显然,此选项要求您等到修复程序可用。