Le travail d'un éditeur de texte est avant tout de permettre à l'utilisateur... d'éditer du texte. Là où un éditeur est meilleur qu'un autre provient de sa capacité à rendre cette édition de texte agréable et instinctive. Nous avons vu dans les articles précédents que Vi, et en particulier Vim, permettait d'accélérer pas mal de manipulations. Poursuivons ce mois-ci avec des fonctionnalités plus visuelles.

Lorsqu'il s'agit d'éditer un texte "rédactionnel" comme une lettre, un mémoire ou autre, il n'est pas nécessaire de faire appel à des fonctions particulières de Vim. En revanche, s'il s'agit de programmation ou d'édition d'un fichier HTML, par exemple, il en va tout autrement. Il est beaucoup plus agréable de voir le texte ou du moins, certains éléments du texte, apparaître avec une couleur spécifique. L'utilisateur pourra ainsi facilement repérer des éléments importants du code (tags HTML, fonctions, conditions, commentaires, etc.).

Vim est livré avec un grand nombre de fichiers de configuration permettant la colorisation syntaxique. Ceux-ci sont habituellement placés dans le répertoire /usr/local/share/vim/vimXX/syntax ou /usr/share/vim/vimXX/syntax, où XX représente le numéro de version de Vim. Si ces fichiers ne sont pas présents, c'est que vous n'avez pas installé le package vim-rt.

Le fichier de configuration par défaut de Vim (.vimrc) définit la colorisation syntaxique. Si ce n'est pas le cas, ajoutez simplement la mention :

if &t_Co > 1
	syntax on
endif

dans votre fichier .vimrc. La mention syntax on seule risque de poser des problèmes avec un terminal noir et blanc. Voilà pourquoi cette commande est placée à l'intérieur d'une condition permettant de savoir si le nombre de couleurs est supérieur à 1. La commande syntax on va alors charger le fichier de configuration syntax.vim placé dans l'un des deux répertoires décrits plus haut. Vous pouvez également associer une touche de fonction du clavier au fait de basculer du mode coloré au mode noir/blanc :

map <F7> :if exists("syntax_on") <Bar> syntax off <Bar> else <Bar> syntax on <Bar> endif <CR>

Une fois cette ligne placée dans votre .vimrc, une simple pression du F7 vous permettra de basculer.

Lors de l'ouverture d'un fichier, Vim va tenter de détecter le type de fichier afin d'utiliser la colorisation adéquate. Il peut cependant arriver que cette détection échoue, mais vous pouvez contourner le problème en demandant à Vim d'utiliser le fichier de syntaxe de votre choix. Ainsi, en éditant un fichier html, vous pouvez utiliser cela pour "forcer" la colorisation :

:syntax on
:set syntax=html

Notez que certains fichiers de colorisation n'ont pas forcément un rapport quelconque avec le fichier édité. Prenons l'exemple du fichier whitespace.vim correspondant à la syntaxe whitespace. Celui-ci permet simplement de voir s'afficher en rouge les espaces et tabulations. Cela peut s'avérer utile puisqu'en temps normal, ce genre d'espaces vides n'est pas visible mais peut avoir une influence sur le résultat (script shell, makefile, etc.).

Gardons l'exemple de whitespace.vim pour étudier la syntaxe des fichiers de colorisation. Tout d'abord, voici le contenu du fichier :

" Simplistic way to make spaces and Tabs visible
" This can be added to an already active syntax.

syn match Space " "
syn match Tab "\t"
if &background == "dark"
  hi Space ctermbg=darkred guibg=#500000
  hi Tab ctermbg=darkgreen guibg=#003000
else
  hi Space ctermbg=lightred guibg=#ffd0d0
  hi Tab ctermbg=lightgreen guibg=#d0ffd0
endif

Les lignes débutant par " sont des commentaires qui ne seront donc pas interprétés par Vim. Les deux lignes :

syn match Space " "
syn match Tab "\t"

