Cours sur VIM

Introduction

Bon, pourquoi Vim ? Tout simplement, pour les possibilités d'utilisation qu'il offre. De ce point de vue, c'est le meilleur, ou l'un des deux meilleurs, si vous voulez.

Si vous commencez à utiliser vim, vous finirez par vous apercervoir que vous pouvez devenir plus efficaces, et vous aurez trouvé un éditeur pour la vie, qui ne vous quittera plus.

Pour vous donner un exemple, ce matin, j'ai pris en note mon cours de droit directement avec Vim + Latex sans aucun problème, ce que je n'aurais jamais pu faire avec aucun autre éditeur, sauf peut-être emacs ;-)

Quelques remarques avant de commencer :

À l'issue de ce cours vous devriez avoir compris comment fonctionne Vim, et réaliser les fonctiones de base : ouvrir un fichier, le sauvegarder, se déplacer, copier/coller, rechercher/remplacer.

Nous verrons aussi quelques outils qui font la puissance de vim : le mode commande et l'interaction avec le shell, plus deux trois astuces.

Allez, c'est parti !

Commencez par récupérez les fichiers situés ici

Créez-vous un dossier pour mettre main.py, pouet.py et vrac, par exemple ~/cours Ils serviront d'exemples.

Prenez aussi le fichier vimrc, et recopiez le contenu dans un fichier ~/.vimrc Il contient quelques réglages pour vous faciliter la vie, mais on en reparlera dans la deuxième session.

Pour lancer vim, ouvrez votre terminal, et tapez « vim ».

Lisez le message d'introduction, et faites vos premières expériences...

Déroutant, non ?

Pour quitter, appuyez sur Echap, puis tapez « :q! »

Bon, pour l'instant, le moins qu'on puisse dire, c'est que c'est pas très user-friendly :)

Vous inquiétez pas, ça devrait mieux se passer d'ici peu, mais il va falloir faire un peu de théorie d'abord, histoire que vous sachiez ce qu'il se passe.

Les bases

Les modes de VIM

Vim est un éditeur modulaire, c'est à dire qu'une même action aura des effets différents suivant le mode dans lequel on sera placé. C'est l'un de ses aspects les plus déroutants, surout au début, mais aussi celui qui lui confère toute sa puissance. Voici quelques-un de ces modes :

À vous de jouer, maintenant ! Amusez-vous à naviguer entre les différents modes. Si vous êtes perdus, appuyez trois fois sur , quoiqu'il arrive, vous reviendrez en mode normal.

Notez que le fichier .vimrc que je vous ai fourni vous permet d'avoir l'affichage du mode dans lequel vous vous trouvez en bas.

Notez aussi que vous pouvez entrer dans le mode visuel simplement en sélectionnant du texte à la souris.

Insertion

Je vous ai dit tout à l'heure qu'il y avait plusieurs façons de rentrer dans le mode insertion. Vous avez dû remarquer que le i vous fait insérer immédiatement avant le curseur. Quelques autres possibilités, depuis le mode normal :

Essayez !

Entrer et sortir de vim

Pour éditer un fichier avec vim, faites simplement « vim  ». Si le fichier n'existe pas, il sera créé sous ce nom-là quand vous sauvegarderez.

Si vous tapez juste « vim », l'éditeur se lance sans aucun fichier ouvert.

La commande pour sauvegarder est « :w »(write). Pour sauvegarder sous un nom différent, « :w  », pour quitter « :q » (quit).

Notez que vous pouvez utiliser « :wq » pour enregistrer les modifications et quitter, ou « ZZ » qui est un raccourci pour « :wq ».

Essayez de quitter sans enregistrer. Que se passe-t-il ?

Déplacements

Il y a plusieurs moyens de se déplacer dans vim. Toutes ces actions s'effectuent à partir du mode normal.

Amusez-vous avec tout ça, et essayez de retenir les commandes, elles vous sauront utiles pour la suite. Vous pouvez utiliser des arguments numériques également : « 3w » vous déplace de 3 mots, et « 2$ » vous améne à la fin de la deuxième ligne qui suit, par exemple.

Couper Copier Coller

x efface ce qu'il y a sous le curseur. Je vous donne une petite astuce : Si vous avez inversé deux lettres, comme pour le mot "suivatn", mettez le curseur sur le t et faites « xp ». Essayez !

r (comme replace) remplace ce qu'il y a sous le curseur

R vous fait passer en mode "replace": le texte que vous tapez est remplacé et non inséré.

Les commandes pour couper contiennent toutes la lettre d (comme delete), pour copier y (comme yank), et pour coller, c'est p (comme paste), uniquement en mode normal.

Pour définir la portion de texte que vous voulez "yanker" ou "détruire", vous avez plusieurs solutions.

En passant par le mode visuel

