Vi IMproved 6.0
Voilà plus d'un an que la première alpha version de Vim 6 a été rendue disponible sous le numéro 6.0a. Aujourd'hui, Bram Moolenaar annonce la version stable 6.0. Il s'agit sans aucun doute d'une évolution majeure depuis la version 5.8.9, un grand nombre de fonctionnalités ont été ajoutées et Bram va prendre quelques vacances pour rendre visite à l'association humanitaire promotionnée par son éditeur.

Bram a déjà annoncé dans un post sur la liste de diffusion de Vim que les prochaines versions de l'éditeur ne concerneront pas d'ajouts majeurs de fonctionnalités. Il estime en effet que Vim est d'ores et déjà une application relativement complexe et qu'elle possède tellement de fonctionnalités que certaines ne sont même pas utilisées. Les futures 6.x concerneront donc principalement du nettoyage de code et des optimisations :
Stability and easy of use are the main goals for the future ("La stabilité et la simplicité d'utilisation sont les buts à atteindre dans l'avenir").

Quoi de neuf ?
La version 6.0 apporte un grand nombre d'améliorations visuelles. Quelques-unes de ses fonctionnalités étaient déjà présentes dans les toutes premières versions alpha de la version 6, mais elles ont été améliorées et certaines sont vraiment nouvelles :

- Le folding. Dans l'édition de texte, mais surtout de code source, il est parfois très intéressant de supprimer virtuellement des lignes de l'écran. Une illustration du folding de Vim correspond tout simplement à une pliure dans une feuille de papier. Le folding permet de plier des lignes du buffer de manière à ce qu'elles n'occupent qu'une seule ligne. Un exemple est sans doute nécessaire ici pour bien comprendre l'utilité de la chose.

Ouvrez un fichier source quelconque et sélectionnez en mode visuel (
v) un certain nombre de lignes qui ne nous intéressent pas pour le moment. Utilisez ensuite la commande zf pour créer le pli (fold). Vous verrez alors votre sélection de lignes disparaître et être remplacée par une barre libellée par +--- n lines etc. où n est le nombre de lignes dans la pliure. Les lignes n'ont pas réellement disparues, elles sont simplement masquées.

Toutes les commandes de folding débutent par la lettre
z. Une fois qu'une pliure est définie, vous pourrez à loisir l'ouvrir avec zo pour retrouver vos lignes et la refermer avec zc. Notez qu'il est possible de créer des pliures dans les pliures ; c'est à vous qu'il convient de vous y retrouver :) Le folding est une fonctionnalité à utiliser avec modération.

- Séparation verticale de fenêtre. Avec les versions 5.x.x, il était possible de diviser l'écran en plusieurs fenêtres de manière à éditer plusieurs buffers en même temps. La version 6 apporte une amélioration dans la gestion de l'espace écran en permettant la division horizontale mais également verticale. Ainsi, avec un terminal correctement configuré et un écran de taille respectable, vous pourrez vous lancer dans l'édition de nombreux fichiers de manière simultanée.

La création d'une nouvelle fenêtre dans l'écran, de manière horizontale, ne change pas, c'est toujours la séquence de touche
CTRL-w n qui remplira cette fonction. Pour une division verticale, vous utiliserez soit CTRL-W v, soit CTRL-W CTRL-V ou encore :vsplit.

Le passage d'une fenêtre à l'autre se fait toujours par la séquence
CTRL-W direction. Le redimensionnement des fenêtres se fera dans le sens horizontal avec CTRL-+ et CTRL-- et dans le sens vertical avec CTRL-> et CTRL-<.

Il vous sera également possible de déplacer les fenêtres sur l'écran :

CTRL-W K pour déplacer la fenêtre courante tout en haut de l'écran ;
CTRL-W J pour déplacer tout en bas ;
CTRL-W H pour déplacer tout à gauche ;
CTRL-W L pour déplacer tout à droite.

- Le mode diff. Comme son nom l'indique, ce mode permet de mettre en évidence les différences existant entre 1, 2, 3 ou 4 fichiers. Seules les parties différentes seront affichées, les autres seront cachées à l'aide de pliures en conservant une certaine marge permettant de repérer plus facilement le contexte des différences. Il semble s'agir d'une fonctionnalité relativement désuète, mais elle prend toute son importance lors de comparaisons entre des versions patchées et non patchées de fichiers sources. La figure 1 vous donnera (je pense) une idée de l'importance du diff mode.

