Formater du code C avec indent et Vim
15 Nov 2012Pour suivre des règles de codage et s’y tenir, rien de tel qu’un outil qui formate automatiquement le code (c’est plus rapide et sans erreurs). Sous Eclipse par exemple, la combinaison de touches Ctrl+Shift+F est indispensable. Mon but est d’obtenir la même fonctionnalité sous Vim pour le langage C.
Indent
L’outil indent permet de formater un source C selon des règles
définies par des paramètres en ligne de commande. Ces options sont très
nombreuses. Heureusement, il y a quelques styles bien connus
prédéfinis, comme le style K&R (option -kr).
Pour illustrer son fonctionnement, voici un code source écrit n’importe comment (et qui fait n’importe quoi) :
#include <stdio.h>
void f ( int* x )
{
*x=4;}
void g(int x)
{goto mylabel;
/* my comment */
if(x>10)x=10;
mylabel:
printf ("%d\n",x *2);
switch(x){case 1:x=4;break;case 2:x=1;}
while ( * ( &x ) <10)x++; /* what? */
}
void h(char ( * ( * x ( ) ) [ ] ) ( ) ) {
char ( * ( * y ) [ ] ) ( ) = \
x ( ) ; char ( * z ) ( ) = * \
( * y ) ; char c = z ( ); putchar \
(c);
}
int main(){
int i= 2; f(&i);
g(i);
return 0;
}Pour formater :
indent -st -kr -ts4 file.c
-staffiche le résultat sur la sortie standard au lieu de modifier le fichier ;-krutilise le style K&R ;-ts4considère 4 espaces comme une tabulation.
Voici le résultat :
#include <stdio.h>
void f(int *x)
{
*x = 4;
}
void g(int x)
{
goto mylabel;
/* my comment */
if (x > 10)
x = 10;
mylabel:
printf("%d\n", x * 2);
switch (x) {
case 1:
x = 4;
break;
case 2:
x = 1;
}
while (*(&x) < 10)
x++; /* what? */
}
void h(char (*(*x())[])())
{
char (*(*y)[]) () = x();
char (*z) () = *(*y);
char c = z();
putchar(c);
}
int main()
{
int i = 2;
f(&i);
g(i);
return 0;
}C’est plus joli, non ?
vim
Pour pouvoir reformater directement dans Vim, il suffit d’ajouter dans
~/.vimrc la ligne suivante :
autocmd BufNewFile,BufRead *.c set formatprg=indent\ -kr\ -ts4Ensuite, la commande gq formate (u annule).
Par exemple, sur le fichier source mal formaté ci-dessus :
- placer le curseur sur la ligne 7 ;
- appuyer sur
V; - descendre avec
j(ou la flèche du bas) jusqu’à la ligne 15 ; - taper
gq.
Ainsi, seule la fonction g est formatée.
À partir de la ligne 7, le même résultat est obtenu en tapant directement gq8j
(descendre de 8 lignes) ou gq15G (jusqu’à la ligne 15).
Pour reformater un bloc, le plus simple est de se placer sur une accolade { ou
} et de taper gq% (% navigue entre les {}, () et [] ouvrant et
fermant).
Pour reformater tout le fichier, il faut taper gggqG :
ggamène le curseur au début du fichier ;gqformate jusqu’à… ;Gva à la fin du fichier.
:wq
GOTO ?! Bouhh c’est maaal !
Sinon, merci pour l’astuce!