L'utilisation de vim

Publié le 18 janvier 2012 par Nicolas Zermati | outils

Cet article est publié sous licence CC BY-NC-SA

Une part importante de l’activité des développeurs se résume à éditer de simples fichiers textuels. Ces fichiers permettent de communiquer des instructions aux machines chargées de les exécuter. Pour le confort et la productivité d’un développeur, l’interface qui lui permettra de saisir son code est primordiale.

Je compte deux approches différentes. Les Environnements de Développement Intégrés qui intègrent un maximum d’outils : la gestion des projets, l’édition des sources, la compilation, le débogage, le système de gestion de configuration (SCM), etc. Les EDIs que j’ai en tête : Eclipse, Netbeans ou IDEA pèsent plusieurs centaines de mégaoctets en mémoire, sont associé à une interface d’édition dont les principales fonctionnalités sont l’autocomplétion, le surlignage des erreurs et les snippets de codes. Et, les manipulateurs de textes comme TextMate, Sublime Text, EMACS ou, dans notre cas, Vim.

Je voudrai présenter les bases de la manipulation de texte. Vim est probablement l’éditeur qui embrasse le plus ce concept et je vais plutôt vous présenter les bases de celui-ci. Dans un prochain article, je présenterai quelques aspects plus avancés.

Avant de commencer, je vous recommande de vous procurer Vim, de l’installer et de le tester pendant votre lecture. Peu importe votre plateforme, Vim existe certainement pour cette dernière. Rendez-vous sur cette page de téléchargement pour l’installer.

Un éditeur modal

Vim est un éditeur destiné à une utilisation en ligne de commande, il fonctionne donc tout à fait normalement à distance (en SSH par exemple). Il n’y a pas de menus classiques dans l’interface de Vim. Vim est un éditeur modal. C’est-à-dire que chaque touche va avoir un comportement différent en fonction du mode dans lequel on se trouve. Cela décuple les interactions et la complexité apparente de l’éditeur puisque chaque touche va être utilisée de façon différente selon le mode dans lequel on se trouve.

Vous vous demandez peut-être « Quels sont donc ces différents modes et à quoi servent-ils ? », alors commençons la visite.

Édition : insertion et remplacement

C’est le mode le plus rapide à présenter. En effet, chaque caractère est inséré dans le fichier sous le curseur ce qui est probablement le plus familier des comportements. Pour ceux qui expérimentent pendant leur lecture vous remarquerez que ce n’est pas le mode par défaut de Vim. En effet lorsque vous lancez Vim, vous êtes en mode commande dont on reparlera juste après.

Passer dans le mode d’édition peut se faire d’un grand nombre de manières, j’en vois déjà plus d’une dizaine. Vous pouvez accompagner ce changement de mode par un déplacement prédéfini. Ce sont ces déplacements qui sont à l’origine de cette variété.

Voici un petit récapitulatif des commandes que j’utilise :

Commande Passage dans le mode insertion
a après le curseur
A en fin de ligne
i sous le curseur
I en début de ligne
o sur une nouvelle ligne au-dessous
O sur une nouvelle ligne au-dessus
R sous le curseur en mode remplacement

Vous remarquerez qu’il est facile d’associer ces commandes à des mots : ajouter, insérer, ouvrir une ligne, remplacer. Le fait d’utiliser une majuscule ou une minuscule modifie légèrement le comportement tout en conservant l’idée de la commande originale.

Une fois passé en mode insertion, on se retrouve un peu comme prisonnier dans un champ texte, sans menu, sans copier-coller, sans même un fichier à soi. Essayons de retrouver les autres fonctionnalités des éditeurs de textes classiques. Pour cela on repasse en mode commande en pressant ESC.

Commande

Lorsque Vim se lance, on est dans ce mode dit de commande, c’est celui qui se rapproche le plus de ce que les menus peuvent fournir aux autres éditeurs. Il permet d’ouvrir un fichier, d’enregistrer, d’enregistrer-sous, de copier, de coller, etc.