Pour utiliser cette fonctionnalité, prenons le cas où vous possédez deux versions d'un projet. Le premier étant l'original dans
projet-orig et le second, une version patchée dans projet-ac11. Procédez alors comme ceci :

$ vim -d projet-orig/main.pl projet-ac11/main.pl

Vim va alors automatiquement traiter le contenu des deux fichiers pour ne ressortir qu'une partie du code. La fenêtre sera divisée en deux, chacune des deux parties ayant en surbrillance le code différent. Cela vous permettra de repérer beaucoup plus facilement les modifications apportées par un patch et leur implication dans le code.

Bien sûr, en cas d'édition d'une des deux buffers, il vous sera possible de rafraîchir le
diff avec la commande :diffupdate.

Une autre commande très utile est
:diffpatch. Celle-ci prend en argument un patch existant sur votre système de fichiers. Vim va alors utiliser le contenu du buffer courant, le patchera avec le patch désigné et ouvrira une nouvelle fenêtre comprenant la nouvelle version. Bien évidement, Vim passera en diff mode pour afficher l'étendue des modifications.

Autre indication importante, les paramètres par défaut du
diff mode sont prévus pour offrir un maximum de souplesse. Ainsi, l'option :scrollbind sera automatiquement utilisée et un défilement du buffer dans une fenêtre provoquera le défilement dans les autres. Vous n'aurez donc pas à vous soucier des déplacements dans les différents buffers.

- eVim : EasyVim. Il s'agit d'une version spécifique de Vim en mode GUI destinée aux personnes ayant du mal à comprendre le principe des modes d'édition. Les commande evim ou vim -y lanceront automatiquement Vim en mode insertion. La majorité des fonctionnalités et des commandes à la NotePad de Windows sont utilisées. Cette version de Vim est principalement destinée aux utilisateurs Win32 ne voulant pas faire l'effort d'apprendre Vim.

- Indentation plus souple. Vim est à présent capable d'utiliser un programme externe arbitrairement choisi par l'utilisateur pour indenter son code. Ce programme d'indentation sera en réalité un script Vim. Vous pourrez donc très facilement créer des systèmes d'indentation pour n'importe quel langage ou tout simplement modifier l'indentation des langages déjà supportés.

A l'instar des fichiers de colorisation syntaxique, les fichiers scripts d'indentation seront surtout des contributions d'utilisateurs. Il faut donc s'attendre, dans très peu de temps, à voir apparaître une large masse de contributions de ce type.

- UTF8. Vim est à présent capable d'éditer des fichiers codés en UTF8, UTF16, UCS-2 et UCS-4. Les utilisateurs écrivant en une langue utilisant des caractères non ASCII pourront utiliser Vim à loisir pour leur travail.

- NLS. Enfin, Vim supporte le système multilingue NLS. Pour l'heure, déjà plus de 15 langues sont supportées (dont le français grâce à la contribution d'une personne bien connue des lecteurs du magazine : David Odin). Là encore, les autres fichiers d'internationalisation ne sauraient tarder à venir. Sachez simplement que les fichiers NLS sont placés dans une archive séparée (vim-6.0-lang.tar.gz) dont le contenu devra être installé dans les sources de Vim avant la compilation. Les traductions concernent aussi bien les messages que les menus de la version GUI.

- Plugins. Sous ce terme se cachent en fait des scripts Vim placés dans les répertoires /usr/local/share/vim/vim60/plugins ou dans ~/.vim/plugins. Ces plugins seront automatiquement chargés lors de chaque démarrage de l'éditeur. Quelques scripts/plugins sont installés par défaut :

explorer.vim est un browser de fichiers vous permettant d'ouvrir des répertoires dans Vim et de naviguer dans le système de fichiers. La navigation est facilitée à l'aide des commandes de direction et de la touche "Entrée". Un certain nombre de commandes vous permettront également d'obtenir une prévisualisation du contenu d'un fichier (p) ou encore d'ouvrir le fichier tout en restant dans le browser (o).

gzip.vim permet l'ouverture et l'édition de fichiers compressés.

netrw.vim permet l'édition de fichiers via un réseau. Différents protocoles sont supportés : HTTP en lecture seule (utilisation de wget), SCP, RCP, FTP en lecture/écriture. Pour utiliser cette fonctionnalité, il vous suffira de spécifier dans le nom du fichier le chemin et la méthode d'accès.

