Comment puis-je mettre en forme / indenter le code C dans vim?


250

Lorsque je copie du code à partir d'un autre fichier, le formatage est foiré, comme ceci:

fun()
{
for(...)
{
for(...)
{
if(...)
{
}
}
}
}

Comment puis-je mettre en forme automatiquement ce code dans vim?


3
Pour tous ceux qui cherchent à formater et pas seulement à mettre en retrait le code, la deuxième réponse (la mienne) répond à cela. Si vous souhaitez simplement corriger l'indentation, la réponse acceptée est le moyen le plus simple.
Derek

Réponses:


566

Essayez les frappes suivantes:

gg=G

Explication: ggva en haut du fichier, =est une commande pour corriger l'indentation et lui Gdit d'effectuer l'opération jusqu'à la fin du fichier.


28
cela ne met en retrait que le code. ne peut-on pas faire quelque chose pour AUTOFORMAT le tout?
N 1.1

7
Quelle est la différence?
Ton van den Heuvel

3
@Ton van: Voir ma réponse pour la différence (n'aurait pas pu être expliqué ici dans les commentaires).
Lazer

2
-1 Cela corrige uniquement l'indentation, pas la mise en forme (ce qui était demandé).
oligofren

3
@oligofren L'exemple du PO ne comprenait que des erreurs d'indentation et il accepte la réponse, donc je suppose que c'est ce qu'il voulait dire.
Amir Rachum

78

J'aime utiliser le programme Artistic Style. Selon leur site Web :

Artistic Style est un indenteur, un formateur et un embellisseur de code source pour les langages de programmation C, C ++, C # et Java.

Il fonctionne sous Windows, Linux et Mac. Cela fera des choses comme le retrait, le remplacement des tabulations par des espaces ou vice-versa, la mise en place des espaces autour des opérations comme vous le souhaitez (conversion if(x<2)en si ( x<2 )si vous le souhaitez), la mise en accolade sur la même ligne que les définitions de fonction, ou leur déplacement vers le ligne ci-dessous, etc. Toutes les options sont contrôlées par des paramètres de ligne de commande.

Pour l'utiliser dans vim, définissez simplement l'option formatprg, puis utilisez la commande gq. Ainsi, par exemple, j'ai dans mon .vimrc:

autocmd BufNewFile,BufRead *.cpp set formatprg=astyle\ -T4pb

de sorte que chaque fois que j'ouvre un fichier .cpp, formatprg est défini avec les options que j'aime. Ensuite, je peux taper gg pour aller en haut du fichier et gqGformater le fichier entier selon mes standards. Si je n'ai besoin que de reformater une seule fonction, je peux aller en haut de la fonction, puis taper gq][et elle reformatera juste cette fonction.

Les options que j'ai pour astyle -T4pb, ne sont que mes préférences. Vous pouvez parcourir leurs documents et modifier les options pour qu'il formate le code comme vous le souhaitez.

Voici une démo. Avant astyle:

int main(){if(x<2){x=3;}}

float test()
{
if(x<2)
x=3;
}

Après astyle (gggqG):

int main()
{
    if (x < 2)
    {
        x = 3;
    }
}

float test()
{
    if (x < 2)
        x = 3;
}

J'espère que cela pourra aider.


3
Existe-t-il quelque chose comme ça pour d'autres formats; rubis, xml, json, etc.?
derGral

1
@Ryan check vim-autoformat, voir la réponse ci-dessous. BTW vim-autoformat utilise également astyle entre autres.
Chiel ten Brinke

1
Je vous remercie! Je commençais à penser que j'étais la seule personne dans le mot qui ne voulait pas que leurs parenthèses ouvrantes soient sur la même ligne que la déclaration de fonction!
user3640967

27

La commande intégrée pour indenter correctement le code a déjà été mentionnée ( gg=G). Si vous souhaitez embellir le code, vous devrez utiliser une application externe comme l' indentation . Puisque %dénote le fichier actuel en mode ex, vous pouvez l'utiliser comme ceci:

:!indent %


11

Je trouve que ça clang-formatmarche bien.

Il existe des exemples de raccourcis clavier dans la documentation de Clang

Je préfère utiliser la equalprgreliure en vim. Cela vous permet d'appeler clang-formatavec G=ggou d'autres =options de retrait.

Mettez simplement ce qui suit dans votre fichier .vimrc:

autocmd FileType c,cpp setlocal equalprg=clang-format

3
Besoin de l'installer d'abord, par exemple pour Ubuntu 16.04+:sudo apt install clang-format
Eric Wang

3

Vous pouvez peut-être essayer les éléments suivants $ indent -kr -i8 * .c

J'espère que cela vous sera utile!


3

J'aime comme indentmentionné ci-dessus, mais le plus souvent, je ne souhaite formater qu'une petite section du fichier sur lequel je travaille. Puisque indentpeut prendre le code de stdin, c'est vraiment simple:

  1. Sélectionnez le bloc de code que vous souhaitez formater avec Vou similaire.
  2. Formatez en tapant :!indent.

astyle prend également stdin, vous pouvez donc utiliser la même astuce.


2

Je voulais ajouter que pour éviter qu'il ne soit gâché en premier lieu, vous pouvez taper :set pasteavant de coller. Après avoir collé, vous pouvez taper :set nopastepour des choses comme js-embellir et mettre en retrait pour travailler à nouveau.


1
J'utilise :set paste!pour cela, qui bascule la valeur de collage au lieu de la définir. Cela facilite la désactivation car vous pouvez simplement faire défiler en arrière quelques commandes et appuyer sur Entrée.
a'r

0

Leur est un outil appelé indent. Vous pouvez le télécharger avec apt-get install indent, puis l'exécuter indent my_program.c.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.