Mutt et VIM

En mode édition, Mutt s'en remet entièrement à l'éditeur par défaut. C'est donc cet éditeur, en l'occurrence VIM, qui devra être configuré pour accomplir différentes petites tâches telles que la suppression automatique des signatures citées, le paramétrage des couleurs, le formatage du texte ainsi qu'une multitude d'autres options.

La configuration de base nécessaire à la suite de cet article ne repose que sur deux prérequis :

- définir VIM comme éditeur par défaut dans le fichier de configuration de Mutt :

         set editor="vim"

- Activer, si ce n'est déjà fait, la coloration syntaxique VIM, indispensable pour la personnalisation des en-têtes Mutt en mode édition :

         syntax on

A présent on peut passer aux choses sérieuses :)


Automatisation des tâches courantes à l'aide des autocommandes VIM
1. Tronquer les lignes trop longues
Une des principales règles de courtoisie Usenet consiste à ne pas dépasser 80 caractères par ligne. Une longueur de 72 à 76 caractères, en tenant compte des citations lors des différentes réponses, constitue donc une option raisonnable. Ce paramétrage peut être effectué d'au moins deux manières :

- La méthode la plus simple consiste à appeler VIM avec l'option "
textwidth", directement dans son ~/.muttrc :

         set editor="vim -c 'set textwidth=72'"

- Une solution plus élégante permet d'aboutir au même résultat au moyen d'une autocommande VIM, définie dans son ~/.vimrc :

         au BufRead ~/.tmp/mutt* set tw=72

Cette autocommande s'applique aux fichiers temporaires créés par VIM lorsqu'il est appelé par l'application, par défaut, /tmp/nom_application*[0-9]. Ce type de commande peut donc être élargi à de multiples applications autres que Mutt, sous réserve que l'on spécifie les chemins et noms de fichiers temporaires correspondants. Ici, la désignation des fichiers ~/.tmp/mutt* suppose que ~/.tmp ait été défini comme répertoire temporaire par défaut dans Mutt (~/.muttrc) :

         set tmpdir="~/.tmp"

Il est également possible d'éviter la sauvegarde automatique de ces fichiers en cas de réécriture (commandes backup et writebackup VIM), en ajoutant dans à son ~/.vimrc :

         au BufNewfile,BufRead ~/.tmp/mutt*[0-9] set nobk nowb

