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.
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.
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.
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.
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 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 |
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.
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.
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.
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,y où x 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.
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.
Nos conseils et ressources pour vos développements produit.