Un problème classique quand on fait de la programmation est de pouvoir chercher et remplacer un mot. Par exemple quand on se rend compte que le nom d’une variable n’est pas suffisament significatif ou qu’il ne respecte pas les conventions de codage.
Pour faire un chercher remplacer dans le fichier courant sous vim, il suffit d’utiliser la commande suivante :
:%s/motàremplacer/nouveaumot/gc
Avec :
- % : sur tout le fichier courant
- s : la commande (diminutif de search)
- motàremplacer : On peut ici utiliser la puissance des expressions régulières pour améliorer la recherche.
- nouveaumot : ideme.
- g : diminutif de «global» signifie que la recherche ne s’arrêtera pas au premier mot trouvé.
- c : diminutif de «heu je ne sais pas ;-)» demande l’autorisation d’effectuer le remplacement à chaque occurrence.
Cette commande est particulièrement utile, on l’utilise tout le temps.
Vient ensuite le moment où l’on souhaite faire la même chose mais sur un ensemble de fichier, c’est la qu’intervient la commande magique … vim !
:vim /motàtrouver/ **/*
Avec :
- vim : la commande de recherche
- /motàtrouver/ : le mot que l’on cherche, qui peut bien sûr être agrémenté d’expression régulière
- **/* : wilcard signifiant que l’on souhaite rechercher récursivement dans tous les fichiers du répertoire courant ainsi que dans les sous répertoire
Cette commande vas rechercher le mot dans tout les fichiers du répertoire courant ainsi que dans les sous-répertoires. Vim va se positionner sur la première occurence trouvée. Pour naviguer dans les différentes occurences il suffit d’utiliser les commandes :cnext pour la prochaine occurence et :cprev pour la précédente occurence. Personnellement je trouve ça beaucoup trop long à taper, c’est pourquoi je les ais mappé sur les touches de fonction F9 et F10 en ajoutant deux petites ligne dans mon .vimrc
map <F9> :cp<CR>
map <F10> :cn<CR>
C’est bien beau de pouvoir trouver les mots mais ce que l’on cherche à faire c’est de les remplacer ! Pour cela il suffit de combiner la dernière commande avec le chercher remplacer du début, sauf que cette fois ci on veut remplacer seulement le mot sur lequel on est :
:s/motàremplacer/nouveaumot/c
Et puis on est un peu feignasse donc on ne veut pas retapper la fonction, on va donc la mapper sur une touche de fonction :
:map <F2> :s/motàremplacer/nouveaumot/c<CR>
De cette manière il suffira d’utiliser la touche <F10> pour aller à la prochaine occurrence et sur la touche <F2> pour faire le remplacement si on le désire.