web-dev-qa-db-fra.com

Est-il possible de formater du code C++ avec VIM?

Je suis plutôt nouveau dans VIM. J'ai un code source et c'est un gâchis. À première vue, j'aimerais au moins avoir une vue claire et organisée du code. J'aime donc le mettre correctement en forme, je veux dire en retrait en fonction de la profondeur des fonctions, etc.

Je me demande si cela peut être fait avec VIM, et sinon quels autres outils en ligne de commande pour cela pouvez-vous recommander.

Merci

31
flow

Bien que vim soit un vrai couteau suisse, je préfère toujours les outils externes pour certains travaux. Cette approche est parfois beaucoup plus intuitive et facile à retenir que l’utilisation de l’équivalent intégré.

Dans le cas de l'indentation, je filtre le tampon de fichier entier par astyle. Les paramètres astyle sont beaucoup plus faciles à comprendre en quelques minutes, surtout si vous n’êtes pas un vim guru. De plus, astyle offre beaucoup plus de flexibilité pour ajuster la sortie.

Installez d'abord astyle:
# apt-get install astyle

Puis à l'intérieur de vim:
:%!astyle (cas simple - le mode par défaut est C/C++)
ou
:%!astyle --mode=c --style=ansi -s2 (style ansi C++, utilisez deux espaces par niveau d'indentation)
ou
:1,40!astyle --mode=c --style=ansi (style ansi C++, ne filtrer que les lignes 1 à 40) 

59
m000

vous pouvez faire ce qui suit:

gg=G
27
codaddict

Je recommande fortement le format Clang de nos jours. Il permet une intégration simple du format clang dans Vim, une fois le format clang installé:

http://clang.llvm.org/docs/ClangFormat.html#vim-integration

C’est le seul logiciel d’embellissement de code qui comprend vraiment votre code C++ et il est vraiment intelligent d’embellir le code davantage comme un être humain que comme une machine. Par exemple.:

void TestFunction(int argument1, int argument2,
                  int argument3);
void TestFunctionVeryLongName(int argument1,
                              int argument2,
                              int argument3);
void TestFunctionWithRidiculouslyLongName(
    int argument1, int argument2, int argument3);
13
Yongwei Wu

Il existe un plugin vim qui permet de formater votre code à partir de vim. Cela s'appelle vim-autoformat et vous pouvez le télécharger ici:

https://github.com/Chiel92/vim-autoformat

Il intègre des programmes externes de formatage de code dans vim. Par exemple, si vous souhaitez formater C, C++, C # ou Java code, vous devez installer le programme astyle et vim le définit automatiquement comme programme de formatage.

4
Chiel ten Brinke

Vim le fera certainement, bien que les résultats ne soient pas parfaits:

  1. Tout d’abord, sélectionnez le fichier entier en mode visuel: ggVG
  2. Appuyez ensuite sur = pour tout réindiquer.

Vous pouvez en apprendre plus sur la commande equal avec: :help =

4
Mike Mueller

Il existe également un plugin Vim s'appuyant sur clang-format : vim-clang-format

Ensuite, vous pouvez simplement mapper la commande de formatage à ce qui vous convient.

4
BenC

Je n'écris pas de code C++, mais j'écris du code Java.

Au lieu de cela, Vim prend en charge le formatage de certaines langues courantes. J'ai mis en place un raccourci qui me permet de formater tout le code dans la mémoire tampon. Il reviendra à la ligne que je viens d'éditer :)

" format the file
map <leader>fm gg=G'. 
2
code4j

Une solution générique s'inspirant de l'idée de m000 est d'utiliser UniversalIndentGUI comme outil externe.

1
Mike Summers

Je devais juste résoudre ce problème, alors je pensais contribuer à sauver du temps aux autres.

Vous pouvez utiliser gg=G pour indenter votre code. Mais les choses deviennent difficiles à comprendre au moment où vous voulez Tweak comment se passe l’indentation automatique. Par conséquent, si vous vous souciez uniquement de la suppression des blancs errants et du style de formatage, gg=G est le moyen le plus rapide de le résoudre, car il est intégré.

Si vous souhaitez contrôler le style (par exemple, vous essayez de rendre votre code conforme à un guide de style ), vous aurez besoin d'un outil externe pour traiter votre fichier. Vous pouvez appeler cet outil depuis vim avec: :%!<toolname> <options>. Cela dirige le fichier dans l'outil et recharge le résultat traité. (Vous pouvez évidemment utiliser ceci pour tout ce que vous voulez faire dans votre fichier aussi)

La prochaine question est donc: quel outil externe devriez-vous choisir? Quoi qu'il en soit, la méthode est la même:

  1. Installer l'outil de choix
  2. Assurez-vous qu'il est sur votre chemin
  3. Ajoutez une ligne à votre fichier vimrc qui crée un raccourci clavier à utiliser pour gagner du temps.
  4. Utilise le.

Désormais, l’outil que vous utilisez dépend du style que vous essayez de répliquer. Si vous essayez de reproduire un style largement utilisé, il vous suffira probablement de astyle

Si vous essayez de reproduire un style personnalisé, vous aurez besoin de deux choses:

  1. UniversalIndentGui - un frontal qui vous permet de jouer avec diverses options et de prévisualiser en direct leur effet sur le fichier source
  2. Un ensemble d'outils de formatage de code source installés et dans votre chemin

Entre uncrustify et greatcode , vous devriez être en mesure de reproduire complètement le style souhaité.

En fait, j'ai menti. Il existe un autre moyen et s'appelle clang-format . Cependant, vous allez vouloir lire la documentation à ce sujet et ses débuts, donc certaines options ne fonctionnent pas très bien. C’est quand même un bel outil (certainement le plus intelligent du lot, car il construit un AST de votre code) et il est même disponible pour Windows. 

Si vous prenez le temps de lire le manuel, vous devez également vérifier GNU Indent .

Bien sûr, il y a le dernier moyen, qui consiste à prendre le temps d'apprendre les règles d'indentation de vim et à en écrire un pour votre style. Cela prendra du temps, mais cela fonctionnera avec gg=G.

Quelques notes sur astyle vs uncrustify vs greatcode:

  1. Astyle est bon pour le formatage général, mais ne peut pas faire des choses comme aligner très bien la déclaration de variables et reformater les commentaires.
  2. Uncrustify peut faire BEAUCOUP de choses que l'asstyle ne peut pas, mais soyez prêt à passer une heure à jouer jusqu'à ce que vous ayez trouvé la bonne combinaison d'options dont vous avez besoin. (Ou si vous avez envie de perdre beaucoup de temps, utilisez des algorithmes génétiques pour déterminer la meilleure combinaison d'options pour votre style, partagez le code et donnez-moi un lien afin que je puisse l'utiliser aussi :))

Notez que vous n'avez pas à choisir un seul outil. Avec vim, vous pouvez mapper une frappe pour exécuter plusieurs commandes successives. Vous pouvez donc théoriquement utiliser une combinaison de ces outils pour obtenir exactement ce que vous recherchez.

Enfin et surtout, voici un extrait de mon fichier .vimrc, où j'ai mappé F12 pour invoquer astyle avec certaines options:

"A2 = attached brackets
"-s8 indent 8 spaces
"-xc attached braces to class declarations
"-xj remove braces for single statement ifs and elses
"-c convert tabs to spaces in the non-indentation part of the line
map <F12> :%!astyle -A2 -s8 -xc -xj -c<CR>

Ne me juge pas sur le style. Utilisez simplement l'outil pour reproduire ce que vous voulez.

0
Carl