Cours sur VIM. Deuxième partie : Utilisation avancée

Pour cette deuxième session, nous verrons (les bases de) la personnalisation de vim, et comment travailler avec plusieurs fichiers en même temps.

Ensuite, on verra comment utiliser Vim comme IDE. J'ai choisi d'illustrer avec le langage Python. Le langage le plus adapté à Vim est le C, pour des raisons historiques, mais comme je ne le connais pas bien, j'ai pris Python.

Vous verrez que pour un langage "pas adapté", Vim + Python marche quand même assez bien :)

Enfin, nous verrons quelques astuces pour utiliser Vim comme traitement de texte, notamment pour la correction orthographique.

Le fichier ~/.vimrc

Bon, depuis le temps qu'on en parle, il était tant qu'on l'aborde un petit peu.

Ce fichier vous permet de définir vos paramètres personnels. Je vous en ai fourni un tout fait pour que la première session soit plus facile pour vous, et j'ai rajouté quelques commentaires.

Notez que les lignes commentées commencent par un guillemet. (Je vous conseille de l'ouvrir avec vim, y a des couleurs, vous verrez)

Bon, je pense que jusqu'à la partie "Réglages supplémentaires", tout va bien. Il faut juste comprendre que vous mettez dans ce fichier exactement ce que vous mettriez sur la ligne de commande, hormis les « : »

Quelques petites informations supplémentaires.

Un petit mot sur l'option background. Vim essaye de deviner si vous avez un fond clair ou nom.

Typiquement, si vous êtes sur un tty, vous êtes sur fond noir, sinon, vous avez plus de chance d'être sur fond blanc.

Personnellement, j'aime bien avoir un fond sombre sur mes terminaux virtuels, donc je me sers de cette option. Pour les non-anglophones, le contraire de "dark", c'est "light".

Je vous invite à consulter l'aide disponible à propos de chacune de ces options, à vous des les adapter à vos besoins ensuite.

Deux astuces pour finir.

Abréviations

Vim peut vous permettre de définir un certains nombres d'aides à l'écriture. Je me sers personnellement énormément de ces abréviations. Je suppose que la ligne 57 est claire pour tout le monde. Testez :)

Vous aurez noté que le remplacement ne se fait que si vous tapez , et qu'il est difficile d'appeler gpocentek par son surnom, à présent :(

Je m'en sers principalement comme d'auto-correction, plutôt. Du genre : « abbreviate suod sudo ».

Vous pouvez regarder « :help abbreviation » pour plus d'information. (vous pouvez voir la liste des abréviations en cours, en supprimer certaines, etc.)

Mappings

La syntaxe est la même que celle des abréviations. "map" fonctionnera pour tous les modes, "nmap" en mode normal, "cmap" en mode console et "imap" en mode insertion. Je vous ai mis deux exemples.

Le premier est très pratique à l'usage. Remarquez l'argument une peu "magique" ( %p:h ) qui est passé à la commande cd.

(Les plus attentifs d'entre vous auront vu qu'il ne s'agit pas du cd du shell, vu qu'il n'y a pas de point d'exclamation, nous reviendrons là-dessus.)

Le deuxième est la pour vous montre que l'on peut passer exactement la commande que l'on veut dans la deuxième partie de l'abréviation. Ici, une fois qu'on a tapé l'étoile, on recule de deux mots « bb », d'un caractère « h » et on repasse en mode insertion. Ainsi, on se retrouve avec le curseur juste arpès le from, ce qui est pratique.

On utilise les caractères spéciaux en les notant comme ceci : , (entrée: carriage return) , et , etc. pour les touches fonctionnelles.

Vous pouvez inventer vos propres mappings vous mêmes.

Les mappings fonctionnent sur un mode différent des abréviations. Si vous tapez « f » puis « m », assez lentement, vous verrez que le mapping n'a pas été effectué.

Choisissez donc des mappings que vous pouvez taper rapidement. Je vous invite à tester le mapping « fm », et à bien percevoir l'influence de la vitesse à laquelle vous tapez ces deux caractères.

Autocommandes

Les autocommandes sont provoquées par certains évènements. La ligne 73 se lit comme suit.

"Si un nouveau fichier (BufNewFile) est créé avec l'extention py (*.py), alors execute la commande "0r ~/vim/skeleton.py", i.e lit le fichier ~/.vim/skeleton.py et insère-le dans le fichier".

Rappelez-vous le cours précédent sur les filtres.

La ligne suivante permet de positionner le curseur au bon endroit une fois le fichier modèle importé.

Pour l'instant la ligne est commentée, puisque le fichier skeleton.py n'existe pas encore. Créez-le avant de décommenter ces deux lignes.

Pour l'instant, mettez juste les lignes

#!/usr/bin/python
# -*- coding: UTF8 -*-

Si vous ne savez pas à quoi ça sert, allez relire le cours sur Python de la classroom, ou contentez-vous de vous dire que c'est le genre de choses qu'on aime bien avoir au début de tout script python.

Testez maintenant en créant n'importe quel fichier. Vous verrez que « vim tagada.py » utilise bien le modèle, mais pas « vim tagada ».

Voilà, vous trouverez facilement des dizaines d'autocmd un peu partout. N'hésitez pas à réemployer celles que vous trouverez, et à vous faire vos propres modèles. En principe, vous les retiendrez facilement, celles-là :)

