PROJET AUTOBLOG


Planet-Libre

source: Planet-Libre

⇐ retour index

®om : Formater du code C avec indent et Vim

jeudi 15 novembre 2012 à 13:23

Pour 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) :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include 
 
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

Voici le résultat :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include 
 
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\\ -ts4

Ensuite, la commande gq formate (u annule).

Par exemple, sur le fichier source malformaté ci-dessus :

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 :

:wq

Gravatar de ®om
Original post of ®om.Votez pour ce billet sur Planet Libre.