有没有办法用 clang-format 做 "indentation only"?

Is there a way to use clang-format to do "indentation only"?

我想避免格式化代码在某种程度上更糟糕的情况,这样人们就避免在未来尝试通过类似 clang-format 的东西来改进我们的代码库。在我们的例子中,至少我们可以就 spaces-only 达成一致,制表符是 4-spaces。所以只改进缩进只能是一件好事。

Eclipse 具有“正确缩进”功能(通过菜单 --> 源代码 --> 正确缩进):

Eclipse 的“正确缩进”只是缩进,但它不是 shell 命令,我 want/need 是 shell 命令,因此我可以 运行 命令在所有源代码文件上。

有没有办法使用 clang-format 来“仅缩进”?如果是,怎么做?

例如 space-only,4-spaces.

Clang 格式始终使用默认格式。您可以自定义它。如果您不指定样式,则会选择 clang-format 默认值。 [1],[2]

不幸的是,您不一定只修复缩进。

在您的问题的评论中,KamilCuk 建议使用 indent 可能指的是 https://www.gnu.org/software/indent/

我考虑过配置一个只做缩进的自定义样式,但是不幸的是,在查看样式选项时,有些可能会改变代码库,具体取决于它的外观,比如 AllowShortIfStatementsOnASingleLine 这不允许

共存
if (a)
  return ;
else {
  return;
}
if (b) return ;
else {
  return;
}

因此,您可能会找到适用于您的代码库的特定配置,但这将非常具体且脆弱。

[1]

The configuration file can consist of several sections each having different Language: parameter denoting the programming language this section of the configuration is targeted at. See the description of the Language option below for the list of supported languages. The first section may have no language set, it will set the default style options for all lanugages. Configuration sections for specific language will override options set in the default section.

https://clang.llvm.org/docs/ClangFormatStyleOptions.html#configuring-style-with-clang-format

[2]

This section lists the supported style options. Value type is specified for each option. For enumeration types possible values are specified both as a C++ enumeration member (with a prefix, e.g. LS_Auto), and as a value usable in the configuration (without a prefix: Auto).

BasedOnStyle (string) The style used for all options not specifically set in the configuration.

https://clang.llvm.org/docs/ClangFormatStyleOptions.html#configurable-format-style-options

我没有可以在所有源文件上执行此操作的 Shell 脚本,但是,我使用 VSCode 允许我在 settings.json 这样每次我保存文件时,它都会始终如一地对每个文件应用相同的格式。这是我的 settings.json C_Cpp.clang_format_fallbackStyle 的示例,它应用了 4 的缩进宽度。

    "C_Cpp.clang_format_fallbackStyle": " {BasedOnStyle: Google, AllowShortCaseLabelsOnASingleLine: true, AlignConsecutiveDeclarations: true, AllowShortFunctionsOnASingleLine: All, AlignTrailingComments: true, Language: Cpp, AlwaysBreakAfterReturnType: None, PenaltyReturnTypeOnItsOwnLine: 9999, PointerAlignment: Left, SortIncludes: true, IndentWidth: 4, ColumnLimit: 0, BreakBeforeBraces: Allman, SpacesBeforeTrailingComments: 5, AlignAfterOpenBracket: true, AlignConsecutiveAssignments: true, AlignConsecutiveMacros : true}",

https://clang.llvm.org/docs/ClangFormatStyleOptions.html 本文档将解释此选项的不同参数和值。对于您的具体问题,我会查看“IndentWidth”和“UseTab”。