Comment puis-je autoformat / indenter le code C dans vim?

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

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

Comment puis-je autoformater ce code dans vim?

217
demandé sur Jeffrey Bosboom 0000-00-00 00:00:00

10 réponses

Essayez les frappes suivantes:

gg=G

Explication: gg va vers le haut du fichier, = est une commande pour fixer l'indentation et G dit-il pour effectuer l'opération à la fin du fichier.

484
répondu Amir Rachum 2010-11-18 13:34:48

J'aime utiliser le style artistique du programme. Selon leur site web :

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

Il fonctionne dans Window, Linux et Mac. Il fera des choses comme indenter, remplacer les onglets par des espaces ou vice-versa, mettre des espaces autour des opérations comme vous le souhaitez (convertir {[3] } en if ( x<2 ) si c'est comme ça que vous l'aimez), mettre des accolades sur la même ligne que définitions de fonction, ou les déplacer vers 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. 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 gqG {[20] } pour formater le fichier entier en fonction de mon norme. Si j'ai seulement besoin de reformater une seule fonction, je peux aller en haut de la fonction, puis tapez gq][ et il va reformater juste que la fonction.

Les options que j'ai pour astyle, -T4pb, ne sont que mes préférences. Vous pouvez regarder à travers leurs documents, et changer 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 aider.

74
répondu Derek 2015-06-11 11:53:17

L'OP a demandé un formatage automatique, mais a accepté une réponse qui ne fait que l'indentation automatique.

Voici la différence:

ORIGINAL

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

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

AUTOINDENTS

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

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

Mise en forme automatique

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

float test()
{
    if (x < 2)
        x = 3;
}
51
répondu Lazer 2010-11-21 07:46:44

La commande intégrée pour indenter correctement le code a déjà été mentionnée (gg=G). Si vous voulez embellir le code, vous aurez besoin d'utiliser une application externe, comme tiret. Depuis % désigne le fichier courant en mode ex, vous pouvez l'utiliser comme ceci:

:!indent %
24
répondu soulmerge 2010-03-01 13:04:50

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 repli sur la fonctionnalité d'indentation de vim.

13
répondu Chiel ten Brinke 2018-08-06 11:59:43

, je trouve que clang-format fonctionne bien.

Il y a quelques exemples de raccourcis clavier dans la 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 de retrait =.

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

autocmd FileType c,cpp setlocal equalprg=clang-format
7
répondu Daniel 2016-10-27 02:34:18

J'aime {[0] } comme mentionné ci-dessus, mais le plus souvent je veux formater seulement une petite section du fichier sur lequel je travaille. Puisque indent peut prendre du code à partir de stdin, c'est vraiment simple:

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

astyle prend stdin aussi, de sorte que vous pouvez utiliser la même astuce là-bas.

3
répondu dsummersl 2015-02-13 14:41:41

Peut-être que vous pouvez essayer les éléments suivants $tiret -kr -i8 *.c

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

2
répondu lattimore 2011-09-23 05:59:39

Je voulais ajouter, que pour l'empêcher d'être foiré en premier lieu, vous pouvez taper :set paste avant de le coller. Après avoir collé, vous pouvez taper :set nopaste pour des choses comme js-beautify et indenting pour fonctionner à nouveau.

1
répondu atripes 2017-02-02 09:01:47

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

0
répondu n0va_sa 2017-11-17 01:24:32