Vim permet d’utiliser les commandes de l’éditeur Ex, un éditeur de texte plus historique encore que Vim lui-même. Cependant l’utilisation d’x est transparente pour l’utilisateur. Je vais présenter les deux catégories de commandes succinctement grâce à quelques exemples.

Les commandes de Vim

Il n’y a pas de retour visuel m’indiquant la commande que je suis en train de taper. Pour afficher le texte de la commande en cours tapez en mode commande : :set showcmd. Après ça vous devriez voir la commande en cours d’écriture en bas à droite de la zone de texte. On peut classer les commandes en deux catégories, les opérateurs et les déplacements. Les opérateurs modifient le texte et les déplacements, comme leur nom l’indique, déplacent le curseur d’un endroit à l’autre du fichier.

Les opérateurs que j’utilise sont les suivants :

Opérateur Description
c Changer du texte
cc Changer la ligne entière
C Changer du texte jusqu'à la fin de la ligne
d Supprimer du texte
dd Supprimer la ligne entière
D Supprimer du texte jusqu'à la fin de la ligne
y Copier du texte
yy, Y Copier la ligne entière
p Coller du texte supprimé ou copié après le curseur
P Coller du texte supprimé ou copié sous le curseur
r Remplacer le caractère sous le curseur
x Supprimer le caractère sous le curseur
X Supprimer le caractère précédent le curseur
>, < Indenter, desindenter d'une tabulation
u Défaire la dernière action
CTRL + r Refaire la dernière action
. Rapplique la dernière commande exécutée

Les principaux déplacements que j’utilise sont les suivants :

Déplacement Description
w, b Début du mot suivant ou précédent
W, B Début du mot suivant ou précédent en ignorant la ponctuation
e, E Fin du mot courant en ignorant ou non la ponctuation
% Symbole ouvrant ou fermant correspondant (chevrons, parenthèses, accolades, if / end, balises XML, etc)
h, j, k, l Gauche, Bas, Haut, Droite
g0, g$ Début ou fin d'une ligne (g facultatif)
^, _ Premier caractère d'une ligne
ENTER, + Premier caractère de la ligne suivante
- Premier caractère de la ligne précédente
fx Premier caractère x après le curseur sur la même ligne
tx Premier caractère suivi d'un x après le curseur sur la même ligne
nG Début de la ligne n
G Fin du fichier
gg Début du fichier
nG Début de la ligne n dans le fichier

Pour éditer occasionnellement des fichiers de configuration, ces commandes ne sont pas toutes utiles. Mais, pour celui qui commence à utiliser Vim régulièrement, intégrer ces dernières à son workflow peut s’avérer un gain de temps important.

Voici quelques combinaisons possibles :

Commande Résultat
c3w Supprime les 3 prochains mots et passe en mode insertion
5dd Supprime les 5 lignes sous le curseur
3p Colle 3 fois le contenu du presse papier
df. Supprime le texte de la ligne jusqu'au prochain caractère « . »
5u Défait les 5 dernières actions
5 CTRL + r Refait les 5 dernières actions
y45G Copie de la ligne courante à la ligne 45
>% Indenter jusqu'au symbole fermant

Les commandes de Vim sont généralement de la forme [n] opérateur [m] déplacement. Il est important de pouvoir créer ses propres commandes à la volée. Cela évite par exemple les répétitions de raccourcis (CTRL + v, dix fois de suite) ou encore l’utilisation intensive de la souris pour se déplacer.

Les commandes de ex

Les commandes Ex, commencent par « : », une partie d’entre elles ont des équivalents Vim purs. Par exemple on peut fermer Vim et enregistrer le fichier courant par :x ou bien avec ZZ.

Voici donc les commandes « du style Ex » que j’utilise régulièrement :

Commande Action
:e Éditer un fichier
:w Enregistrer un fichier
:w FILENAME Enregistrer un fichier sous le chemin FILENAME
:q Quitte la fenêtre vim
:x, :wq Sauvegarde puis quitte vim
:n Se déplace au début de la ligne n
:bnext Affiche le prochain fichier ouvert (buffer)
:bprevious Affiche le précédent fichier ouvert
:bdelete Ferme le buffer courrant
:ls Affiche la liste des buffers
:wa Enregistre tous les fichiers ouverts

