我想配置clang-format以便在C ++中对包含的标头进行排序,如下所示:
我在macOS上使用clang格式8.0.0。 我当前的配置(仅与include相关的代码段)如下:
SortIncludes: true
IncludeBlocks: Regroup
IncludeCategories:
# Headers in <> without extension.
- Regex: '<([A-Za-z0-9\/-_])+>'
Priority: 4
# Headers in <> from specific external libraries.
- Regex: '<((\bboost\b)|(\bcatch2\b))\/([A-Za-z0-9.\/-_])+>'
Priority: 3
# Headers in <> with extension.
- Regex: '<([A-Za-z0-9.\/-_])+>'
Priority: 2
# Headers in "" with extension.
- Regex: '"([A-Za-z0-9.\/-_])+"'
Priority: 1
在这种配置下,我假设系统/标准头没有扩展名。它不适用于UNIX / POSIX标头。自动检测到主标头并将其分配给优先级0。到目前为止,除外部库的类别外,所有标头似乎都按预期工作。似乎clang-format将其分配给优先级2。
预期结果:
#include "test.h"
#include <allocator/region.hpp>
#include <page.hpp>
#include <page_allocator.hpp>
#include <test_utils.hpp>
#include <utils.hpp>
#include <zone_allocator.hpp>
#include <catch2/catch.hpp> // <--------
#include <array>
#include <cmath>
#include <cstring>
#include <map>
实际结果:
#include "test.h"
#include <allocator/region.hpp>
#include <catch2/catch.hpp> // <--------
#include <page.hpp>
#include <page_allocator.hpp>
#include <test_utils.hpp>
#include <utils.hpp>
#include <zone_allocator.hpp>
#include <array>
#include <cmath>
#include <cstring>
#include <map>
如何配置优先级3以获得预期的结果?
答案 0 :(得分:1)
问题在于,氏族格式使用POSIX ERE regexes。而且那些不支持单词边界。
因此<catch2/catch.hpp>
将永远不匹配第二条规则。然后,对匹配的第三条规则求出相同的字符串。
如果它与第二条规则匹配,它将在此处停止,但由于没有,因此继续下一条规则。
只需删除正则表达式上的所有\b
。删除它们是安全的,因为您已经有单词边界:在左边有<
,在右边有/
,因此即使您可以使用单词boudaries,也将毫无用处。>
- Regex: '<(boost|catch2)\/([A-Za-z0-9.\/-_])+>'
Priority: 3
注意::请记住,-
内的[]
应该以反斜杠代替,除非它位于最后一个位置。那是因为它用于范围。因此,当您写[A-Za-z0-9.\/-_]
时,是指A-Za-z0-9.
到/
中的_
或range,可能并不意味着那样。
答案 1 :(得分:0)
我通过使用和修改clang格式文档中的示例来使它起作用:
SortIncludes: true
IncludeBlocks: Regroup
IncludeCategories:
# Headers in <> without extension.
- Regex: '<([A-Za-z0-9\Q/-_\E])+>'
Priority: 4
# Headers in <> from specific external libraries.
- Regex: '<(catch2|boost)\/'
Priority: 3
# Headers in <> with extension.
- Regex: '<([A-Za-z0-9.\Q/-_\E])+>'
Priority: 2
# Headers in "" with extension.
- Regex: '"([A-Za-z0-9.\Q/-_\E])+"'
Priority: 1
特别是,我将优先级3的正则表达式更改为更像原始的example:
'^(<|"(gtest|gmock|isl|json)/)'
此外,我添加了\ Q和\ E修饰符以避免Julio提到的问题。 现在一切都按预期进行。但是我仍然不知道为什么问题帖中的解决方案不起作用。