associent un groupe à un caractère ou une chaîne de caractères. Nous définissons donc " " comme Space et "\t", qui est une tabulation, comme Tab. Ce sont ces deux groupes qui permettront dans le reste du fichier de faire référence aux chaînes en question. Vient ensuite une condition permettant de réagir en fonction du fond d'écran en cours. En effet, nous ne pouvons pas utiliser les mêmes couleurs si le fond de Vim est noir ou blanc, le résultat serait plus horrible qu'utile.

Nous utilisons ensuite la commande hi (comme highlight) pour renseigner deux paramètres : ctermbg et guibg correspondant respectivement à une couleur de fond (bg = background) pour un terminal couleur (cterm), ou un Vim avec interface graphique, gvim (gui). Les couleurs utilisables pour le terminal couleur sont au nombre de 16 :

	black		noir
	darkblue	bleu foncé
	darkgreen	vert foncé
	darkcyan	cyan foncé
	darkred		rouge foncé
	darkmagenta	magenta foncé
	brown		brun
	gray		gris
	darkgray	gris foncé
	blue		bleu clair
	green		vert clair
	cyan		cyan clair
	red		rouge clair
	magenta		magenta clair
	yellow		jaune (clair)
	white		blanc

Les couleurs pour l'interface graphique de Vim se configurent avec la syntaxe #RRVVBB de la même manière qu'avec HTML. Dans ce simpliste exemple, nous n'avons fait usage que d'un élément de syntaxe : match. Celui-ci permet de spécifier une expression régulière. Il existe deux autres éléments de syntaxe :

  • keyword, qui permet de définir un mot unique :

    syn keyword LMag LinuxMag
    

    Pas de "" puisque le mot seul est concerné. Ainsi, une mention de LinuxMagazine ne sera pas considéré comme le groupe LMag.

  • region, permet de définir une zone contenue entre un marqueur de début et de fin :

    syn region mazone start=<i> end </i>
    

    Ici, les manipulations de couleur qui porteront sur le groupe mazone correspondront à tout le texte figurant entre <i> et </i>.

    Vous l'aurez sans doute compris, la syntaxe de ces fichiers de configuration est très souple. Le simple fait d'ajouter des éléments à un groupe facilite grandement les choses. Par exemple :

    syn region comm start="/\*" end="\*/"
    syn match  comm "//.*$"
    if &background == "dark"
      hi comm ctermfg=darkblue guifg=#000099
    else
      hi comm ctermfg=blue guifg=#0000ff
    endif
    

    Dans le groupe comm, on configure aussi bien les caractères contenus entre /* et */ mais également toutes les lignes précédées d'un double slash (//). Notez que le caractère * doit être échappé avec \ pour qu'il ne soit pas interprété comme un paramètre de l'expression régulière.

    Il est également possible de simplifier la procédure en utilisant les groupes prédéfinis dans Vim. En effet, un certain nombre d'éléments sont récurrents entre différents langages de programmation ou de description (variable, commentaire, fonction). Les couleurs à appliquer à ces groupes par défaut sont déjà définies dans syntax.vim, il vous suffit donc de faire la liaison. Les deux lignes qui suivent sont équivalentes au fichier précédent :

    syn region comment start="/\*" end="\*/"
    syn match  comment "//.*$"
    

    Nous n'avons pas besoin de spécifier de colorisation particulière puisque syntax.vim fournit les valeurs par défaut.

    Pour être tout à fait franc avec vous, il est très peu probable que vous ayez à créer un nouveau fichier de colorisation syntaxique. En effet, les quelques 200 fichiers livrés avec Vim couvrent quasiment tous les langages et formats de fichiers texte connus. En revanche, il est plus probable que les couleurs par défaut ne vous conviennent pas et dans ce cas, il est indispensable de connaître la syntaxe des fichiers pour procéder aux modifications.

    Dans le prochain article, nous nous intéresserons à une autre fonctionnalité très puissante de Vim : les macros. Vous découvrirez que Vim n'a presque rien à envier au très modulaire Emacs.

    Linux Magazine France n°28 - Mai 2001