Visuel

En mode commande, la touche « v » permet de passer en mode visuel, où l’on va pouvoir réaliser des sélections, un peu comme à la souris. Les commandes « V » et « CTRL + v » permettent respectivement de passer en mode visuel par ligne ou par bloc. Testez-les pour en comprendre le fonctionnement ou bien consultez la documentation du mode visuel de vim.

Une fois dans ce mode les commandes de déplacement de Vim sont accessibles pour effectuer la sélection. Par exemple « v55G » passera du mode commande au mode visuel, débutera la sélection à l’endroit du curseur puis ira se placer sur le début de la ligne 55. On peut passer d’un bout à l’autre de la sélection avec « o » et donc déplacer n’importe quelle extrémité de celle-ci.

Se déplacer plus vite

Marques pages

On ne se rappelle pas forcément dans un fichier de log d’un millier de lignes quels sont les numéros de celles qui nous intéressent. Nombre d’éditeurs proposent de poser des marques sur les lignes qui ont de l’importance et auxquelles vous voulez revenir facilement. Vim propose cette fonctionnalité à travers les marques pages.

Poser des marques pages dans un fichier se fait avec « mx » où x est un identifiant. L’identifiant est une lettre minuscule. On peut se déplacer à la ligne de la marque avec « ‘x » ou bien directement au caractère marqué avec « `x ». Pour revenir à l’endroit où on était on peut utiliser « ‘’ » pour revenir à cette ligne ou « `` » pour revenir au caractère précis précédant le déplacement.

La portée de ces marques se limite au fichier ouvert. Pas possible donc de poser une de ces marques dans un fichier et d’y faire appel depuis un autre fichier. Cependant il existe un autre type de marques pages qui ont une portée globale et qui se distinguent simplement par le fait qu’ils utilisent un lettre majuscule ou bien un chiffre comme identifiant.

Gérer plusieurs fenêtres

Parfois il est plus simple, plutôt que de se déplacer, d’avoir deux parties d’un même fichier visible en même temps. Vim propose un système de fenêtres pour cela. Une fenêtre c’est une vue sur une partie d’un fichier. Deux fenêtres peuvent afficher un même fichier, et le faire à des positions différentes. Voici une capture d’écran illustrant un exemple de session où il y a deux fenêtres :

Bien sûr les fenêtres peuvent afficher des fichiers différents.

Voici un récapitulatif des commandes permettant de manipuler ces fenêtres :

Commande Résultat
:split, CTRL + w s Sépare horizontalement la fenêtre courante en deux
:vsplit, CTRL + w v Sépare verticalement la fenêtre courante en deux
:close, CTRL + w c Ferme la fenêtre si ce n'est pas la dernière
:resize n, zn, n CTRL + w _ Définit le nombre de lignes visible à n
:vertical resize n, n CTRL + | Définit le nombre de colonnes visible à n
:only, CTRL + w o Conserve uniquement la fenêtre active et ferme toutes les autres
CTRL + W DIR Se déplace dans la fenêtre suivante, dans la direction DIR (h, j, k, l, flêches)

Il est également possible d’utiliser la souris pour redimensionner les fenêtres de Vim (voir l’option mouse).

En complément des fenêtres, il existe des onglets. Ils permettent d’avoir différents ensembles de fenêtres ouvertes et de passer de l’un à l’autre. Je n’utilise pas vraiment les onglets et donc je vous recommande de regarder la documentation pour en savoir plus.

Recherche et substitution

Dans tout bon éditeur de texte, on dispose des fonctions rechercher et remplacer ; dans Vim aussi ces fonctions sont accessibles. On peut effectuer ces opérations sur une plage de ligne, sur une sélection, sur l’ensemble du fichier, etc. Je vais commencer par introduire les différentes commandes de recherches. Il faut savoir que ces commandes se combinent avec les autres comme un déplacement. On peut par exemple supprimer du texte jusqu’au prochain résultat de recherche avec d/pattern.

Commande Recherche
/pattern Recherche en avant le motif pattern
?pattern Recherche en arrière le motif pattern
n, N Saute au résultat suivant, précédent
*, # Recherche le mot sous le curseur en avant, en arrière
g*, g# Recherche le mot sous le curseur autorisant son inclusion dans d'autres mots
:nohlsearch Desactive le surlignage des résultats d'un recherche jusqu'à la prochaine

Ces commandes permettent de faire de la recherche et des déplacements dans Vim. Il est possible de (des)activer la recherche incrémentale, la coloration des résultats, etc. Les patterns employés utilisent les expressions régulières avec une syntaxe spécifique à Vim.

Le remplacement dans Vim se fait grâce à la commande Ex substitute : « s ». Cette dernière fait partie de Ex et adopte la syntaxe suivante : :[adresse] commande. Les adresses sont généralement de la forme x,yx est la ligne de début et y la ligne de fin. Il existe en plus des symboles spéciaux dans la description des adresses, essayons d’en faire le tour avec ces quelques exemples :

Adresse Plage de sélection
1,$ L'ensemble du fichier
% L'ensemble du fichier également
. La ligne courante
+n n lignes après la ligne courante
-n n lignes avant la ligne courante
/pattern/ La première ligne en avant qui contient pattern
?pattern? La première ligne en arrière qui contient pattern

Voici de nouveaux exemples pour comprendre l’usage des adresses et de la substitution :

Commande Substitution
:s/old/new/ Substitue sur la ligne courante la première occurence de « old » par « new »
:s/old/new/g Idem avec toutes les occurences de la ligne (option g)
:s/old/new/gc Idem en demandant une confirmation pour chaque remplacement (option c)
:.,+15s/old/new/gc Idem pour les 16 lignes sous le curseur
:.,/search/s/old/new/gc Idem pour les lignes du curseur jusqu'à search (en avant)
:%s/old/new/gc Idem pour toutes les lignes du fichier

Dans ces exemples simples on retrouve la syntaxe des adresses Ex que l’on a vu plus tôt. Ces dernières permettent de spécifier une plage précise de remplacement.

Commande Substitution
:%s/\\(.*\\) */\\1/ Supprime tout les espaces en fin de ligne
:%s/[[=e=]]/e/g Remplace tout les éléments de la classe d'équivalence e (é, è, ê, etc) par des « e »
:%s/todo/\U&/gi Remplace les occurences de « todo » quelque soit leur casse en « TODO » majuscules

À travers ces trois autres exemples on voit que Vim permet de délimiter des groupes dans ces recherches avec \( et \) et de les réutiliser dans les remplacements avec \1, \2, etc. Il est aussi possible d’utiliser les expressions à crochet de POSIX pour définir des intervalles ([:alnum:], [:digit:], etc.). Et, on voit qu’il existe des caractères spéciaux à utiliser dans les remplacements (\U, &, etc).

La commande de substitution regorge d’autres astuces. Par exemple lorsque le motif recherché est vide (:s//new/) alors c’est la dernière recherche qui est utilisée. Les caractères de séparations sont libres : :s#old#new#gc est tout à fait valable.

Conclusion

Avec ce que l’on a survolé, vous pouvez peut-être déjà vous rendre compte de ce que la manipulation de texte apporte par rapport à la simple édition de texte. Si vous n’êtes pas encore convaincu, je vous invite tout de même à lire le prochain article qui, au travers de plus d’exemples, saura mieux vous convaincre du gain apporté par la maitrise d’un tel outil.

Jusque-là j’ai présenté de quoi s’en sortir avec Vim pour de l’édition occasionnelle, je n’ai pas parlé des macros, des replis, des interactions avec la console, de la configuration ou encore des plugins. Tout ceci sera dans le prochain article qui sera destiné à ceux d’entre vous qui souhaitent utiliser Vim au quotidien.

L’équipe Synbioz.

Libres d’être ensemble.