Sélectionnez votre texte en mode visuel, et utilisez « y » ou « d », pendant que vous êtes encore dans le mode visuel. Ensuite, passez en mode normal, puis déplacez le curseur où vous voulez, puis tapez p pour coller après le curseur, ou P pour coller avant.

En passant par le mode normal

Vous pouvez aussi utiliser les commandes en y et d en mode normal.

Accrochez-vous, il y en a beaucoup à voir, mais c'est infiniment plus rapide qu'à la souris. L'idée est de taper d (ou y), et ensuite de définir sur quel objet vous voulez travailler.

Notez aussi, dans les commandes qui viennent, la similitude avec les commandes de déplacement.

Vous pouvez aussi utiliser les lettres i (comme inner), et a :

Vous avez le même genre de commandes avec p (pour paragraphe). À vous de deviner ce que font d3w, et dip.

dd efface une ligne

Notez que tout est conçu pour fonctionner comme si vous vous déplaciez. Toutes ces commandent suivent le modèle : action puis déplacement.

Je vous laisse deviner ce que font yy, yip, et autres y2^.

Je reviens sur la copie de ligne. Essayez de bien voir la différence entre p et P. Essayez d'éviter les sauts de ligne inutiles.

Des bonus

Je vais encore vous torturer avec quelques commandes, mais celles-là sont dans le genre "épatez vos amis". Fonctionant exactement de la même façon, vous avez une série de commandes qui contiennent la lettre c (comme "change").

Par exemple, vous avez « ciw » pour changer un mot (rappelez-vous : « i », à l'intérieur). Vous avez encore :

Je vous laisse deviner ce que fait cfx, cc, C, etc. Notez que vous pouvez aussi utiliser f, F, t et T pour vous déplacer, et bien sûr en combinaison avec y ou d.

Dans le même genre de combinaisons, vous avez : ci(, pour changer le contenu d'une parenthèse, et tout un tas de commandes similaires, comme ci[, ci{, et bien sûr ca[. Et puis, di(, etc. À vous de tester tout ça

Une touche à connaître est la touche %. Elle permet d'aller directement d'une parenthèse à une autre, d'un do à un end, de { à }, etc. Elle fonctionne de la même façon. Notez qu'il faut déjà être sur une parenthèse pour que % fonctionne de la façon attendue.

Sachez aussi qu'il y a deux types de mots. Il y a les petits mots, constitués juste de lettres, et les MOTS, séprarés par des espaces.

Écrivez par exemple " /etc/apt/source.list ", mettez votre curseur sur le "p", et regardez la différence entre « ciw » et « ciW ».

Une dernière chose à propos des commandes copier coller. Vous pouvez stocker 26 éléments différents dans le presse-papiers de Vim.

Sélectionner un texte quelconque et appuyez sur « "ay ». Le contenu a été copier dans le "registre" a. Pour coller le contenu du registre a, faites : « "ap » Vous pouvez utiliser les registres de la même façon avec toutes les commandes que nous avons vues jusqu'à présent. Bon, à ce stade, vous êtes sûrement en train de vous demander : mais comment vais-je bien retenir tout ça ? Ne vous inquiétez pas, ça viendra tout seul, par la pratique.

Vous avez aussi ma permission d'utiliser une antisèche pour ce cours, qui se trouve ici .

Inetraction avec des programmes externes

Pour copier dans vim, il faut d'abord faire : « :set paste », pour éviter que le texte que vous collez soit mis en forme automatiquement, mais collé tel quel.

Ensuite, passer en mode insertion, et faire SHIFT+CTRL+V (ou edition/coller) Enfin, désactivez paste avec :set nopaste.

Je déconseille d'activer paste continuellement, car l'option a des effets indésirables, entre autres la disparition du ruler, comme vous avez pu le constater.

Vous pouvez définir une touche pour activer/désactiver paste, avec la commande : :set pastetoggle=€, par exemple.

Il vout suffira alors d'appuyer sur la touche € en mode normal pour activer/désactiver paste.

Pour coller en-dehors de vim, faites : « :set mouse=c », pour éviter que la souris ne vous fasse passer en mode visuel lorsque vous sélectionnez, copiez avec SHIFT+CTRL+C, (ou edition/copier). Ré-activez la souris « :set mouse=a »

Notez qu'avec gvim, tout se passe beaucoup mieux :)

Undos

La commande est « u » pour annuler la dernière modification effectuée, « U » pour rétablir une ligne dans son état d'origine, et CTRL+R pour rétablir. Notez que « UU » vous ramène au point de départ, contrairement à « uu ».

Rechercher / remplacer

Pour chercher, du texte, tapez simplement « /mot » en mode normal. Vous avez une recherche incrémentale, ce qui fait que vim cherchera d'abord "m", puis "mo", puis "mot", et vous coloriera les occurrences trouvées au fur et à mesure.

Pour naviguer entre les différences trouvées, utilisez « n » (comme naviguer) pour le résultat suivant, et « N » pour le résultat précédent. Vim commencera par chercher après le curseur, puis vous préviendra quand il aura atteint la fin du document, et repartira depuis le début. Vous pouvez aussi utiliser « ? » pour chercher directement en arrière.

Le remplacement va être la deuxième occasion pour nous d'utiliser le mode commande de vim. (Pour l'instant, nous ne l'avons utilisé que pour quitter, si vous vous souvenez bien)

Ouvrez le fichier Cours/vrac. Ensuite, passez en mode commande en tapant puis « : », et recopiez ceci :

« :%s/gutsy/hardy/gc »

Ceux qui connaissent sed auront reconnu une syntaxe familière. C'est normal, vi et sed ont un ancêtre commun, ed. La syntaxe est d'ailleurs exactement la même :).

La seule chose qui change est le petit % au début, qui signifie que l'on veut traiter tout le document, si on ne le met pas, on ne travaille que sur la ligne en cours.

Après le troisième /, vous avez les options : g pour dire que l'on veut remplacer toutes les occurrences, et pas seulement la première de chaque ligne (ceux qui connaissent sed ne seront pas surpris). Le c est là pour demander confirmation. (Je vous conseille de l'utiliser, au moins au début :).

