я использую clang-format
(версия 3.5) с Emacs (версия 24.5.2). Вот простой кусок кода, отформатированный clang-format
в стиле LLVM:
int main() {
std::cout << "> ";
std::string word;
while (std::cin >> word) {
std::cout << std::accumulate(word.cbegin(), word.cend(), 0,
[](int cur, char ch) {
return cur + (ch - '0');
}) << std::endl << "> ";
}
return 0;
}
Обратите внимание, как он выровнял тело и закрывающую скобку lambda
, Есть ли какая-то логика в этом форматировании или это просто отсутствие поддержки lambda
s? Есть ли параметры конфигурации clang-format
что мне нужно установить для лучшего форматирования?
std::accumulate(word.cbegin(), word.cend(), 0, [](int cur, char ch) { return cur + (ch - '0'); })
Здесь у нас есть длинный вызов функции. Чтобы очистить его, мы берем длинный аргумент и разбиваем его на собственную строку:
std::accumulate(word.cbegin(), word.cend(), 0,
[](int cur, char ch) { return cur + (ch - '0'); })
когда мы делаем это, мы добавляем аргумент в соответствие с (
:
std::accumulate(word.cbegin(), word.cend(), 0,
[](int cur, char ch) { return cur + (ch - '0'); })
Все идет нормально. Теперь у нас есть открытый {
, Ну, это означает, что новая строка
std::accumulate(word.cbegin(), word.cend(), 0,
[](int cur, char ch) {
return cur + (ch - '0'); })
с отступом. Где основание отступа? Ну, начало std::accumulate
, Добавьте 4 пробела:
std::accumulate(word.cbegin(), word.cend(), 0,
[](int cur, char ch) {
return cur + (ch - '0'); })
тогда мы попали в }
, Новая строка, backdent:
std::accumulate(word.cbegin(), word.cend(), 0,
[](int cur, char ch) {
return cur + (ch - '0');
})
наконец, вставьте это в середину большего выражения, и вы получите беспорядок, который вы имели выше.
Вышесказанное является чисто обоснованной историей, не основанной на опыте clang-format
, Я не могу сказать вам, как сделать это лучше.
Вы могли бы хотеть AlignAfterOpenBracket: false
принести это []
оставил.
На мой взгляд, выравнивание после открытой скобки вызывает слишком много пустого пространства, поэтому удивительно, что оно так популярно. использование ContinuationIndentWidth
контролировать, как далеко отступы должны быть продолжения.
Лямбды до сих пор не выровнены идеально, но, по крайней мере, ваше лямбда-отверстие не находится за милю вправо. Я не совсем доволен форматированием лямбд в clang-формате.