Vim avancé

Je sais, je ne devrais pas, mais ça me démange de commencer par ceci : comment, en mode normal, permuter le caractère actuel avec le suivant ? En tapant xp . Ça ne s'invente pas.

Mais qu'auriez-vous pensé de moi si j'avais expliqué comment remonter de deux lignes sans utiliser ni les flèches de déplacement, ni les chiffres ?

Ceci posé, voici les quelques petits trucs qui rendent bien service dans Vim et dont le moins que l'on puisse dire est qu'on ne les voit pas au détour de chaque doc pas plus qu'on ne les trouve facilement dans l'aide intégrée à Vim.

Gestion des fichiers/dossiers

Explorateur

:E permet d'ouvrir un semblant d'explorateur de fichiers. En mode texte certes, mais qui permet de naviguer à vue et qui offre une alternative satisfaisante au complètement des noms de fichiers. Une fois le curseur sur l'élément souhaité, fichier ou dossier, on l'ouvre par la touche Entrée. Pour aller plus vite encore, taper directement :E chemin/vers/dossier/voulu . Le complètement des chemins à l'aide de la touche TAB est possible, un peu comme en console.

Une fois dans l'explorateur, on peut utiliser toutes les commandes de déplacement habituelles de Vim pour atteindre l'élément voulu, en particulier les fonctions de recherche (commandes / ou ? pour chercher en avant ou en arrière ; n ou N pour poursuivre la recherche dans le même sens ou en sens contraire).

Par :help :E , il n'est pas impossible que vous trouviez des variantes de :E plus intéressantes pour vous ou même des astuces pour sélectionner plus effficacement les fichiers à ouvrir.

Retrouver un fichier contenant...

Dans la majorité des Unix, on dispose de la commande grep :

$ grep mot_clé *.tex

cherchera la chaîne de caractères mot_clé dans tous les fichiers .tex du dossier actuel.

On peut en faire autant sans quitter Vim : il suffit pour cela de taper :grep mot_clé *.tex pour faire sa recherche.

Changer de dossier de travail

:cd chemin/vers/dossier (cd : change directory ; le complétement des noms de dossiers est possible comme en console, avec la touche TAB).

:cd %:h permettra d'aller, si ce n'est pas encore le cas, au dossier du fichier en cours d'édition. Utile quand on lance gVim à partir d'un navigateur de fichiers qui ne lui communique pas le chemin absolu du fichier.

Vérifier le dossier de travail

:pwd (print working directory).

Ouvrir le fichier dont le nom apparait sous le curseur !

gf (en mode normal, évidemment).

Ctrl W suivi de f permet d'en faire autant mais en scindant le fenêtre actuelle.

Recherche

Utilisation de base

/ et ? suivis du mot à chercher permettent de chercher en avant et en arrière respectivement. n permet alors de continuer la recherche dans le même sens et N dans le sens contraire.

* permet de chercher en avant le mot sous le curseur et # en arrière.

Complètement

Vous aviez cherché le mot «protostichophobie» mais depuis vous avez effectué dix autres recherches ? Et bien sûr, vos aimeriez éviter de retaper ce long mot ? Pas de problème : commencez une recherche sur le début du mot : /proto puis utilisez la touche Flèche haut. Vous verrez défiler sous vos yeux émerveillés toutes les recherches précédentes commençant ainsi.

Naturellement, si vous tapez simplement le commande de recherche / puis tout de suite la touche Flèche haut, vous revoyez simplement toutes les recherches précédentes. Évidemment encore, Flèche bas pour revenir vers les plus récentes.

Substitution ou effacement de texte

En mode commande, :s/avant/après/ permet de remplacer la première apparition de «avant» par «après» sur la ligne actuelle ; :s/avant/après/g permet de remplacer chaque apparition sur la ligne en question.

:37,74s/avant/après/ et :37,74s/avant/après/g réalisent les mêmes actions de la ligne 37 à 74. Indiquez :%s/avant/après/g pour traiter l'intégralité du fichier.

Commenter

Dans un fichier LaTeX, où, rappelons-le, un bloc de code se commente par le symbole % placé au début de chaque ligne, on peut commenter tout un bloc de texte préalablement sélectionné à la souris ou en mode visuel par :s/^/%/ , le symbole ^ signifiant «début de ligne». Et de même, on peut décommenter par :s/%// .

