当两次使用 clang-format 命令行工具格式化同一个文件时,两次都会进行更改。
我的理解是,一旦格式化,尝试重新格式化同一个文件应该不会产生任何变化。
这是我运行的测试:
输入文件
$ cat test.c
//********************************************** AAAAAAA BBBB***************************************************//
- 第一种格式 - 按预期进行更改
$ clang-format -i test.c
$ cat test.c
//********************************************** AAAAAAA
//BBBB***************************************************//
- 第二种格式 - 第二行的意外更改(在
BBBB
之前添加了额外的空格)**
$ 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。使用规则子集
每种样式都包含您可以修改以满足您的需要的规则。您可以使用 llvm
转储当前配置(默认 clang-format --dump-config
) .
$ 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作为错误。情况就是这样,根据将此问题视为错误的评论0 , 1 .
我可以在 Macos 的 10.0.0 上复制它。根据 bug report docs 中的介绍,您拥有将其作为错误归档所需的所有信息。 .显然,此选项要求您等到修复程序可用。
关于clang-format 对已格式化的文件进行更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61754044/