Travailler avec plusieurs fichiers

Les buffers

Un mot d'abord sur le fonctionnement de Vim. Le texte que vous tapez à l'écran n'est pas écrit dans le disque dur tout de suite. Il est d'abord stocké dans quelque chose qui s'appelle un "buffer". Lorsque vous utilisez la commande « :w fichier », vous recopiez le contenu du buffer en cours sur le disque dur.

Il faut également savoir que Vim sauvegarde régulièrement vos buffers dans un fichier caché, qui s'appelle .fichier.swp. Lorsque tout va bien, ce fichier est effacé lorsque vous quittez vim.

Je vais vous montrer comment il fonctionne. Lancez vim avec « vim test », écrivez dedans, puis fermez le terminal, sans quitter vim proprement

Ensuite, tentez de rouvrir le fichier avec « vim test ». Lisez le message d'erreur et essayez de récupérer votre fichier test :)

Notez que par sécurité, le fichier .swp reste là tant que vous ne le supprimez pas vous-même. Vous continuerez à avoir ce message tant qu'il existera. Le même genre de message survient lorsque vous essayez d'ouvrir deux fois le même fichier. Il y a déjà un .swp présent, donc un buffer en cours quelque part.

En revanche, vous pouvez avoir plusieurs buffers ouverts dans une même session Vim sans problème. Il y a d'ailleurs de nombreuses façons de travailler avec plusieurs buffers.

Travailler avec des fenêtes sous Vim

On va y venir tout de suite, mais avant, jetons un œil à une autre fonctionnalité de vim.

Peut-être avez-vous déjà essayé d'ouvrir un répertoire avec vim. Faites-le maintenant, alors : « vim Cours »

Vous voyez que vim possède son propre explorateur de fichiers. D'où l'avantage de la commande « :cd » (et non « :!cd »), qui permet d'amener l'explorateur de vim au bon endroit. Cela vous sera également bien utile pour éviter de devoir taper des chemins de fichiers trop longs :)

Mettez juste votre curseur sur le fichier main.py et appuyez sur entrée. Imaginez que vous ayez envie de regarder le fichier pouet.py.

Tapez simplement « :sp pouet.py » (split). Vous aurez alors une nouvelle fenêtre.

Si vous préférez un séparation verticale, vous pouvez faire « :vs pouet.py » (vertical split)

Vous pouvez changer de fenêtre active avec « CTRL+W w» , (ce n'est pas une faute de frappe, laisser control appuyé et appuyez deux fois sur "w"), ou avec la souris, simplement en cliquant dessus.

Pour fermer une fenêtre, c'est simplement « :close ».

Vous pouvez redimensionner les fenêtres directement à la souris, ou au clavier.

Vous pouvez aussi mettre vos fenêtres dans des onglets. Je vous laisse jouer avec : « :tabnew », « :tabNext », « :tabprevious », et « :tabclose ». Bien évidemment, vous pouvez aussi naviguer entre les onglets simplement en cliquant dessus :)

Vous vous demandes peut-être comment avoir l'aide sur CTRL+W ? L'astuce, c'est d'utiliser la combinaison de touches « CTRL+V ». On revoit le côté modulaire de Vim. Souvenez-vous, en mode insertion, CTRL+V passe en mode "visuel bloc". Mais en mode insertion ou de commande, CTRL+V permet d'écrire des caractères spéciaux.

