6 votes

Reformater les accolades C++ sans modifier l'indentation?

Nous aimerions rendre notre style de parenthèses en C++ plus cohérent. En ce moment, notre code contient un mélange de :

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

... et :

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

Nous voulons utiliser exclusivement ce dernier style.

Cependant, nous ne voulons pas changer l'indentation de notre code. J'ai essayé d'utiliser astyle, bcpp, GNU indent et Uncrustify (et j'ai examiné les options en ligne de commande pour GreatCode). Malheureusement, chacun de ces outils insiste pour ré-indenter notre code, et la plupart d'entre eux déforment assez mal les listes d'initialisation des constructeurs C++ et les macros du préprocesseur.

Existe-t-il des embellisseurs de code C++ qui peuvent corriger les accolades tout en laissant l'indentation telle quelle ? Ce n'a pas besoin d'être un outil préexistant - si vous savez comment le faire en utilisant une ligne de commande Perl un peu folle, c'est aussi bien. Merci !

Mise à jour : Oui, nous sommes conscients que cela rendra difficile la lecture des différences par rapport au code plus ancien. Il s'agit d'un nettoyage de code reporté depuis longtemps, et nous avons décidé que les avantages quotidiens d'un formatage cohérent l'emportent sur les difficultés de contrôle de version.

7voto

Josh Kelley Points 24438

Voici une commande Perl en une ligne qui devrait faire ce que vous voulez.

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;'

Cela transforme ceci :

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;
}

en ceci :

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;
}

3voto

Vous devriez vraiment réfléchir à deux fois, voire trois fois, avant de faire cela. Cela détruira complètement l'historique de révision de votre système de contrôle de code source au moment du changement. Vous utilisez un système de contrôle de code source, n'est-ce pas ?

3voto

laalto Points 50581
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

Cela transforme en premier lieu } else en } else, puis supprime les fins de ligne de {.

Pour appliquer ceci à un arbre de fichiers source, utilisez find et 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;}'

2voto

James Curran Points 55356

La commande UNIX Indent (http://fr.wikipedia.org/wiki/Indent_(Unix)) (disponible pour les PC de GNU) dispose d'un million d'options pour personnaliser le reformatage exactement comme vous le souhaitez.

1voto

DaClown Points 1520

Ne serait-ce pas qu'une poignée de regex simples suffiraient? Comme (\)?\n.?\{) -> (\) \{) pour supprimer l'espace entre une parenthèse fermante et une accolade ouvrante.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X