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
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)
vous pouvez faire ce qui suit:
gg=G
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);
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.
Vim le fera certainement, bien que les résultats ne soient pas parfaits:
Vous pouvez en apprendre plus sur la commande equal avec: :help =
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.
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'.
Une solution générique s'inspirant de l'idée de m000 est d'utiliser UniversalIndentGUI comme outil externe.
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:
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:
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:
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.