Vous pouvez donc taper : « :help CTRL+V CTRL+W », pour avoir la liste des commandes concernant les fenêtres.

Note: votre ligne de commande affichera quelque chose comme : « :help ^W ». N'essayez pas de taper :help, le petit chapeau, l'espace et W, ça ne fonctionnera pas :) Vous pouvez vous servir de CTRL+V dans votre .vimrc pour mapper des combinaisons un peu pénibles à utiliser sur un clavier français, du genre : « CTRL+] ». C'est-à-dire « CTRL+AltGr+] »

Exercice : que fait donc cette combinaison de touches ? (c'est la commande pour utiliser les tags, j'en parle après)

Ajoutez donc une commande alternative pour cette commande, par exemple en mettant « map ^] » dans votre .vimrc. Pensez à utiliser CTRL+V, sinon, ça ne fonctionnera pas !

Coder

Dans cette section, nous allons nous intéresser à Vim comme éditeur de code. Quasiment toutes les fonctionnalités que vous avez dans un éditeur "graphique" existent dans Vim. Je vous en montre quelques-unes.

La première est la coloration syntaxique, couplée avec la détection automatique du type de fichier. Vous verrez que vim colore correctement un nombre impressionnant de langages de programmation, plus tous vos fichiers de configurations habituels. Ouvrez par exemple /etc/fstab pour vous en rendre compte. (Pas avec sudo !)

La numérotation de lignes est aussi possible. Vous l'avez commentée dans votre .vimrc, « :set numbers », avec sa contrepartie : « :set nonumbers ».

Exercice : quelle est le petit nom de l'option numbers ?

Je vous ai mis aussi showmatch, qui est bien pratique pour les amateurs de LISP.

Indentation

Il y a plusieurs mode d'indentation pour vim. Celui que je vous ai mis est smartindent, mais vous en avez d'autres. Notamment autoindent et cindent.

Je ne vous décris pas tous les effets de ces otions. Le mieux est, si vous connaissez un langage, de commencer à taper du code, et de voir l'indentation automatique en action. Vous serez en général agréablement surpris :). Comparez ensuite les trois modes et choisissez celui qui vous convient le mieux.

Pour indenter ou désindenter du texte, sélectionnez les lignes, et utilisez > et <. Devinez ce que font >> et << ...

Un petit mot sur le shiftwidth. Cela définit le nombre d'espaces utilisés par l'indentation avec >. L'option à activer en même temps est smarttab, si vous voulez qu'une tabulation en début de lignes fasse le même nombre d'espaces que quand vous utilisez >

Enfin, une option absolument indispensable quand vous faites du python, c'est l'option expandtab, pour remplacer les tabulations par des espaces.

Je rappelle qu'une ligne commençant par quatre espaces et une ligne commençant par une tabulation ne seront pas vues par python comme étant indentées de la même manière.

Tags

C'est l'une des fonctionnalités indispensables de vim. Tout d'abord, installez le paquet exubertant-ctags. « sudo apt-get install exuberant ctags » pour Debian ou Ubuntu/

À l'origine, les tags ne fonctionnaient que pour C, mais depuis, de nombreux langages ont été ajoutés. (Regardez la page de manuel de exubertant-ctags pour la liste).

La commande à utiliser est : « ctags -R * » (dans un terminal normal)

Exercice : comment générer les tags depuis Vim ?

Un fichier "tags" sera automatiquement créé. Regardez de quoi il a l'air avec l'exemple fourni. Ces fichiers tags peuvent être utilisés avec d'autres éditeurs, Emacs entre autres pour ne pas le nommer.

Ensuite, ouvrez le fichier main.py. Positionnez-vous sur le mot "Bik", et appuyez sur . Le raccourci original est « CTRL+] » , mais nous l'avons modifié ensemble, souvenez-vous ...

Tapez « CTRL+T » pour revenir.

Sinon, il y a l'excellent plugin taglist, à récupérer sur vim.org. Je vous donne juste un screenshot pour vous faire envie. (screenshot aimablement fourni par Sp4rky, merci à lui)

Complétion

Là aussi, vim contient un certain nombre de complétions différentes, hautement personnalisables elles aussi.

Les commandes de complétion commencent toutes par « CRTL+X », et s'utilisent en mode insertion. Vous pouvez utilisez « CTRL+N » et « CTRL+P » (next et previous), pour naviguer entre les différentes suggestions.

