web-dev-qa-db-fra.com

Comment puis-je formater / mettre en retrait le code C dans vim?

Lorsque je copie le code d'un autre fichier, le formatage est perturbé, comme ceci:

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

Comment puis-je formater automatiquement ce code dans vim?

237
Yongwei Xing

Essayez les frappes suivantes:

gg=G

Explication: gg va au début du fichier, = est une commande permettant de réparer l'indentation et G lui indique d'effectuer l'opération jusqu'à la fin du fichier.

536
Amir Rachum

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

Artistic Style est un outil de saisie, de mise en forme et d’embellissement de code source destiné aux langages de programmation C, C++, C # et Java.

Il fonctionne sous Windows, Linux et Mac. Cela fera des choses comme indenter, remplacer les tabulations par des espaces ou vice-versa, mettre des espaces autour des opérations comme vous le souhaitez (convertir if(x<2) en if ( x<2 ) si c'est comme ça que vous aimez), mettre des accolades sur le même line en tant que définitions de fonction, ou en les déplaçant sur la 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. Donc, 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 qui me conviennent. Ensuite, je peux taper gg pour aller en haut du fichier, et gqG formater le fichier entier selon mes normes. Si je n'ai besoin de reformater qu'une seule fonction, je peux aller en haut de la fonction, puis taper gq][ et il va reformater juste cette fonction.

Les options que j'ai pour astyle, -T4pb, ne sont que mes préférences. Vous pouvez regarder à travers leur documentation , et changer les options pour le formater à votre guise.

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 ça t'as aidé.

77
Derek

Le PO a demandé le formatage automatique, mais a accepté une réponse qui effectue uniquement un retrait automatique.

Voici la différence:

ORIGINAL

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

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

AUTOINDENT

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

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

FORMAT AUTOMATIQUE

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

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

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

:!indent %
26
soulmerge

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

13
Chiel ten Brinke

Je trouve que clang-format fonctionne bien.

Il existe quelques exemples de combinaisons de touches dans le documentation clang

Je préfère utiliser la liaison equalprg dans vim. Cela vous permet d'appeler clang-format avec G=gg ou d'autres options = indent.

Il suffit de mettre ce qui suit dans votre fichier .vimrc:

autocmd FileType c,cpp setlocal equalprg=clang-format
9
Daniel

Peut-être que vous pouvez essayer ce qui suit $ indent -kr -i8 * .c

J'espère que c'est utile pour vous!

3
lattimore

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

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

astyle prend stdin aussi, vous pouvez donc utiliser la même astuce ici.

3
dsummersl

Je voulais ajouter que, pour éviter toute confusion, vous pouvez taper :set paste avant de coller. Après avoir collé, vous pouvez taper :set nopaste pour des choses comme js-beautify et indenting pour fonctionner à nouveau.

1
atripes

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

0
n0va_sa