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?

Yongwei Xing
la source
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.

Amir Rachum
la source
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.

Derek
la source
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 %
soulmerge
la source
13

Le plugin vim-autoformat vous permet de formater votre tampon (ou sélections de tampons) avec une seule commande: https://github.com/Chiel92/vim-autoformat . Il utilise des programmes de format externe pour cela, avec un repli sur la fonctionnalité d'indentation de vim.

Chiel ten Brinke
la source
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
Daniel
la source
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!

lattimore
la source
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.

dsummersl
la source
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.

atripes
la source
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.

n0va_sa
la source