Avec l'option c, vous verrez apparaître une ligne plutôt étrange : (y/n/a/q/l/^E/^Y) ? Vous avez le choix d'appuyer sur toutes ses touches pendant la recherchee.

y/n/a/q , pour yes/no/all/quit. Je pense que vous devinez assez bien leur usage.

l signifie : "last" : on arrête de chercher après ce remplacement. ^E et ^Y : signifient CTRL+E et CTL+Y : cela vous permet de faire défiler l'écran. (notez que CTRL+E et CTRL+Y sont utilables en mode normal

Vous avez sûrement remarqué que la couleur reste une fois la recherche effectuée. Si cela vous ennuie, vous pouvez taper « :set nohlsearch ».

Interaction avec le terminal

Vim vous permet aussi d'interagir directement avec votre bon vieux shell. Il vous suffit pour cela d'ajouter un point d'exclamation ! Par exemple, « :! ls » vous affichera le résultat d'un ls tel que vous l'auriez tapé.

Il y a deux choses sympathiques avec ce point d'exclamation. Vous pouvez insérer le résultat d'une commande directement dans le fichier que vous être en train d'éditer. Il vous suffit de rajouter un r (comme read).

Essayez avec « :r! date », et pensez à toutes les fois où vous avez édité un /etc/fstab sans pouvoir faire de « :r! sudo vol_id --uuid /dev/sda2 » ...

Ouvrez maintenant le fichier vrac. Vous voyez que la liste des sympathiques professeurs d'#u-classroom n'est pas triée par ordre alphabétique.

Sélectionnez-là par la méthode de votre choix (souris ou clavier), et, sans quitter le mode visuel, appuyez sur « : ».

Vous devriez voire apparaître quelque chose comme : ":'<,'>". A ce moment là, la commande que vous taperez à la suite sera appliquée à toutes les lignes que vous avez sélectionnées.

Essayez donc de taper « !sort » juste ensuite, et appuyer sur entrée. (Pour ceux qui connaissent, c'est exactement comme si on avait envoyé les lignes sélectionnées vers l'entrée standard de sort)

On aurait pu de la même façon appliquer une commande "à la" sed à ces lignes, ou toute autre commande Unix prenant des lignes en entrée, comme grep, head et consorts. Notez que vim possède aussi sa propre fonction de tri, pour l'utiliser, enlevez simplement le point d'exclamation :)

Enfin, mentionnons que vous avez accès à un vrai shell depuis vim, en tapant « :shell ». Évitez d'y passer trop de temps, (tapez exit pour revenir à vim), sinon, vous allez vous mettre à lancer vim depuis le shell de vim, etc.

Deux astuces en or

Je ne peux que vous conseiller, après vous être bien entraînés, d'aller régulièrement faire un tour du côté de vim.org  .

Vous y trouverez des scripts, des .vimrc, (nous en reparlerons à la séance prochaine). J'y ai trouvé deux commandes magnifiques :

Enfin, n'hésitez pas à faire un tour du côté de l'aide interne de vim. Vous y accédez avec la commande « :help ».

Tapez « :help  » pour obtenir des informations. L'auto-complétion vous sera très utile.

Vous avez un certain nombre de "liens" dans la documentation. Vous pouvez double-cliquer dessus pour les suivre, et utiliser CTRL+T pour revenir en arrière.

En réalité, ces liens sont des tags, mais j'en reparlerai à la prochaine séance.

Utilisez « :q » pour quitter l'aide.

Enfin, ne quittez pas cette page sans avoir au moins essayé « :help! » et « :help 42 » Voilà, au revoir et merci pour le poisson !