Pour les languages ou la mise en commentaire se fait par une balise double (une ouvrante, une fermante), c'est évidemment plus simple...

Rajouter un texte en fin de ligne

Toujours en LaTeX, où un saut de ligne est obtenu par \\ , il est possible d'en rajouter pour les lignes 19 à 54 en tapant :19,54s/$/\\\\/ , $ signifiant «fin de ligne». Au sujet des antislashes, deux seulement seront effectivement rajoutés : dans cette syntaxe, l'antislash sert à empécher l'interprétation des caractères spéciaux... dont l'antislash fait lui-même partie.

Suppression des lignes vides

Pour supprimer les lignes vides du fichier complet ou entre les lignes 19 et 54 : :%/^$/d ou :19,54/^$/d.

Suppression/remplacement du mot actuel

diw ou ciw avec le curseur sur le mot à supprimer. À partir du mode normal, évidemment ! Sinon vous écrivez «diw» ou «ciw». Futé, non ?

Pour plus de détails : :help text-objects.

Effacement/remplacement jusqu'au caractère voulu

Pour effacer depuis le curseur jusqu'au prochain caractère " (non-inclus), tapez dt" ; pour effacer aussi ce caractère : df". Valable a priori pour tout caractère ou lettre.

Formatage

Dans les fichiers en texte brut, il arrive que l'ajout de texte au milieu d'une ligne par exemple, perturbe quelque peu les options de formatage choisies auparavant et Dieu^WLinus sait si elles sont nombreuses. Donc, pour retrouver le formatage prévu, sélectionner le texte voulu puis taper gq . Naturellement, gq suivi d'une commande de déplacement quelconque formatera le texte parcouru.

Autre chose, pour joindre une ligne et la suivante (former une seule ligne avec elles, autrement dit, ou encore supprimer le prochain saut de ligne), utiliser J (majuscule, attention !). Fonctionne aussi en multiple (11J joindra 11 fois) et en sélection.

Registres : copier-coller enrichi, accès aux presse-papier

Des connaissances basiques de Vim vous permettent de copier le mot suivant par yw , le précédent par yb , la ligne actuelle par yy , la ligne actuelle plus les 36 suivantes par 37yy . Un simple y vous permet de copier une sélection effectuée à la souris ou en mode visuel (v à partir du mode normal). Et 2dd de couper la ligne actuelle et la suivante.

On peut multiplier indéfiniment les exemples, mais quoi que vous ayez copié ou coupé (chaque coupe fait aussi une copie), un certain nombre de registres contiennent les copies effectuées récemment. Pour lister les registres actuels, tapez :reg.

Il existe différents types de registres :

Consultez l'aide pour tous les détails :h registers.

Définir un registre

Il faut d'abord appeler le registre par sa lettre, par exemple "k pour le registre k. On taperait alors :

Ne pas oublier : si un registre est défini par une lettre minuscule, son contenu est remplacé ; si la lettre est majuscule, son contenu éventuel est complété !

Coller un registre

Pour coller le registre k après le curseur, "kp . Autres commandes de collage utilisables, évidemment...

Macros-commandes

Une suite de commandes, si elle est assez généraliste pour être appliquée avec les effets souhaités en plusieurs endroits du texte, peut être enregistrée dans un des registres de a à z ou de A à Z. Au passage, c'est pour cela que Vim appelle cela des registres : on y trouver aussi bien des éléments copiés/collés ou des macros.

Pour enregistrer sa macro dans le registre k :

Pour exécuter la macro du registre k : @k ; pour l'exécuter 111 fois : 111@k , comme d'habitude dans Vim.

Incrémenter un nombre

Ctrl A : permet d'incrémenter le nombre sous le curseur. Ctrl X : permet de décrémenter le nombre sous le curseur.

148 suivi de l'un des deux raccourcis permet d'additionner ou de soustraire 148 directement. Ceci marche aussi avec des négatifs, des écritures hexadécimales, etc...

Aide philosophique

Tapez simplement :help 42. Accessoirement, ceci nous rappelle que l'aide est accessible par :help ou :help mot_clé.