2. Supprimer automatiquement les signatures lors des réponses
Comme toute autre tâche réalisée en mode édition, la suppression des signatures citées revient à l'éditeur par défaut, non à Mutt. Le principe consiste à définir, dans son fichier
vimrc, une commande chargée d'exécuter cette fonction, puis d'appeler cette commande par défaut en fonction du contexte (en l'occurrence dans Mutt).

Un exemple de configuration est fourni dans certains paquets VIM, permettant au passage de positionner convenablement le curseur :

         map ,kqs G?^> *-- $<CR>d
         au BufRead ~/.tmp/mutt*[0-9] :normal ,kqs

Cette autocommande peu élaborée a cependant le défaut de "beeper" et susciter un message d'erreur lorsque aucune signature n'est détectée. Pour l'éviter, il est possible d'introduire une ou plusieurs conditions par l'intermédiaire d'une fonction plus élaborée, comme celle de Yahn Kerhervé (ci-dessous) :

" Function: Erase_Sig_but_Your()
" Purpose: Delete signatures at the end of e-mail replies. But keep
" your sig intact. (if mutt (or other MUA) had added it)
" Features: * Does not beep when no signature is found
" * Also deletes the empty lines (even those beginning by '>')
" preceding the signature.
" * keep your sig intact
" Author: Yann Kerhervé <yk@cyberion.net> based on Luc Hermitte
" <hermitte@free.fr> work

" here was my beeping macro :)
" map ,kqs G?^> *-- $<CR>d/^-- $/-2<C-M>
function! Erase_Sig_but_Your()
" Search for the signature pattern : "^> -- $"
let lastline = line ('$')
let i = lastline
" (1)
while i >= 1
if getline(i) =~ '^> *-- $'
break
endif
let i = i - 1
endwhile
" let find the beginning of our sig
let j = i
while j < lastline
let j = j + 1
if getline(j) =~ '^-- $'
let j = j - 1
break
endif
endwhile
" If (1) found, then
if i != 0
" First, search for the last non empty (non sig) line
while i >= 1
let i = i - 1
" rem : i can't value 1
if getline(i) !~ '^(>s*)*$'
break
endif
endwhile
" Second, delete these lines plus the signature
let i = i + 1
exe 'normal '.i.'Gd'.j.'G'
endif
endfunction

3. Editer et personnaliser ses en-têtes
Lors de la composition de messages, Mutt intervient de manière pseudo-interactive pour que soient définis les champs "
To" et "Subject", et conserve les en-têtes par défaut. Ces champs peuvent ensuite être modifiés avant l'envoi du message, en tapant la première lettre du champ en question. L'éditeur n'intervient donc que pour la rédaction du corps du message.

Il est possible de modifier ce comportement et d'éditer l'ensemble des en-têtes directement dans VIM, de deux manières :

- ajouter l'option
set edit_headers dans son fichier muttrc ;
- simplement taper "E" dans le menu d'envoi.

Pour personnaliser l'affichage des en-têtes, une solution propre et simple, proposée par Sven Gückes, consiste à définir dans son fichier
vimrc des couleurs spécifiques à Mutt :

1. sourcer dans son fichier
vimrc le fichier contenant les propriétés VIM pour Mutt :

         au BufEnter ~/.tmp/mutt* so ~/.vim/mutt.colors

2. créer et renseigner le fichier /.vim/mutt.colors (exemple ci-dessous). Pour plus d'informations sur la syntaxe de ce fichier et les différentes couleurs disponibles, tapez :help highlight, :help cterm ou :help colors dans VIM.

" exemple de fichier ~/.vim/mutt.colors
hi mailHeaderKey ctermfg=cyan
hi mailSubject ctermfg=magenta ctermbg=darkcyan term=bold
hi mailHeader ctermfg=darkcyan
hi mailEmail ctermfg=yellow cterm=underline term=underline
hi mailSignature ctermfg=darkmagenta
hi mailQuoted1 ctermfg=darkgreen
hi mailQuoted2 ctermfg=darkcyan
hi mailQuoted3 ctermfg=darkmagenta
hi mailQuoted4 ctermfg=blue
hi mailQuoted5 ctermfg=darkblue
hi mailQuoted6 ctermfg=black

Les arguments term et cterm de la fonction "highlight" correspondent respectivement aux terminaux normaux et couleurs. Par exemple, notre champ "Subject" apparaîtra ici en magenta sur fond darkcyan dans un terminal supportant la couleur, et simplement en gras sinon (:help cterm, :help term).

La liste complète des différents arguments "champs" (
Email, Headers, Subject ...) est en fait définie dans un des fichiers de syntaxe VIM, mail.vim (sous Debian, /usr/share/vim/vim58/syntax/mail.vim). Ce fichier comporte en particulier deux grands types de définitions : les "régions" (ensembles de champs auxquels seront affectées les mêmes propriétés), et les "matchs", permettant de déterminer des propriétés spécifiques à chacun des champs. Il est donc très facile de le personnaliser :

Exemple de région (extraite du
mail.vim) :

syn region mailHeaderKey contained par
start="^(From|To|Cc|Bcc|Reply-To).*"
par
skip=",$" end="$" contains=mailEmail

Exemple de "match" (personnalisé) :

syn match mailTo contained "^To.*"

Une fois définis, ces différents "matchs" ou "régions" peuvent alors être nommément désignés dans le fichier mutt.colors, et associés à un ensemble de propriétés.

Quelques commandes et macros utiles
Il est toujours possible de regrouper un ensemble de macros, comme nous l'avons fait pour les définitions de couleurs, à condition d'en spécifier le chemin :

au BufEnter ~/.tmp/mutt*[0-9] so ~/.vim/mutt.macros

De nombreuses macros utiles sont disponibles sur le site de Luc Hermitte http://hermitte.free.fr/vim/#Mail, passionné de Mutt et VIM, et peuvent être utilisées dans ce contexte. Je citerai pour exemple :

-
mail.set : réunit une grande partie des macros et commentaires de Sven Guckes, et charge au passage les 3 autres fichiers de macros qui suivent ;

-
Mail_Re.set : très utile pour fusionner et repositionner les "re" et "Re" sur les threads des listes de diffusion mal paramétrées :). Permet également de transformer les "Réf. :" en "Re:" ;

-
Mail_Cc.set : permet de supprimer sa propre adresse email lorsqu'on effectue un "group reply" ;

-
Mail_mutt_alias.set : permet d'insérer des destinataires à partir du fichier d'alias Mutt, sans quitter VIM, simplement en tapant Ca <alias>. Suppose bien sûr que le chemin d'alias soit préalablement défini dans cette macro (par défaut, ~/.mutt/aliases) ;

Un seul être vous manque... Vigor !
Et pour terminer sur un clin d' il, et parce qu'un seul être vous manque depuis que vous avez lâchement abandonné Outlook Express, sachez qu'il existe aussi... LE trombone pour VI ! Je ne doute pas que l'incontournable compagnon, aussi utile qu'esthétique, saura répondre à toutes les questions qui pourraient subsister après la lecture de cet article ;).

Virginie Vacca, <virginie@parinux.org>
Remerciements particuliers à : IC, Yahn Kehervé, Luc Hermitte et huggie, pour leurs excellents fichiers de conf et leurs contributions à muttfr.


Références de cet article
La page de Luc Hermitte :
http://hermitte.free.fr/vim/
De nombreuses macros utiles pour VIM. Une référence.

La page de Yann Kerhervé :
http://cyberion.net/vim.html
Une autre page de macros VIM.

VIM-howto :
http://www.freenix.org/unix/linux/HOWTO/Vim-HOWTO.html

Muttfr.org :
http://www.muttfr.org
Mon petit site (non officiel) sur Mutt avec différentes astuces et exemples de configuration.

Vim et Mutt :
http://www.math.fu-berlin.de/~guckes/mutt/and.vim.html>
Page de Sven Gückes, l'un des principaux spécialistes de la question. Sven sévit également sur
comp.mail.mutt, avis aux amateurs ;)

Vimrc forall :
http://www.vim.org/vimrc.forall
Des exemples de configuration mail/news (entre autres) pour tous les goûts.

Vigor :
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.