Rhaa les tabulations, voici un problème qui est vraiment prise de tête quand on code différents logicields en même temps. Selon les règles de codage les tabulations sont interdites et doivent être remplacées par 2, 4 ou 8 espaces, dans d’autres projets les espaces sont quasiment interdit et tous les espacements doivent être fait avec des tabulations, il faut du coup régler sont éditeur de texte pour afficher les tabulations avec 4 espaces ou 8 espaces, …
Le tout toujours codé dans le même langage (C) bien sûr, donc difficile de régler sont éditeur pour s’adapter en fonction du projet.
C’est particulièrement le cas dans le projet ARMadeus, puisque les applications ne doivent pas comporter de tabulation et tous les décalages doivent être fait avec 4 espaces. Alors que le code Kernel (Linux donc en C) condamne presque les espaces et ne doit comporter que des tabulations affichées avec 8 espaces dans l’éditeur de texte.
Heureusement avec vim il y a moyen de s’en sortir avec un petit truc sachant que tous fichier C se rapportant au Kernel dans le projet ARmadeus est toujours contenu dans un répertoire /linux. Le code source officiel linux est dans un répertoire du type :
buildroot/project_build_armv4t/apf9328/linux-2.6.29.6/drivers/*
Alors que le code des drivers kernel spécifique au projet ARMadeus sont dans un répertoire du type :
target/linux/modules/
On a de forte «chance» pour que le code se rapportant à une application ne soit pas contenu dans un répertoire commençant par /linux. Par exemple, la librairie as_devices se trouve dans le répertoire :
target/packages/as_devices/c/
Qui ne contient pas /linux. Il suffit donc de regarder si le mot /linux se trouve dans le PATH au moment de l’ouverture du fichier pour adapter les tabulations correctement. Ce qui peut être fait en ajoutant quelque lignes à son fichier .vimrc :
function ARMadeusCodingRules()
" tab with space
set tabstop=4
set softtabstop=4
set shiftwidth=4
set smarttab
set expandtab
endfunction
function Kernel()
:set tabstop=8
:set softtabstop=8
:set shiftwidth=8
:set nosmarttab
:set noexpandtab
endfunction
function SetKernelIndent()
let filepath = expand( « %:p » )
if match(filepath, »\/linux ») != -1
» if subdirectory contain /linux* then indent Kernel
:call Kernel()
else
» else ARMadeus coding rules
:call ARMadeusCodingRules()
endif
endfunction
Voila de quoi éviter bien des prises de tête au moment des commits de code avec le responsable du projet 😉
Plusieurs remarques.
1) Les ‘:’ sont facultatifs au début des lignes pour du code vim. 😉
2) Tu aurais intérêt blinder un peu la regexp pour déterminer le type de fichier et ensuite dans ton ftplugin C (ou éventuellement via une autocommand) appeler SetKernelIdent() ; comme ça tu n’aurais même pas à l’appeler à la main.
3) Utilise :setlocal au lieu de :set, pour ne modifier la config qu’au niveau du buffer (et donc éviter d’écraser celle d’un autre buffer, qui pourrait nécessiter une autre config).
Une autre solution pour de la config spécifique à un fichier c’est d’utiliser des modelines (:h modeline). En gros ça consiste à spécifier de la conf dans un commentaire placé en début ou fin de fichier.
L’avantage c’est que ça ne nécessite pas de conf spécifique (ça marchera chez les collègues). L’inconvénient ça « laisse une trace » dans le fichier (pas une bonne solution pour les fichiers du kernel).