Par défaut, le mode activé est la complétion par fichier. Vim recherchera parmi le fichier en cours, c'est-à-dire que si vous tapez simplement « CTRL+N » après un mot, vim ne cherchera que parmi les mots du fichier.

D'autres modes de complétion sont disponibles :

Omnicomplétion

Celui-ci est un mode de complétion qui atteint les mêmes fonctionnalités que les bons IDE. Il s'utilise avec « CTRL+X CTRL+O ».

Notez la ligne de .vimrc qui est nécessaire pour l'activer, à adapter si vous utilisez d'autres langages. Notez aussi que Vim essaiera de deviner que le fichier contient du code Python, et ne se basera plus seulement sur l'extension de fichier.

Récupérez le fichier pythoncomplete , et mettez-le dans /usr/share/vim/vimcurrent/autoload/

Récupérez aussi le fichier supertab.vim, et mettez-le dans /usr/share/vim/vimcurrent/plugin/supertab.vim

Vous verrez qu'il vous suffit d'utiliser la touche tabulation pour lancer la complétion.

Utilisez « :SuperTabHelp » pour avoir la liste des modes de complétion disponibles Si vous êtes attentifs, vous voyez qu'il y a moyen de définir une autocomplétion par dictionnaire. (CTRL+X CTRL+K). Vous avez de la chance, sur vim.org, on trouve des dictionnaires de complétion pour Python. Allez donc le récupérer ici .

Je laisse les fanas de Python lire la documentation. Sachez juste que vous avez une complétion par modules, et que vous avez aussi un script pour ajouter vos propres modules au dictionnaire :)

Écrire du texte

Formattage des paragraphes

Vim est orienté programmation, mais vous pouvez retrouver quelques options d'un éditeur de texte plus conventionnel. Par exemple, par défaut, vim ne coupera pas vos lignes lorsqu'elles sont trop longues. Vous pouvez fixer la longueur du texte avec l'option textwidth.

Notez que le formatage du texte ne se fait pas toujours automatiquement. Le saut de ligne est automatique, mais pas si vous commencez à insérer du texte au milieu d'une ligne.

La commande pour cela est la commande « gq ». Histoire de réviser, trouvez-moi le maximum possible de façons de reformater un paragraphe. Il y en a une demi-douzaine ;)

Si une ligne est coupée trop courte, vous pouvez utiliser la commande « J » sur la ligne du haut, pour joindre les deux lignes en question, puis une nouvelle fois gq pour reformater le texte.

Correction orthographique

Un dictionnaire français pour Vim est disponible ici , téléchargez-le et mettez-le dans /usr/share/vim/vimcurrent/spell/

La commande pour activer la correction orthographique est : « :setlocal spell spelllang=fr » Je vous recommande de la mapper ;)

Commencez à taper du texte en français, et faites quelques fautes. Vous verrez que les mots mal orthographiés sont coloriés. Vous pouvez accéder à la liste des suggestions avec « z= » (en mode normal)

Je vous laisse découvrir comment cela s'utilise.

Si vous considérez qu'un mot est correct, vous pouvez l'ajouter temporairement avec « zG ».

Vous pouvez définir également votre propre fichier de mots à ajouter au dictionnaire. Créez-vous une arborescence avec « mkdir -p .vim/spell » Ensuite, définissez le fichier à utiliser : « :set spellfile="~/.vim/spell/perso.utf-8.add" » Vous pouvez alors ajouter les mots à votre dictionnaire personnel avec la commande « zg ».

Notez que le fichier .add est un bête fichier contenant un mot par ligne, ce qui vous permet de gérer très facilement votre liste. Notez que vous pouvez utiliser la vérification orthographique même si vous êtes en train d'éditer du code. Elle ne sera faite qu'à l'intérieur des commentaires.

Enfin, pour ceux qui aimeraient utiliser GVim, je vous conseille la commande « :set mousemodel=popup », qui vous permettera d'utiliser le clique droit sur les mots mal orthographiés.

Notez que gvim utilise d'abord le fichier "~/.vimrc", puis le fichier" ~/.gvimrc".

Pour aller plus loin

Comme je vous l'ai dit au début de ce cours, je countinue à apprendre sans arrêt. Continuer à utiliser Vim, essayez de vous débarrassez peu à peu de la souris (vous verrez la vitesse à laquelle vous pourrez alors taper) Enfin, si vous cherchez un livre sur Vim, je vous recommande le VIM Book (en anglais)