以不区分大小写的方式使clang格式顺序包含 clang 格式IncludeCategories (std::vector<IncludeCategory>)

问题描述

我正在尝试配置.clang格式。我的目的是使包含组保持在代码中的原样,但按字母顺序对它们进行排序。我设法通过mypy达到了想要的结果,但是它以区分大小写的方式对每个块中的内容进行了排序:

这是应用格式后得到的结果

mypy

这就是我想要实现的

3.8.6

我使用的是clang格式的版本10.0。我的.clang格式文件,如果相关的话:

0.782

谢谢!

解决方法

这是从 LLVM 12 开始添加的(将在 Clang 13 中发布?有点令人困惑);引用the in-progress release notes of LLVM 12/Clang 13 [强调我的]:

clang 格式

Option SortIncludes 已从 bool 更新为 enum 向后兼容。除了之前的 true/false 状态(现在为 CaseInsensitive/Never),添加了第三个状态 (CaseSensitive) 导致字母排序,大小写用作 决胜局。

// Never (previously false)
#include "B/A.h"
#include "A/B.h"
#include "a/b.h"
#include "A/b.h"
#include "B/a.h"

// CaseInsensitive (previously true)
#include "A/B.h"
#include "A/b.h"
#include "B/A.h"
#include "B/a.h"
#include "a/b.h"

// CaseSensitive
#include "A/B.h"
#include "A/b.h"
#include "a/b.h"
#include "B/A.h"
#include "B/a.h"

most recent Clang Format docs 已更新为使用 CaseSensitive 的示例:

IncludeCategories (std::vector<IncludeCategory>)

[...]

每个正则表达式都可以用字段标记为区分大小写 CaseSensitive,默认情况下不是。

要在 .clang 格式文件中进行配置,请使用:

IncludeCategories:
  - Regex:           '^"(llvm|llvm-c|clang|clang-c)/'
    Priority:        2
    SortPriority:    2
    CaseSensitive:   true
  - Regex:           '^(<|"(gtest|gmock|isl|json)/)'
    Priority:        3
  - Regex:           '<[[:alnum:].]+>'
    Priority:        4
  - Regex:           '.*'
    Priority:        1
    SortPriority:    0