Я использую формат clang для сортировки и группировки включаемых файлов. По какой-то устаревшей причине я должен использовать достаточно длинное регулярное выражение в разделе IncludeCategories. Варианты стиля описаны здесь.
IncludeCategories:
- Regex: '^"(very|long|regex|pattern|here)/'
Priority: 2
Есть ли (задокументированный?) способ разделить такое регулярное выражение на несколько строк (без создания дублирующегося раздела с одинаковым приоритетом)?
Вы пытались вставить новые строки в нужные места в регулярном выражении?
Я сделал именно так, и это работает в моем случае. Возможно, есть какие-то дополнительные ограничения, и мой пример был достаточно простым, чтобы он работал. Чтобы проверить эту проблему, я скопировал формат .clang из одного из проектов с открытым исходным кодом на Github и немного изменил его.
Исходный .clang-формат:
IncludeCategories:
- Regex: '^("boost/first.hpp")'
Priority: 1
SortPriority: 0
CaseSensitive: true
- Regex: '^("boost/second.hpp")'
Priority: 2
SortPriority: 0
CaseSensitive: true
- Regex: '^<(algorithm|any|array|atomic|barrier|bit|bitset|cassert|cctype|cerrno|cfenv|cfloat|charconv|chrono|cinttypes|climits|clocale|cmath|codecvt|compare|complex|concepts|condition_variable|coroutine|csetjmp|csignal|cstdarg|cstddef|cstdint|cstdio|cstdlib|cstring|ctime|cuchar|cwchar|cwctype|deque|exception|execution|filesystem|format|forward_list|fstream|functional|future|initializer_list|iomanip|ios|iosfwd|iostream|istream|iterator|latch|limits|list|locale|map|memory|memory_resource|mutex|new|numbers|numeric|optional|ostream|queue|random|ranges|ratio|regex|scoped_allocator|semaphore|set|shared_mutex|source_location|span|sstream|stack|stdexcept|stop_token|streambuf|string|string_view|strstream|syncstream|system_error|thread|tuple|typeindex|typeinfo|type_traits|unordered_map|unordered_set|utility|valarray|variant|vector|version)>'
Priority: 3
SortPriority: 0
CaseSensitive: true
- Regex: '^<(assert|complex|ctype|errno|fenv|float|inttypes|iso646|limits|locale|math|setjmp|signal|stdalign|stdarg|stdatomic|stdbool|stddef|stdint|stdio|stdlib|stdnoreturn|string|tgmath|threads|time|uchar|wchar|wctype)\.h>'
Priority: 4
SortPriority: 0
CaseSensitive: true
Начальный порядок исходного кода:
#include "boost/first.hpp"
#include "boost/second.hpp"
#include <algorithm>
#include <cmath>
#include <codecvt>
#include <cuchar>
#include <fstream>
#include <iosfwd>
#include <iostream>
#include <memory>
#include <random>
#include <streambuf>
#include <string>
#include <thread>
#include <unordered_set>
#include <valarray>
#include <vector>
#include <limits.h>
#include <stddef.h>
Модифицированный .clang-формат. Обратите внимание, что третье регулярное выражение теперь охватывает несколько строк, а его приоритет изменен с 3 на 1. Контуры добавляются как в конец, так и в начало каждой разделенной строки регулярного выражения.
IncludeCategories:
- Regex: '^("boost/first.hpp")'
Priority: 1
SortPriority: 0
CaseSensitive: true
- Regex: '^("boost/second.hpp")'
Priority: 2
SortPriority: 0
CaseSensitive: true
- Regex: '^<(algorithm|any|array|atomic|barrier|bit|bitset|cassert|cctype|cerrno|cfenv|cfloat|charconv|chrono|cinttypes|climits|clocale|cmath|
|codecvt|compare|complex|concepts|condition_variable|coroutine|csetjmp|csignal|cstdarg|cstddef|cstdint|cstdio|cstdlib|cstring|ctime|
|cuchar|cwchar|cwctype|deque|exception|execution|filesystem|format|forward_list|fstream|functional|future|initializer_list|iomanip|ios|
|iosfwd|iostream|istream|iterator|latch|limits|list|locale|map|memory|memory_resource|mutex|new|numbers|numeric|optional|ostream|queue|
|random|ranges|ratio|regex|scoped_allocator|semaphore|set|shared_mutex|source_location|span|sstream|stack|stdexcept|stop_token|streambuf|
|string|string_view|strstream|syncstream|system_error|thread|tuple|typeindex|typeinfo|type_traits|unordered_map|unordered_set|utility|
|valarray|variant|vector|version)>'
Priority: 1
SortPriority: 0
CaseSensitive: true
- Regex: '^<(assert|complex|ctype|errno|fenv|float|inttypes|iso646|limits|locale|math|setjmp|signal|stdalign|stdarg|stdatomic|stdbool|stddef|stdint|stdio|stdlib|stdnoreturn|string|tgmath|threads|time|uchar|wchar|wctype)\.h>'
Priority: 4
SortPriority: 0
CaseSensitive: true
Измененный порядок исходного кода. Обратите внимание, что boost/second.hpp был включен после всех включений, которые теперь имеют больший приоритет. Заголовки, которые заканчивают строку (например, cmath и streambuf), а также заголовки, которые начинают новую строку (например, codecvt и iosfwd), упорядочены правильно:
#include "boost/first.hpp"
#include <algorithm>
#include <cmath>
#include <codecvt>
#include <cuchar>
#include <fstream>
#include <iosfwd>
#include <iostream>
#include <memory>
#include <random>
#include <streambuf>
#include <string>
#include <thread>
#include <unordered_set>
#include <valarray>
#include <vector>
#include "boost/second.hpp"
#include <limits.h>
#include <stddef.h>
Я обновил свой пример, чтобы clang-format форматировал заголовки, которые заканчивают строку регулярного выражения, заголовки, которые начинают новую строку регулярного выражения, и некоторые заголовки между ними.
Это поведение где-то задокументировано?
Не то, что я знаю из. Я сделал обоснованное предположение, что он может работать с этим подходом, основываясь на том, как работает большинство парсеров.
Не могли бы вы указать, какую версию clang-формата вы использовали?
Выход clang-format --version: Ubuntu clang-format version 14.0.0-1ubuntu1
Если этот ответ решит вашу проблему, отметьте его как принятый и назначьте вознаграждение.
Вы пробовали сортировать заголовки, которые начинают новую строку? Это codecvt, cuchar, iosfwd, random, string и valarray из вашего измененного файла в формате .clang.