#diff #git #text #utility #cli

程序+库 cformat

一个使用 clang-format(1) 逐步重格式化更改文件的程序

1 个不稳定版本

0.1.0 2022 年 6 月 28 日

#2912解析器实现

GPL-3.0-or-later

16KB
76

cformat

目的

cformat 是一个程序,用于使用 clang-format 方便地格式化 C 或 C++ 文件所做的更改。与大多数格式化程序不同,该程序允许进行 增量 重格式化文件。也就是说,当文件中的某行更改时,仅该行(可选地带有一些上下文)将被重格式化,而文件的其他部分将保持原样。这种行为在逐步迁移代码库以实现自动格式化的过程中非常有用。

由于该程序仅是 clang-format 的包装程序,因此它将自动获取相应的配置。

用法

cformat 解析统一差异格式补丁,并根据它推断文件和更改的行。此补丁从标准输入读取。

虽然与 git 没有直接关联,但我们在这里使用它进行说明(并且因为它很可能是程序将被使用的上下文)。为了简化使用,我们引入了一个 git 别名(git cfp -- "c format patch")来检索任何当前暂存的更改并将它们传递给程序。用于注释当前暂存更改的别名可能如下所示

[alias]
  cfp = "!cfp() { git diff --no-prefix --relative --staged --unified=0 \"$@\" | cformat; }; cfp"

一旦您暂存了更改,您就可以运行 git cfp,受影响的行将根据 clang-format 的规则进行重格式化。

上述定义中的以下三个方面在这里特别相关

  • --no-prefix 非常重要,以确保输出的差异中包含的路径不包含任何 a/ 前缀,而直接映射到文件系统中的文件
  • --relative 是必要的,因为没有它,git 会输出相对于仓库根目录的文件名,而 cformat 可能是从子目录调用的,在这种情况下,路径不一定映射到文件
  • --unified=0 确保只有实际被修改的行会被重新格式化,而不是用于模糊匹配的上下文中的行;增加上下文以格式化更多被修改周围的行

安装

cformat是用Rust编写的,需要Cargo包管理器来构建。可以使用以下命令安装:cargo install cformat。它依赖于已安装和可运行的clang-format

依赖

~2.9–4MB
~68K SLoC