Ответ 1
Итак, столкнувшись в коде формата clang и сделав несколько патчей, вот мои два цента:
-
Формат Clang основан на
- анализ АСТ с помощью
libclang
, который в основном устраняет все пробелы - разбиение последовательности токенов на "развернутые строки", которые похожи на "логические" строки кода
- Применение правил/информации о конфигурации, чтобы иногда разделить "развернутые строки" на более мелкие единицы.
- Спрячьте все это снова с новым пробелом/отступом
Нелегко заставить его относиться к оригинальному белоснегу, этот вид бросается, когда вы сначала разбираете код.
- анализ АСТ с помощью
-
Вы можете контролировать, где он размещает разрывы строк, наиболее легко,
- установка предела столбца
- с использованием опций "параметры пакета bin"
- установление штрафов за различные виды разрывов - перерыв после типа возврата функции, разрыв перед первым параметром вызова, разрыв строкового литерала, нарушение комментария...
- размещение комментариев в конце строки (формат clang не может удалить комментарий и поэтому должен разбить строку)
- используйте директивы off/on для clang-format
Вот одна вещь, которую вы могли бы попробовать:
std::vector<std::string> get_vec()
{
return std::vector<std::string> { //
"this is a test", //
"some of the lines are longer", //
"than other, but I would like", //
"to keep them on separate lines" //
};
}
Преимущество этого над // clang-format off
заключается в том, что если позднее вы измените ширину табуляции или какой-либо другой вариант, эти строки кода по-прежнему будут получать эти изменения форматирования, поэтому вам не нужно вручную переходить в области // clang-format off
Исправить это. Однако он все еще немного взломан, YMMV.
В конечном счете, clang-format
очень хочет ввести единый формат по всей базе кода, убедившись, что все строковые литералы отформатированы в одном стиле во всей вашей программе. Если вы хотите иметь микроуровневый контроль над решениями линейного разрыва, это не совсем в духе инструмента, и вам придется делать такие вещи, как отключить его.
Это может иногда разочаровывать esp. когда вы хотите делать что-то с массивами и выравнивать столбцы или что-то еще - например, здесь есть какой-то естественный код от lua C api:
static luaL_Reg const methods[] = {
{"matches", &dispatch::intf_match_unit},
{"to_recall", &dispatch::intf_put_recall_unit},
{"to_map", &dispatch::intf_put_unit},
{"erase", &dispatch::intf_erase_unit},
{"clone", intf_copy_unit},
{"extract", &dispatch::intf_extract_unit},
{"advance", intf_advance_unit},
};
Когда clang-format работает над этим, он обычно не собирается выравнивать правый столбец, и он собирается поместить в него фиксированное количество пробелов после запятых, и там вы не можете много сделать с этим afaik.
Или, если у вас есть 4 x 4 матрицы для использования с OpenGL:
constexpr float shadow_skew_hardcoded[16] =
{ 1.0f, 0.0f, 0.0f, 0.0f,
0.5f, 0.5f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f };
Если вы позволите clang-format работать над такими вещами, он просто собирается их калечить, а afaik там нет простого способа сделать его красивым, поэтому вам просто нужно прибегнуть либо к "большому количеству тривиальных комментариев", или используйте clang-format off, когда у вас есть что-то вроде этого. Это просто неотъемлемые ограничения инструмента. Если вам не нравится когда-либо делать что-то подобное, то это, вероятно, не инструмент для вас.