Le transfert de fichiers sera transparent pour l'utilisateur, qui travaillera sur le buffer et ce, en lecture comme en écriture. Attention : gardez à l'esprit que vous pouvez simplifier davantage l'utilisation de cette fonctionnalité (en particulier en FTP), mais ceci se fera au prix d'une baisse de la sécurité. Bien sûr, cela ne concerne pas SCP pour lequel vous devrez, par contre, utiliser une syntaxe légèrement différente du
[ftp][http][rcp]://machine/chemin/fichier. Vous devrez préciser qu'il s'agit d'un chemin absolu en ajoutant un / ainsi : scp://machine//chemin/fichier.

- Historique des commandes. Déjà présent dans les versions 5.x.x, l'historique des commandes Ex de la version 6.0 a été amélioré. Vous disposez maintenant d'une fenêtre spécifique listant le contenu de l'historique. Pour y accéder, il vous suffira d'utiliser q: depuis le mode commande. L'équivalent pour les recherches et substitutions est également disponible avec q/.

- Intercommunications. Sous Linux (et les autres systèmes de type Unix), la communication inter-Vim ne fonctionne que sous X11. En effet, la communication utilise le serveur X pour l'échange d'informations entre le ou les serveur(s) Vim et les clients. En utilisant ces fonctionnalités d'intercommunication, vous pouvez envoyer des commandes, ouvrir des fichiers et évaluer des expressions sur un Vim serveur depuis un Vim client.

Prenons l'exemple suivant :
- Lancez
vim --servername VIM dans un xterm (ou autre émulateur de terminal sous X). Ceci va alors créer un serveur Vim nommé VIM.
- Dans le buffer courant, entrez du texte quelconque (plusieurs fois "toto" par exemple).
- Dans un autre
xterm, utilisez la ligne suivante :

$ vim --remote-send ":%s/toto/titi/g<cr>"

Nous envoyons une commande au serveur Vim, qui va l'exécuter (ici, remplacer toutes les occurrences de "toto" en "titi").

- Retournez dans le
xterm où se trouve le Vim serveur et constatez que le changement a correctement été fait.

Bien sûr, de telles manipulations ne sont pas utiles dans le travail quotidien de l'utilisateur. Il en va autrement lorsqu'il s'agit de scripts Vim. On imagine aisément l'étendue des possibilités. L'utilisateur/programmeur peut facilement accéder à toutes les capacités d'édition de Vim 6.0 en automatisant au maximum les manipulations.

- Impressions. Il ne s'agit là que d'un début de support pour des fonctionnalités d'impression. De manière générale, un éditeur de texte comme Vim, optimisé pour le développement ne possède aucun support d'impression. L'utilisateur préférera diriger directement un flux de caractères vers un utilitaire spécialisé (comme a2ps).

Néanmoins, la version 6 de Vim propose une commande
:hardcopy permettant de générer un fichier temporaire au format PostScript, qui sera envoyé à l'imprimante via le système d'impression classique (lpr). Le fichier généré sera cependant suffisamment bon pour servir de document d'appoint fait à la "va vite". Notons par exemple que la colorisation syntaxique sera parfaitement respectée, ce qui permettra au développeur de rapidement imprimer son code de manière correcte.

- Gestion des vues. Une vue est une session Vim spécifique à une fenêtre. Une vue est une mémorisation de plusieurs éléments concernant le buffer en cours :

- le fichier actuellement édité ;
- le mapping en cours ;
- les pliures utilisées ;
- la position du curseur dans le fichier ;
- le répertoire en cours.

On peut ainsi, avec
:mkview enregistrer tout un environnement d'édition et le restaurer ensuite avec :loadview. Vous pouvez utiliser jusqu'à 10 vues par fichier, mais vous pouvez également dépasser cette limite en nommant arbitrairement vos vues avec :mkview ~/.vim/premierevue.vim.

- Autoread est une nouvelle option permettant de remettre à jour le contenu du buffer si celui-ci a été modifié par une application externe à Vim.

- Nouveaux fichiers de colorisation syntaxique supportant les types suivants :

bdf      fichier BDF de définition de police de caractères
catalog  catalogue SGML
debchangelog     Changelog Debian
debcontrol       Debian Control
dsl      fichiers DSSSL
eterm    fichiers de configuration d'Eterm
lftp     fichiers LFTP
lynx     configuration du browser Lynx
mush     langage Mush
pilrc    fichier de ressource Pal (dével. Palm Pilot)
povini   configuration POV-Ray
readline         configuration de Readline
screen   fichier de ressource de Screen
terminfo         définition d'entrée source pour Terminfo
wget     configuration pour Wget

