如何使用 clang-format 3.9 忽略文件或目录

Posted

技术标签:

【中文标题】如何使用 clang-format 3.9 忽略文件或目录【英文标题】:How to ignore files or directories with clang-format 3.9 【发布时间】:2018-11-11 20:43:24 【问题描述】:

我目前正在使用 travis ci 来检查进入 github 的补丁,并试图弄清楚是否有 clang-format 3.9(因为 travis ci 目前仅支持最新的 ubuntu 14.04)忽略整个目录或扫描更改时的文件。

我的 .travis.yml 文件:

language: c++
sudo: required
dist: trusty
install:
- sudo apt-get update
- sudo apt-get install clang-format-3.9 python3
- ./travisci/check_patch.py

我的 travisci/check_patch.py​​ 文件:

#!/usr/bin/env python3

from subprocess import Popen, PIPE, STDOUT

# Run clang to check if code changes cause a diff output and return 1 if so.
cmd = "git show origin/master..@ | clang-format-diff-3.9 -p 1 -style=file"
diff = Popen(cmd, stdout=PIPE, shell=True).communicate()[0]
if diff:
    print("Code formatting is not according to style guidelines. Read https://github.com/intel/IA-Hardware-Composer/wiki/Contributions#coding_style")
    exit(1)

exit(0)

【问题讨论】:

【参考方案1】:

个别文件否,但目录,是

正如here 所说,您可以将新的.clang-format-file 放在包含不需要格式化的文件的文件夹中。

示例:我有一个项目,其中包含一个仅包含标头的库,例如 cppzmq,并且我希望仅对 my 源文件进行格式化以在更新库时保持差异较小。所以我创建了一个布局,例如:

project/
├ include/
│ ├ 3rdparty/
│ │ ├ .clang-format   (1)
│ │ └ zmq.hpp
│ └ my_app.hpp
├ src/
│ └ my_app.cpp
└ .clang-format       (2)

第一个 .clang-format 持有:


    "DisableFormat": true,
    "SortIncludes": "Never"  // with clang-format version < 13 use `false` here.

DisableFormat 似乎没有禁用包含排序,因此必须明确给出。)

第二.clang-format 保存了你常用的 clang 格式配置。

确保您的全局/项目级 clang-format 的 style 设置设置为 File


编辑:如果您的 clang-format 抱怨第二行的值无效,请添加尾随逗号:


    "DisableFormat": true,
    "SortIncludes": "Never",

或使用 YAML 语法代替 JSON:

DisableFormat: true
SortIncludes: Never

【讨论】:

这对 JSON 格式真的有用吗?我不得不像您链接到的示例中那样切换到 YAML:***.com/questions/51326844/… 是的。你得到哪个错误?另请注意底部有额外逗号的替代方案。 YAML 是 JSON 的超集,因此不会引起任何问题。 @jfly @Julia 如果 JSON 写入不正确,它可以。 JSON 在引用和逗号(因为它更严格)方面比 YAML(它有自己的一组常见错误)更容易出错。 这很奇怪;我得到以下信息:3rd-party/.clang-format:3:21: error: invalid boolean "SortIncludes": "Never",;将其更改为 false 可以解决问题(我正在运行 clang-format 12.0.1【参考方案2】:

在这里查看我的答案:https://***.com/a/51793637/2751261。基本上,我使用查找脚本来选择有关我的标准的文件和文件夹,然后将 clang-format 应用于每个文件和文件夹。这是因为到目前为止我还没有找到任何 clang 格式的选项。

我知道这不是您期望的答案,但我希望它很方便。

【讨论】:

以上是关于如何使用 clang-format 3.9 忽略文件或目录的主要内容,如果未能解决你的问题,请参考以下文章

clang-format 打破 lint 注释

我如何告诉 clang-format 遵循这个约定?

如何在 Ubuntu 中安装 clang-format?

clang-format 如何不将 if 语句放在一行中?

将 clang-format 与 c++20 概念一起使用

如何告诉 clang-format 缩进可见性修饰符?