clang-format 对已格式化的文件进行更改

clang-format makes changes to an already formatted file

当使用 clang-format 命令行工具格式化同一个文件两次时,两次都会进行更改。

我的理解是,一旦格式化,尝试重新格式化同一个文件应该不会产生任何变化。

这是我的测试 运行:

输入文件

$ cat test.c 
//********************************************** AAAAAAA BBBB***************************************************//
  1. 第一种格式 - 按预期进行的更改
$ clang-format -i test.c 
$ cat test.c 
//********************************************** AAAAAAA
//BBBB***************************************************//
  1. 第二种格式 - 第二行的意外更改(在 BBBB 之前添加了额外的 space)**
$ clang-format -i test.c 
$ cat test.c 
//********************************************** AAAAAAA
// BBBB***************************************************//
  1. 第三种格式 - 最后得到相同的结果。

我使用的版本是: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 中的介绍,您拥有将其作为错误归档所需的所有信息。显然,此选项要求您等到修复程序可用。