Vim, l'éditeur de fichiers âgé de 25 ans cette année, peut être utilisé comme un véritable IDE [1] spécialisé. Je vous propose de découvrir cet éditeur dans sa dernière version.
J'utilise Vim de manière très basique depuis une bonne quinzaine d'années essentiellement pour éditer des fichiers de configuration ou de petits scripts shells. Depuis quelques semaines, j'ai découvert la véritable nature de Vim et son microcosme d'options de configuration et de plugins. Je l'utilise maintenant également pour écrire mes programmes en Python ou en C en profitant de fonctionnalités généralement intégrées dans des IDE spécialisés tels Bluefish, Geany ou KDevelop par exemple (pour ne pas parler d'Emacs ;-)). Dans cet article je vous propose de compiler sa dernière version, de l'installer et d'utiliser ses fonctionnalités de base.
1. Compilation et installation
Vim est certainement l'éditeur de fichiers textes qui se trouve en standard dans le plus grand nombre de distributions actuelles, cependant, à la date de rédaction de cet article, aucune d'entre elles ne fournit encore la version 8 qui est sortie le 12 septembre dernier.
Pour compiler Vim, il faut installer les dépendances et les outils qui nous serviront pour cela.
Sous Debian Jessie et dérivés :
# apt-get install build-essential git libncurses5-dev python-dev libperl-dev
# apt-get install tcl-dev ruby ruby-dev lua5.2 liblua5.2-dev
Sous Centos 7 et dérivés :
# yum groupinstall "Development Tools"
# yum install ncurses-devel lua-devel perl-devel perl-ExtUtils-Embed.noarch
# yum install ruby ruby-devel tcl-devel tcl python-devel
Pour récupérer le code source de Vim, on peut utiliser le dépôt sur GitHub [2] (git - mon choix pour cet article) ou le dépôt sur Bitbucket [3] (mercurial).
$ git clone https://github.com/vim/vim.git
$ cd vim
$ git checkout $(git tag | tail -n1)
$ ./configure --enable-pythoninterp=yes --enable-perlinterp=yes --enable-luainterp=yes --enable-rubyinterp=yes --enable-tclinterp=yes
À ce stade, il faut vérifier dans la sortie de la commande configure si le dossier de configuration de Python a été reconnu en regardant les tests liés à Python (ils sont localisés vers le début). Si les deux lignes suivantes sont présentes c'est que le script n'a pas réussi à le détecter tout seul :
checking Python's configuration directory...
can't find it!
Dans ce cas il faut lui indiquer explicitement le chemin en ajoutant une option au script configure comme suit.
Pour Debian : --with-python-config-dir=/usr/lib/python2.7/config-x86_64-linux-gnu.
Pour Centos : --with-python-config-dir=/usr/lib64/python2.7/config.
Pour déterminer le dossier du script de configuration de Python de votre système, vous pouvez utiliser la commande : python2.7-config --configdir.
Normalement les autres interpréteurs ont été pris en compte sans difficulté. Vim est compilé avec le maximum d'interpréteurs car il doit être capable de s'interfacer avec n'importe quel plugin que nous souhaiterions installer.
Par défaut cette installation se fera dans le dossier /usr/local/. Vous pouvez choisir un autre dossier en utilisant l'option --prefix=mon_dossier où mon_dossier est un chemin absolu vers le dossier d'installation (par exemple /home/user/local) où user serait votre login. N'oubliez pas alors d'ajouter /home/user/local/bin dans la variable PATH (par exemple pour bash : export PATH="/home/user/local/bin:${PATH}").
Si vous deviez exécuter plusieurs fois le script configure, vous pouvez utiliser la commande make distclean pour en nettoyer le cache et ainsi permettre la réexécution de tous les scripts du configure.
Il reste maintenant à compiler et installer le logiciel avec les deux commandes suivantes :
$ make
$ sudo make install
Si vous avez un ordinateur comportant plus d'un seul cœur vous pouvez utiliser l'option -j x où x représente le nombre de cœurs qui seront utilisés pour compiler les sources.
Maintenant que Vim est compilé et installé, vous pouvez vérifier les options qui ont été incluses en lui demandant sa version :
$ vim --version
VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Sep 15 2016 21:51:52)
Rustines incluses : 1-5
Compilé par dup@d630
Énorme version sans interface graphique.
Fonctionnalités incluses (+) ou non (-) :
+acl +file_in_path +mouse_sgr +tag_old_static
+arabic +find_in_path -mouse_sysmouse -tag_any_white
+autocmd +float +mouse_urxvt +tcl
-balloon_eval +folding +mouse_xterm +termguicolors
-browse -footer +multi_byte +terminfo
++builtin_terms +fork() +multi_lang +termresponse
...
+eval +mouse_dec +statusline -xterm_clipboard
+ex_extra -mouse_gpm -sun_workshop -xterm_save
+extra_search -mouse_jsbterm +syntax
+farsi +mouse_netterm +tag_binary
fichier vimrc système : "$VIM/vimrc"
fichier vimrc utilisateur : "$HOME/.vimrc"
2me fichier vimrc utilisateur : "~/.vim/vimrc"
fichier exrc utilisateur : "$HOME/.exrc"
fichier de valeurs par défaut : "$VIMRUNTIME/defaults.vim"
$VIM par défaut : "/home/dup/local/share/vim"
Compilation : gcc -c -I. -Iproto -DHAVE_CONFIG_H -g -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
Édition de liens : gcc -L. -Wl,-z,relro -L/build/ruby2.1-bDDI0O/ruby2.1-2.1.5/debian/lib
...
Maintenant que nous l'avons installé, lançons Vim, sans argument, depuis un terminal afin d'obtenir un écran similaire à celui de la figure 1.
Fig. 1 : Exemple d'écran de démarrage de Vim. Sans mention d'un fichier sur la ligne de commande, Vim affiche sa version et quelques informations qui peuvent s'avérer utiles.
Pour quitter Vim tapez au clavier :q!. Il s'agit d'une commande (q - abréviation de « quit ») du mode « commande line » assortie d'un modificateur (!) qui indique à Vim de quitter même si le fichier modifié en cours d'édition n'est pas sauvegardé. Pour obtenir de l'aide tapez la commande :help. Dans le texte d'aide certains mots sont soit entourés de | soit d'une couleur spécifique (sur Debian et Centos il semble que par défaut cette couleur soit turquoise). Il s'agit de « liens » vers d'autres parties de la documentation. Pour suivre ces liens placez-vous sur l'un d'entre eux et tapez <Ctrl> + <]>. Pour revenir à votre position précédente vous pouvez utiliser <Ctrl> + <T> ou <Ctrl> + <O>. L'aide de Vim est très fournie et très détaillée, n'hésitez pas à la consulter.
Pour continuer la lecture de cet article, je vous conseille de copier un fichier texte et de l'ouvrir avec Vim afin d'essayer les commandes (vim monfichier.txt) au fur et à mesure.
Pour faire simple, dans Vim il existe 4 modes : le mode normal, le mode d'insertion, le mode visuel et le mode command-line. Les trois premiers modes sont utilisés pour éditer le texte tandis que le dernier est utilisé pour donner des ordres à Vim.
Les modes modifient le comportement des touches du clavier. Ainsi le mode d'édition permet l'écriture de tout caractère. Par exemple, on pourra écrire « :q ! » dans un fichier sans pour autant quitter vim !
Pour sortir des modes visuels, du mode d'édition et du mode « command line » il faut appuyer sur la touche <Esc> ou <Echap> de votre clavier. En sortant de ces modes, on revient systématiquement dans le mode normal que l'on peut voir comme un mode pivot.
Le mode normal permet de naviguer dans le fichier, de couper, copier, coller du texte, de passer en mode d'édition ou en mode visuel. Le mode visuel autorise la sélection fine d'éléments du texte de manière visuelle et permet également de couper, copier et coller les sélections.
2.1 Déplacements dans le mode normal
Le mode normal permet en premier lieu la navigation dans le fichier édité : les différentes flèches du clavier sont utilisables pour cela mais également les touches <h>, <j>, <k> et <l> qui permettent respectivement de déplacer le curseur à gauche, en bas, en haut et à droite (voir [4] pour une explication sur le choix de ces touches). Les fichiers textes que vous éditez ne sont pas qu'une suite de caractères pour Vim. En effet, il est possible d'utiliser les touches <w> et <e> pour, respectivement, se déplacer au début du prochain mot ou à la fin de celui-ci (<b> permet de reculer d'un mot).
<W> et <B> en majuscules déplacent le curseur jusqu'au prochain ou précédent espace. C'est utile pour les mots pouvant contenir des apostrophes par exemple.
Pour aller au début de la ligne on utilisera la touche <^> et pour aller à la fin de la ligne plutôt <$> ainsi les amateurs d'expressions rationnelles ne seront pas perdus ! Les touches/caractères <{> et <}> permettent de se déplacer au début et à la fin d'un paragraphe. Les touches <H>, <M> et <L> permettent respectivement de positionner le curseur en haut de la fenêtre, au milieu de la fenêtre et en bas de la fenêtre. Pour avancer de n lignes tapez le nombre n au clavier puis la touche « Entrée ». <Ctrl> + <E> et <Ctrl> + <Y> permettent respectivement de descendre et monter la fenêtre comme on le ferait dans un éditeur graphique avec la souris et la barre de défilement. Enfin, pour vous déplacer à la dernière ligne de votre fichier tapez <G> et pour revenir au début du fichier tapez gg (<g> deux fois – notons que l'on peut revenir à sa position d'origine en tapant <Ctrl> + <O>).
On peut adjoindre un nombre avant d'indiquer un déplacement ou une commande. Par exemple si l'on tape 12w, le curseur avance de 12 mots, 3}, le curseur se place au début du troisième paragraphe suivant. Si l'on tape 7dd, on coupe la ligne sur laquelle se trouve le curseur et les 6 lignes suivantes.
2.2 Commandes du mode normal
Tout d'abord voyons quelques commandes que l'on peut utiliser directement dans ce mode : dd permet de couper une ligne et la place dans le tampon par défaut (D en majuscule permet de supprimer depuis le curseur jusqu'à la fin de la ligne). yy permet de copier une ligne et la place également dans le tampon par défaut. x permet de supprimer un caractère de la ligne (x ne supprimera pas au-delà d'une ligne même en lui indiquant un plus grand nombre de caractères).
Pour insérer le tampon par défaut sur la ligne se trouvant en dessous de celle du curseur utilisez p (pour « paste »). P en majuscule permet d'insérer la ligne au-dessus de celle où se trouve le curseur.
La force de Vim est d'avoir des commandes combinables qui s'exécuteront avec une sorte de condition. Sans entrer dans les détails on peut déjà faire beaucoup avec quatre commandes (que l'on a pratiquement déjà vues) : d pour détruire le texte (l'effacer, le couper), c pour changer le texte (cette commande change le mode et passe en mode d'édition) et y pour « yank » qui permet de copier du texte et enfin v pour sélectionner en mode visuel (cette dernière commande change également le mode et passe en mode visuel). À l'exception de la commande v qui passera simplement en mode visuel, on ne peut utiliser ces commandes sans leur adjoindre des caractères qui définiront une « étendue ».
Les « étendues » sont au minimum la combinaison de deux caractères. Le premier définit la condition ou la façon d'appliquer la commande et le deuxième caractère indique sur quoi s'applique la commande. Pour le premier caractère il existe trois conditions/façons : a pour « all » (tout), i pour « in » (à l'intérieur), t pour « 'til » ou « until » (jusqu'à). Le deuxième caractère est soit l'un des caractères de déplacement vu précédemment soit un caractère de la ligne de texte sur laquelle est le curseur. Toutes les combinaisons ne sont pas forcément admises mais il est possible d'écrire par exemple : diw qui supprime le mot entier (si on avait écrit dw seule la fin du mot aurait été supprimée), ca) coupe tout ce qui est entre les parenthèses, y compris les parenthèses et passe en mode d'édition, yi] copie tout ce qui se trouve entre les crochets, sans les crochets, vt' (sélectionne tout jusqu'au prochain caractère ' sur la ligne et passe en mode visuel.
Pour passer en mode d'édition, un certain nombre de commandes peuvent être utilisées. Les commandes les plus usitées sont i et I (i en majuscule) qui permettent d'insérer du texte respectivement avant la position du curseur et au début de la ligne et les commandes a et A qui permettent respectivement d'ajouter du texte après la position du curseur ou à la fin de la ligne. Une fois en mode d'édition, il est possible de taper n'importe quel caractère (n'oubliez pas la touche <Esc> qui permet de retourner en mode normal).
Pour répéter la dernière commande, il est parfois possible d'utiliser la commande . (point).
v, V, <Ctrl> + <V> sont les commandes qui permettent de passer en mode visuel. v en minuscule permet de sélectionner le texte au caractère prêt. V en majuscule permet de sélectionner visuellement des lignes entières et enfin <Ctrl> + <V> permet de sélectionner un bloc de texte.
2.3 Le mode visuel
Dans ce mode, une fois la sélection effectuée, il est possible d'utiliser directement les commandes d, D, c et y vues précédemment. Le mode de sélection par bloc (<Ctrl> + <V>) permet, avec l'utilisation de la commande I (i en majuscule) de modifier n'importe laquelle des colonnes sélectionnées. Par exemple, sur un script bash, commenter les 3 paragraphes suivants le curseur en tapant <Ctrl> + <V> 3}I # et <Esc>. Le travail par colonnes avec <Ctrl> + <V> et le mode de sélection par lignes avec V (pour copier des fonctions ou des portions de code) sont pour le moment les deux seules utilisations que j'ai du mode visuel.
2.4 Le mode « command line »
Pour utiliser des commandes dans ce mode il faut en premier lieu taper le caractère : qui permet l'entrée dans le mode. Dans ce mode il est possible de sauvegarder (:w – enregistre en écrasant le fichier), de quitter (:q – quitte sauf s'il persiste des modifications ; dans ce cas, pour quitter en perdant les modifications on peut ajouter le point d'exclamation ainsi :q!), d'ajouter un fichier à la ligne suivante (:r nomdufichier), d'éditer un autre fichier (:e nomdufichier). Comme dans le mode normal, il est possible parfois de combiner les commandes et l'on pourra écrire :wq pour enregistrer et quitter Vim. Toutefois les puristes utiliseront :x qui permet d'enregistrer les modifications, seulement s'il y en a, de chacun des fichiers éventuellement ouverts et qui a le bon goût d'être plus court à taper !
Après avoir tapé le : vous pouvez utiliser les flèches de votre clavier pour naviguer dans l'historique des commandes déjà utilisées. Vous pouvez également taper :hist (un raccourci pour :history) pour obtenir l'historique des commandes tapées dans le mode command line.
2.5 Défaire et refaire
Vim possède quelques commandes intéressantes permettant de défaire ou refaire ce que vous venez de modifier. Tout d'abord tant que l'on reste en mode d'édition on effectue un et un seul changement (même si l'on édite totalement l'ensemble du texte). En effet l'ensemble d'un changement est clôt dès que l'on quitte le mode d'édition. Chaque commande dans le mode normal introduit un changement. Chacun des changements est réversible, en mode normal grâce à la commande u (pour undo), en mode command-line grâce à la commande :earlier. La commande <Ctrl> + <r> en mode normal et :later en mode command-line permettent de refaire ce qui vient d'être défait. L'intérêt des commandes :earlier et :later est qu'il est possible de leur indiquer soit un nombre de modifications à faire ou défaire, soit un laps de temps. Par exemple, pour retrouver l'état de votre fichier 1 heure auparavant il est possible d'écrire :earlier 1h.
Conclusion
Vous avez maintenant un Vim tout neuf sur votre système. Vim est activement développé aussi, entre l'écriture de ces quelques lignes et leur date de parution, un grand nombre de correctifs et ajouts auront été écrits.
Cet article, un peu rébarbatif, est un bon début pour commencer à pratiquer. À mon avis il est illusoire de penser que l'on peut apprendre (et retenir) un si grand nombre de modes et de commandes en quelques jours. Seuls la pratique régulière et l'apprentissage au fil de l'eau sur plusieurs semaines permettent d'ancrer dans vos doigts les commandes qui vous sont utiles. Pour vous aider, vous pouvez utiliser une fiche (Cheat Sheet) [5] qui vous servira de référence.
Parfois, avoir une personne à qui parler pour commencer à utiliser Vim peu aussi aider. Pour cela vous pouvez vous rapprocher de votre GUL (Groupe d'Utilisateurs de Linux) local [6]. Il organise probablement des sessions tuppervim [7] comme par exemple l'ALDIL [8] à Lyon.
Nous pourrons éventuellement voir dans de prochains articles le système de tampons, le système de macro particulièrement simple à utiliser, comment lui adjoindre des plugins et probablement bien d'autres choses encore !
Références
[1] Définition d'un environnement de développement intégré : https://fr.wikipedia.org/wiki/Environnement_de_développement.
[2] Le dépôt git de Vim : https://github.com/vim/vim.git.
[3] Le dépôt mercurial de Vim : https://bitbucket.org/vim-mirror/vim.
[4] Pourquoi <h>, <j>, <k>, <l> pour se déplacer : http://xahlee.info/kbd/keyboard_hardware_and_key_choices.html.
[5] Une fiche de référence : https://www.fprintf.net/vimCheatSheet.html.
[6] Liste des GUL : https://aful.org/gul/liste.
[7] Événement tuppervim à Paris : http://tuppervim.org/.
[8] LE GUL Lyonnais : http://aldil.org/.