Un grand nombre de fichiers de colorisation ont également été mis à jour pour suivre le développement des langages et de leur syntaxe.

Incompatibilités
Un changement de version majeur impose toujours un certain nombre d'incompatibilités. C'est le cas pour Vim et le passage d'une version 5.x.x à la 6.0. Voici quelques-unes des incompatibilités les plus importantes :

- Les digraphs sont à présent compatibles avec la RFC1345. Les digraphs sont utilisés pour saisir des caractères qui ne sont pas accessibles au clavier. Vous pourrez lister les digraphs prédéfinis avec :digraphs. Si votre Vim a été compilé sans le support digraph, vous obtiendrez un message d'erreur.

L'utilisation des digraphs est très simple. Pour le symbole du yen, par exemple, vous utiliserez
CTRL-K Y e en mode insertion. Un digraph est toujours composé de deux caractères. Vous pourrez ajouter vos propres digraphs en utilisant (toujours pour le Yen) :

:digraphs ye 165

- L'effacement par CTRL-U effaçait entièrement la ligne courante en mode insertion avec les précédentes versions de Vim. Or, la plupart des shells Unix existants utilisaient cette même séquence pour effacer les caractères placés avant le curseur sur la ligne courante. Avec Vim 6.0, cette dernière méthode a été préférée. Attention, donc, si vous êtes un habitué du CTRL-U !

- Les ctags ne font plus partie intégrante de Vim. Le projet évolue rapidement et se voit donc distribué séparément.

- La documentation a été réorganisée. Il est donc probable que vous soyez un peu perdu si vous connaissez le manuel de Vim 5 sur le bout des doigts. Une partie des explications du manuel utilisateur a été transférée dans le manuel de référence et inversement. De plus, le guide de référence rapide constitue maintenant une documentation séparée.

Autres améliorations
En plus des fonctionnalités ajoutées, un certain nombre d'améliorations notables ont été effectuées. Ceci concerne aussi bien la stabilité que les performances en général.

- L'affichage et le rafraîchissement de l'écran a été amélioré.
- Amélioration de la gestion de la souris.
- La gestion mémoire a été optimisée. Les blocs mémoire réservés aux annulations de frappe sont par exemple éliminés lorsqu'ils sont vides.
- Le chargement du menu (en mode GUI) est 70% plus rapide grâce à la prégénération du menu dans un script séparé.
- L'ouverture et l'interprétation de répertoire ne sont plus possibles. En effet, sous Unix, un répertoire peut être lu comme un fichier, mais cela n'avait aucun sens pour la commande
:source de Vim.
- La colorisation syntaxique supporte à présent les terminaux X de 88 et 256 couleurs (ça tombe bien, on en parle dans le présent numéro :)
- La commande
g CTRL-g (permettant de compter les mots) fonctionne également en mode visuel.
- Des améliorations dans le domaine de la sécurité ont également été apportées, comme par exemple la vérification du type de fichier avant l'écriture dans un fichier temporaire. S'il s'agit d'un lien symbolique, l'écriture ne se fera pas. De la même manière, un fichier swap (
.swp) ne sera pas ouvert en écriture s'il existe déjà, et ce afin d'éviter, là encore, une éventuelle attaque par lien symbolique.

Déjà largement utilisé dans le monde Linux et Unix en général, l'éditeur Vim, avec cette nouvelle version, entre dans une ère nouvelle. Les nouvelles fonctionnalités dont il dispose en font sans conteste le meilleur éditeur existant actuellement. Je parle, bien sûr, des éditeurs et non des applications débordant largement du cadre de l'édition de texte. Il est rapide, souple, personnalisable et on comprend son créateur lorsqu'il parle de ne plus apporter de grandes fonctionnalités aux versions qui vont suivre. Si vous ne connaissez pas encore Vim, j'espère que cet article vous aura donné envie de l'essayer.
Happy Vimming à tous !

Liens
Vi IMproved Homepage
http://www.vim.org

Vim Challenge
http://www.vim.org/chall.html

HOWTO de l'éditeur ViM couleur
http://www.freenix.fr/unix/linux/HOWTO/Vim-HOWTO.html

La page Vim sur Mutt-fr.org
http://www.muttfr.org/gen.php3/topic/mutt-vim,0,1,0.html

Vigor, le trombone enfin sous Vim !
http://www.red-bean.com/~joelh/vigor/
Copyright (c) Linux Magazine France
Permission vous est donnée de distribuer des copies exactes de cette page tant que cette note de permission et le copyright apparaissent clairement.