Переформатировать брекеты C ++ без изменения отступа? - PullRequest
6 голосов
/ 12 июня 2009

Мы хотели бы сделать наш стиль скобок C ++ более последовательным. Прямо сейчас наш код содержит смесь:

if (cond)
{
    // ...    
}
else
{
    // ...
}

... и:

if (cond) {
    // ...
} else {
    // ...
}

Мы хотим использовать последний стиль исключительно.

Однако мы не хотим изменить отступ нашего кода. Я попытался использовать astyle, bcpp, GNU Indent и Uncrustify (и я посмотрел на параметры командной строки для GreatCode). К сожалению, каждый из этих инструментов настаивает на переиндентировании нашего кода, и большинство из них очень плохо манипулируют списками инициализатора конструктора C ++ и макросами препроцессора.

Существуют ли какие-либо устройства для улучшения кода C ++, которые могут исправлять фигурные скобки, оставляя отступы в покое? Это не обязательно должен быть уже существующий инструмент - если вы знаете, как это сделать, используя какой-то сумасшедший однострочный Perl, это тоже хорошо. Спасибо!

Обновление: Да, мы знаем, что это затруднит чтение различий с более старым кодом. Это длительная очистка кода, и мы решили, что повседневные преимущества согласованного форматирования перевешивают любые трудности с контролем версий.

Ответы [ 6 ]

7 голосов
/ 12 июня 2009

Вот Perl с одной строкой, который должен делать то, что вы хотите.

perl -pi.bak -e 'BEGIN { undef $/; } s/\s*?(\s?\/\/.*)?\r?\n\s*{/ {\1/g; s/}(\s?\/\/.*)?\r?\n\s*else\b(.*)/} else\2\1/g;'

Оказывается так:

int main(int argc, char *argv[])
{
    int something = 0;
    if (something)    // 5-12-2007
    {
        printf("Hi!\n");
    }
    else   // 5-13-2007
    {
        printf("Bye\n");
    }
    return 0;
}

в это:

int main(int argc, char *argv[]) {
    int something = 0;
    if (something) { // 5-12-2007
        printf("Hi!\n");
    } else { // 5-13-2007
        printf("Bye\n");
    }
    return 0;
}
3 голосов
/ 12 июня 2009

Вы действительно должны подумать дважды и, вероятно, трижды, прежде чем делать это. Это полностью уничтожит историю изменений вашей системы контроля исходного кода в момент изменения. Вы используете систему контроля исходного кода, не так ли?

2 голосов
/ 12 июня 2009
perl -ei '$/=undef;while(<>){s/}\s*?(\s*\/\/^[\r\n]*)?\r?\n\s*else/} else$1/gm;s/(\s*\/\/[^\r\n]*)?\r?\n\s*{/ {$1/gm;print;}' yoursourcefile.cpp

Это сначала изменяет } <eol> <whitespace> else на } else, затем удаляет конец строки из <eol> <whitespace> {.

Чтобы применить это к исходному дереву, используйте find и xargs:

find . -name \*.cpp -print0 | xargs -0 perl -ei '$/=undef;while(<>){s/}\s*?(\s*\/\/^[\r\n]*)?\r?\n\s*else/} else$1/gm;s/(\s*\/\/[^\r\n]*)?\r?\n\s*{/ {$1/gm;print;}'
2 голосов
/ 12 июня 2009

Отступ команды UNIX (http://en.wikipedia.org/wiki/Indent_(Unix)) (доступно для ПК из GNU) имеет миллион опций для настройки преобразования в точности так, как вам нравится.

1 голос
/ 12 июня 2009

Разве рука, полная простых регулярных выражений, не сработает? Как (\). ? \ N. ? \ {) -> (\) \ {), чтобы удалить пробел между закрывающей скобкой и открывающей фигурной скобкой.

0 голосов
/ 12 июня 2009

В прошлом я решал подобные проблемы: сначала запустил такой инструмент, как astyle, для выполнения 95% того, что мы хотели, а затем написал сценарий Perl или Python поверх результата, чтобы завершить оставшиеся 5%. Попробуйте, всегда полезно знать ваши регулярные выражения. :)

...