*quickfix.txt* Pour Vim version 6.2.
MANUEL de RÉFÉRENCE VIM - par Bram Moolenaar
Ce sujet est abordé dans la section |30.1| du Manuel de l'utilisateur.
1. Utiliser les commandes mise-au-point |quickfix|
2. La fenêtre d'erreurs |quickfix-window|
3. Utiliser plus d'une liste d'erreurs |quickfix-error-lists|
4. Utiliser ":make" |:make_makeprg|
5. Utiliser ":grep" |grep|
6. Sélectionner un compilateur |compiler-select|
7. Format des erreurs |error-file-format|
8. La pile de répertoires |quickfix-directory-stack|
9. Formats d'erreurs spécifiques |errorformats|
{absent de Vi}
{uniquement si compilé avec la fonctionnalité |+quickfix|}
=============================================================================
1. Utiliser les commandes mise-au-point *quickfix* *Quickfix* *E42*
Vim dispose d'un mode spécial, le mode « mise-au-point », pour accélérer le
cycle édition-compilation-correction. Ce mode est inspiré de l'option
"quickfix" du compilateur Aztec C de Manx sur Amiga. Le principe consiste à
enregistrer les messages d'erreurs dans un fichier et à utiliser Vim pour
sauter vers chaque erreur séparément. Vous pouvez alors étudier chaque
problème et le résoudre, sans avoir à retenir tous les messages d'erreurs.
Si vous utilisez le compilateur Aztec C de Manx sur Amiga, reportez-vous à
|quickfix-manx| pour savoir comment l'employer avec Vim. Si vous utilisez un
autre compilateur, vous devriez enregistrer les messages d'erreurs dans un
fichier et lancer Vim avec `vim -q nomfichier`. Vous pouvez aussi utiliser la
commande |:make|, qui vous facilitera les choses (voir plus bas). L'option
'errorformat' doit être soigneusement définie pour correspondre au format des
messages d'erreurs de votre compilateur (voir |errorformat| plus bas).
Les commandes mise-au-point suivantes peuvent être utilisées :
*:cc*
:cc[!] [no] Affiche l'erreur numéro [no]. Si [no] est omis, la
même erreur est affichée à nouveau. Sans [!], cela ne
fonctionne pas lors d'un saut vers un autre tampon,
lorsque le tampon courant a été modifié, qu'une seule
fenêtre est disponible pour ce tampon et que les
options 'hidden' et 'autowrite' sont désactivées.
En cas de saut vers un autre tampon avec [!], tous les
changements pour le tampon courant seront perdus, sauf
si 'hidden' est activé ou qu'il existe une autre
fenêtre pour ce tampon.
Les paramètres de l'option 'switchbuf' sont respectés
lors d'un saut vers un autre tampon.
*:cn* *:cnext* *E553*
:[quant]cn[ext][!] Affiche la [quant]-ième erreur suivante de la liste
qui inclut un nom de fichier. S'il n'y a aucun nom
de fichier, va à la [quant]-ième erreur suivante. Voir
|:cc| pour [!] et 'switchbuf'.
:[quant]cN[ext][!] *:cp* *:cprevious* *:cN* *:cNext*
:[quant]cp[revious][!] Affiche la [quant]-ième erreur précédente de la liste
qui inclut un nom de fichier. S'il n'y a aucun nom
de fichier, va à la [quant]-ième erreur suivante. Voir
|:cc| pour [!] et 'switchbuf'.
*:cnf* *:cnfile*
:[quant]cnf[ile][!] Affiche la première erreur dans le [quant]-ième
fichier suivant de la liste qui inclut un nom de
fichier. S'il n'y a aucun nom de fichier ou qu'il n'y
a pas de fichier suivant, va à la [quant]-ième erreur
suivante. Voir |:cc| pour [!] et 'switchbuf'.
*:crewind* *:cr*
:cr[ewind][!] [no] Affiche l'erreur numéro [no]. Si [no] est omis, la
PREMIÈRE erreur est affichée. Voir |:cc|.
*:cfirst* *:cfir*
:cfir[st][!] [no] Comme ":crewind".
*:clast* *:cla*
:cla[st][!] [no] Affiche l'erreur numéro [no]. Si [no] est omis, la
DERNIÈRE erreur est affichée. Voir |:cc|.
*:cq* *:cquit*
:cq[uit] Quitte Vim avec un code d'erreur, de sorte que le
compilateur ne compilera pas le même fichier à
nouveau.
*:cf* *:cfile*
:cf[ile][!] [ficherr] Lit le fichier d'erreurs et saute à la première.
Ceci est fait automatiquement lorsque Vim est lancé
avec l'option "-q". Vous pouvez utiliser cette
commande si vous ne sortez pas de Vim pendant la
compilation. Si vous donnez le nom du fichier
d'erreurs, l'option 'errorfile' sera fixé à [ficherr].
Voir |:cc| pour [!].
*:cg* *:cgetfile*
:cg[etfile][!] [ficherr]
Lit le fichier d'erreurs. Comme ":cfile", mais ne
saute pas à la première erreur.
*:cl* *:clist*
:cl[ist] [de] [, [a]] Liste toutes les erreurs valides |quickfix-valid|.
Si les nombres [de] et/ou [a] sont donnés, la plage
d'erreurs correspondante sera listée. Un nombre
négatif comptera à partir de la dernière erreur dans
l'ordre inverse, -1 désignant la dernière erreur.
Les paramètres de l'option 'switchbuf' seront
respectés lors d'un saut vers un autre tampon.
:cl[ist]! [de] [, [a]] Liste toutes les erreurs.
Si vous insérez ou supprimez des lignes, la position exacte de l'erreur sera
trouvée malgré tout la plupart du temps, car des marques cachées sont
utilisées. Quelquefois, quand la marque a été supprimée pour une raison ou
pour une autre, le message "line changed" est affiché pour vous avertir que la
position de l'erreur ne sera peut-être pas correcte. Si vous quittez Vim puis
le relancez, les marques seront perdues et les positions des erreurs ne seront
sans doute plus correctes.
=============================================================================
2. La fenêtre d'erreurs *quickfix-window*
*:cope* *:copen*
:cope[n] [hauteur] Ouvre une fenêtre pour afficher la liste d'erreurs
courante.
Si [hauteur] est donné, la fenêtre est mise à cette
hauteur (s'il y a de la place). Sinon, la fenêtre est
créée avec dix lignes de hauteur.
La fenêtre contiendra un tampon spécial, pour lequel
'buftype' vaudra "quickfix". Ne changez pas cela !
Si une fenêtre mise-au-point existe déjà, elle
deviendra la fenêtre courante. Il n'est pas possible
d'ouvrir une deuxième fenêtre mise-au-point.
*:ccl* *:cclose*
:ccl[ose] Ferme la fenêtre mise-au-point.
*:cw* *:cwindow*
:cw[indow] [hauteur] Ouvre la fenêtre mise-au-point lorsqu'il y a des
erreurs reconnues. Si la fenêtre est déjà ouverte et
qu'il n'y a pas d'erreurs reconnues, ferme la fenêtre.
Normalement, la fenêtre mise-au-point est placée en bas de l'écran. S'il y a
des partages verticaux, elle est placée tout en bas et à droite de l'écran.
Pour qu'elle occupe toujours toute la largeur de l'écran :Pour changer la place de la fenêtre, voir |window-moving|. Par exemple, pour
déplacer la fenêtre en haut, utilisez "CTRL-W K".
L'option 'winfixheight' sera activée, ce qui veut dire que la fenêtre
conservera sa taille la plupart du temps, indépendamment de 'winheight' et
'equalalways'. Vous pourrez changer la hauteur manuellement (p. ex., en tirant
la ligne d'état avec la souris).
Dans la fenêtre mise-au-point, chaque ligne est une erreur. Le numéro de ligne
équivaut au numéro de l'erreur. Vous pouvez utiliser ":.cc" pour sauter à
l'erreur sous le curseur. La saisie d'Entrée ou un double clic sur une ligne a
le même effet. Le fichier contenant l'erreur est ouvert dans la fenêtre
au-dessus de la fenêtre mise-au-point. Si une fenêtre existe déjà pour ce
fichier, elle est utilisée à la place. Si le tampon dans la fenêtre utilisée a
changé et que l'erreur est dans un autre fichier, le saut vers l'erreur
échouera. Vous devrez d'abord vous assurer que la fenêtre contient un tampon
qui peut être abandonné.
Quand la fenêtre mise-au-point a été remplie, deux événements d'autocommandes
sont déclenchés. D'abord, l'option 'filetype' est fixée à "qf", ce qui
déclenche l'événement FileType. Ensuite, l'événement BufReadPost est
déclenché. Cela peut être utilisé pour appliquer certaines actions à la liste
d'erreurs. Exemple :Ceci préfixe le numéro de ligne à chaque ligne. Notez l'utilisation de "\="
dans la chaîne de substitution de la commande ":s", qui est utilisé pour
évaluer une expression.
NOTE : Effectuer des changements dans la fenêtre mise-au-point n'a pas d'effet
sur la liste d'erreurs. 'modifiable' est désactivé afin d'éviter tout
changement. Si vous insérez ou supprimez des lignes malgré tout, la relation
entre le texte et le numéro de l'erreur est corrompue. Si c'est vraiment ce
que vous souhaitez, vous pouvez écrire le contenu de la fenêtre mise-au-point
dans un fichier et utilisez ":cfile" pour qu'il soit analysé et utilisé comme
la nouvelle liste d'erreurs.
=============================================================================
3. Utiliser plus d'une liste d'erreurs *quickfix-error-lists*
Jusqu'ici, nous avons supposé qu'il n'y avait qu'une seule liste d'erreurs. En
réalité, les dix dernières listes utilisées sont mémorisées. Quand une
nouvelle liste débute, les précédentes sont automatiquement conservées. Deux
commandes peuvent être utilisées pour accéder aux anciennes listes. Elles
permettent de fixer comme courante une des listes d'erreurs existantes.
*:colder* *:col* *E380*
:col[der] [quant] Va à une liste d'erreurs plus ancienne. Si [quant] est
donné, le fait [quant] fois. Si déjà à la liste
d'erreurs la plus ancienne, un message d'erreurs est
émis.
*:cnewer* *:cnew* *E381*
:cnew[er] [quant] Va à une liste d'erreurs plus récente. Si [quant] est
donné, le fait [quant] fois. Si déjà à la liste
d'erreurs la plus récente, un message d'erreurs est
émis.
Quand une nouvelle liste d'erreurs est ajoutée, elle devient la liste
courante.
Quand ":colder" a été utilisé et que ":make" ou ":grep" est appelé pour
ajouter une nouvelle liste d'erreurs, la liste la plus récente sera écrasée.
C'est particulièrement utile si vous utilisez ":grep" pour naviguer dans vos
fichiers |grep|. Si vous souhaitez conserver les listes d'erreurs les plus
récentes, utilisez d'abord ":cnewer 99".
=============================================================================
4. Utiliser ":make" *:make_makeprg*
*:mak* *:make*
:mak[e][!] [arguments] 1. Si l'option 'autowrite' est activée, écrit tout
tampon modifié.
2. Un nom de fichier d'erreurs est créé à partir de
'makeef'. Si 'makeef' ne contient pas "##", et
qu'un fichier du même nom existe déjà, il est
écrasé.
3. Le programme donné par 'makeprg' est lancé
(défaut : "make") avec [arguments] passé en option,
et la sortie est écrite dans le fichier d'erreurs
(pour Unix, elle est également envoyée sur
l'écran).
4. Le fichier d'erreurs est lu en utilisant
'errorformat'.
5. Si [!] n'est pas donné, saute à la première erreur.
6. Le fichier d'erreurs est supprimé.
7. Vous pouvez à présent accéder aux erreurs avec des
commandes comme |:cnext| et |:cprevious|, voir plus
haut.
Cette commande n'accepte pas de commentaire, tout
caractère '"' est considéré comme faisant partie des
arguments.
La commande ":make" exécute la commande donnée par l'option 'makeprg'. Ceci
est fait en passant la commande au shell donné par l'option 'shell'. Cela
revient presque à taper :
:!{makeprg} [arguments] {shellpipe} {ficherr}
Où : - {makeprg} désigne la chaîne donnée par l'option 'makeprg'. N'importe
quelle commande peut être utilisée, pas simplement `make`. Les
caractères '%' et '#' sont étendus comme habituellement sur la ligne de
commande. Vous pouvez utiliser "%<" pour insérer le nom du fichier
courant sans extension, ou "#<" pour insérer le nom du fichier
alternatif sans extension, par exemple : - [arguments] est tout ce qui est tapé après ":make" ;
- {shellpipe} désigne l'option 'shellpipe' ;
- {ficherr} désigne l'option 'makeef', où "##" est remplacé pour rendre
le nom unique.
L'expression spéciale "$*" peut être utilisée parmi les arguments de
{makeprg} si la commande requiert des caractères supplémentaires après ses
arguments. "$*" est alors remplacé par tous les arguments. Par exempleou simplement :"$*" peut être donné plusieurs fois, par exemple :L'option 'shellpipe' vaut ">" par défaut pour Amiga, MS-DOS et Win32. Cela
signifie que la sortie du compilateur est écrite dans un fichier et n'est pas
affichée directement à l'écran. Pour Unix, "| tee" est utilisée. La sortie du
compilateur est affichée sur l'écran et écrite dans un fichier en même temps.
Selon le shell utilisé, la valeur par défaut vaudra "|& tee" ou "2>&1| tee",
stderr sera donc inclus.
Si 'shellpipe' est vide, la partie {ficherr} sera omise. C'est utile pour les
compilateurs qui écrivent eux-mêmes un fichier d'erreurs (Aztec C sur Amiga,
par exemple).
==============================================================================
5. Utiliser ":grep" *grep* *lid*
Vim peut s'interfacer avec `grep` ou des programmes similaires (comme les
utilitaires ID GNU "id-utils") de la même manière qu'il s'intègre avec les
compilateurs (voir |:make| ci-dessus).
[Digression pour les unixiens : le nom de la commande Unix `grep` vient de
":g/re/p", où "re" est mis pour "Regular Expression", « expression
rationnelle ».]
*:gr* *:grep*
:gr[ep][!] [arguments] Comme ":make", mais utilise 'grepprg' au lieu de
'makeprg', et 'grepformat' au lieu de 'errorformat'.
*:grepa* *:grepadd*
:grepa[dd][!] [arguments]
Comme ":grep", mais au lieu de créer une nouvelle
liste d'erreurs, les correspondances sont ajoutées à
la liste courante. Exemple : La première commande crée une nouvelle liste d'erreurs
vide. La seconde exécute "grepadd" pour chaque tampon
listé. Notez l'utilisation de '!' pour éviter que
":grepadd" ne saute à la première erreur, ce qui n'est
pas permis avec |:bufdo|.
5.1. CONFIGURER `grep`
Si vous disposez d'un programme `grep` standard installé, la commande ":grep"
peut fonctionner correctement avec les valeurs par défaut. La syntaxe est très
similaire à la commande standard :Ceci recherchera la chaîne "zorglub" dans tous les fichiers d'extension ".c".
Les arguments de ":grep" sont en fait passés tels quels au programme `grep`,
vous pouvez donc utiliser toutes les options que votre version de `grep`
supporte.
Par défaut, ":grep" invoque `grep` avec l'option "-n" (donne le nom de fichier
et le numéro de ligne). Cela peut être changé avec l'option 'grepprg'. Vous
devrez modifier cette option si :
- vous utilisez un programme qui ne s'appelle pas "grep" ;
- vous devez appeler `grep` avec son chemin absolu ;
- vous souhaitez passer systématiquement d'autres options à `grep` (p. ex.,
pour des recherches insensibles à la casse).
Après l'exécution de `grep`, Vim analyse du résultat en utilisant l'option
'grepformat'. Cette option fonctionne pareillement à l'option 'errorformat'
-- voir cette dernière pour obtenir des détails. Vous devrez certainement
modifier 'grepformat' si la sortie de votre programme `grep` n'a pas un format
standard, ou si vous utilisez un autre programme avec un format spécial.
Après l'analyse syntaxique du résultat, Vim charge le premier fichier
contenant une correspondance et saute à la ligne appropriée, de la même façon
qu'il saute à une erreur de compilation en mode mise-au-point |quickfix|. Vous
pouvez alors utiliser les commandes |:cnext|, |:clist|, etc. pour voir les
autres correspondances.
5.2. UTILISER ":grep" AVEC LES UTILITAIRES ID XXX
Vous pouvez modifier le comportement de la commande ":grep" pour la faire
fonctionner avec les utilitaires ID GNU "id-utils" de cette façon :Ensuitefonctionnera comme vous le souhaitez (pour peu que vous ayez lancé `mkid`
d'abord :)
5.3. NAVIGUER DANS LE CODE SOURCE AVEC ":grep"
En utilisant la pile des listes d'erreurs conservée par Vim, vous pouvez
naviguer dans vos fichiers à la recherche d'une fonction spécifique ou des
fonctions qu'elles appellent. Par exemple, supposons que vous deviez ajouter
un argument à la fonction lire_fichier(). Vous pouvez alors entrer cette
commandepuis utiliser ":cn" pour parcourir la liste des correspondances et ajouter
l'argument. Au même endroit, vous devez trouver le nouvel argument d'une
fonction de plus haut niveau msg() et le changer lui aussi. Vous ferez :Pendant la modification des fonctions msg(), vous découvrez une autre fonction
qui doit obtenir l'argument d'un niveau supérieur. Vous pouvez utiliser
":grep" à nouveau pour trouver ces fonctions. Quand vous en avez fini avec une
fonction, vous pouvez utiliserpour revenir à la précédente.
Cette navigation fonctionne comme dans un arbre : ":grep" descend d'un niveau,
créant une liste de branches. ":colder" fait revenir au niveau précédent. Vous
pouvez alterner l'utilisation de ":grep" et de ":colder" pour atteindre tous
les emplacements possibles dans une navigation arborescente. Si vous suivez
cette méthode de façon rigoureuse, vous pourrez atteindre tous les
emplacements souhaités sans avoir besoin de les consigner.
=============================================================================
6. Sélectionner un compilateur *compiler-select*
*:comp* *:compiler*
:comp[iler] {nom} Fixe les options nécessaires pour fonctionner avec le
compilateur {nom}.
{uniquement si compilé avec la fonctionnalité |+eval|}
En pratique, cette commande :
- supprime la variable "current_compiler" ; *current_compiler*
- exécute ":runtime! compiler/{nom}.vim".
Pour écrire un greffon de compilateur, voir |write-compiler-plugin|.
C MANX D'AZTEC *quickfix-manx* *compiler-manx*
Pour utiliser Vim avec le compilateur Aztec C de Manx sur Amiga, voilà ce que
vous devriez faire :
- Fixer la variable d'environnement CCEDIT avec la commande :- Compiler avec l'option -qf. Si le compilateur trouve la moindre erreur, Vim
est lancé et le curseur positionné sur la première erreur. Le message
d'erreur sera affiché sur la dernière ligne. Vous pouvez sauter aux autres
erreurs avec les commandes mentionnées plus haut. Vous pouvez corriger les
erreurs et enregistrer le(s) fichier(s).
- Si vous quittez Vim normalement, le compilateur recompilera le même fichier.
Si vous quittez avec la commande ":cq", le compilateur se terminera : faites
ainsi si vous ne pouvez pas corriger l'erreur, ou si un autre fichier doit
être compilé en premier.
Il y a des restrictions au mode mise-au-point sur Amiga. Le compilateur écrit
uniquement les 25 premières erreurs dans le fichier d'erreurs (la
documentation de Manx ne précise pas comment en obtenir plus). Si vous voulez
accéder aux autres, vous devrez corriger quelques erreurs et quitter
l'éditeur. Après recompilation, vous aurez de nouveau jusqu'à 25 autres
erreurs.
Si Vim a été lancé par le compilateur, la commande ":sh" et certaines
commandes ":!" ne fonctionneront pas, car Vim s'exécute dans le même processus
que le compilateur, et l'entrée standard (stdin) ne sera pas interactive.
COMPILATEUR PYUNIT *compiler-pyunit*
En fait il ne s'agit pas d'un compilateur, mais d'un cadre applicatif pour
effectuer des tests unitaires en Python. Il est inclus dans la distribution
standard du langage à partir de la version 2.0. Si vous disposez d'une version
antérieure, vous pouvez le récupérer sur "http://pyunit.sourceforge.net/".
Lorsque vous lancez vos tests à l'aide de ce cadre applicatif, les erreurs
éventuelles sont analysées par Vim et vous sont présentées en mode
mise-au-point.
Malheureusement, il n'existe aucune méthode standard pour lancer les tests,
même si le script "alltests.py" semble être assez fréquemment utilisé. Les
valeurs utiles dans ce cas pour l'option 'makeprg' sont :Voir aussi "http://vim.sourceforge.net/tip_view.php?tip_id=280".
COMPILATEUR TEX *compiler-tex*
Inclus dans la distribution de Vim, le greffon de compilateur pour TeX
("$VIMRUNTIME/compiler/tex.vim") est censé gérer correctement toutes les
variantes de TeX. Si la variable "b:tex_flavor" ou "g:tex_flavor" (dans cet
ordre) existe, elle définit une variante de TeX pour ":make" (en fait, c'est
le nom de la commande à exécuter), et si aucune des deux variables n'existe,
la valeur par défaut sera "latex". Par exemple, si vous éditez
"chapitre2.tex", inclus (avec "\input") dans "mondocument.tex" -- écrit en
AmS-TeX : ... édition ...NOTE : Vous devez spécifier le nom du fichier à compiler en argument (pour que
le bon fichier soit traité quand vous éditez des fichiers inclus -- avec
"\input" ou "\include" -- ; une solution portable pour substituer "%" quand il
n'y a pas d'arguments serait la bienvenue). Cela ne fait pas partie de la
sémantique habituelle de ":make", mais vous pouvez spécifier le nom du fichier
sans extension ".tex", en voulant signifier ":make nomfich.dvi ou nomfich.pdf
ou nomfich.extension_du_résultat" selon le compilateur utilisé.
Variables utilisées :
---------------------
"b:tex_ignore_makefile" ou "g:tex_ignore_makefile"
Habituellement, quand un fichier "Makefile" ou "makefile" existe dans
le répertoire courant, Vim considère qu'il s'agit d'un signe indiquant
que l'utilisateur souhaite traiter ses fichiers (La)TeX avec `make`
(p. ex., parce qu'il dispose d'un ouvrage segmenté en plusieurs
fichiers réunis via un fichier principal -- auquel cas ":make" devrait
traiter le fichier principal indépendamment du fichier en cours
d'édition). Si ce n'est pas ce que vous souhaitez, vous pouvez fixer
une des variables ci-dessus avant de lancer ":compiler tex".
"b:tex_flavor" ou "g:tex_flavor"
Par défaut, ce greffon de compilateur suppose que vous utilisez LaTeX
(ce n'est pas le cas ? Pourquoi ?!) et le lance avec la commande
`latex`. Si ce n'est pas vrai pour vous, fixez "b:tex_flavor" ou
"g:tex_flavor" au nom de la commande que vous voulez utiliser.
NOTE : La syntaxe de la ligne de commande `latex` est choisie de façon à être
utilisable pour MikTeX (suggestion de Srinath Avadhanula) et pour teTeX
(vérifié Artem Chuprina). Le format d'erreur suggéré dans |errorformat-LaTeX|
est trop complexe pour fonctionner sur différents shells et SE, et ne permet
pas l'utilisation d'autres options TeX. Si votre version de TeX ne supporte
pas "-interaction=nonstopmode", merci de le signaler en indiquant les méthodes
alternatives pour activer "\nonstopmode" depuis la ligne de commande.
=============================================================================
7. Format des erreurs *error-file-format*
*errorformat* *E372* *E373* *E374*
*E375* *E376* *E377* *E378*
L'option 'errorformat' contient une liste des formats qui sont reconnus. Le
premier format qui correspond avec un message d'erreur est utilisé. Vous
pouvez ajouter plusieurs formats pour supporter les différents messages que
votre compilateur produit, ou au moins des entrées pour plusieurs
compilateurs. Voir |efm-entries|.
Chaque entrée dans 'errorformat' est une chaîne de style scanf qui décrit le
format. En premier lieu, vous devez savoir comment scanf fonctionne. Lisez la
documentation de votre compilateur C. Ci-dessous, vous trouverez les items '%'
que Vim comprend. Les autres sont invalides.
La virgule et la contre-oblique ('\') sont des caractères spéciaux dans
'errorformat'. Pour les gérer correctement, voir |efm-entries|. NOTE : "%%"
correspond à un "%" littéral, il n'a donc pas besoin d'être protégé par une
contre-oblique.
NOTE : Par défaut, la différence entre majuscules et minuscules est ignorée.
Si vous voulez que la casse soit respectée, ajoutez "\C" au motif |/\C|.
ITEMS DE BASE
%f nom de fichier (trouve une chaîne)
%l numéro de ligne (trouve un nombre)
%c numéro de colonne (trouve un nombre représentant la
colonne de caractère de l'erreur (1 tabulation =
1 colonne de caractère)
%v numéro de colonne virtuelle (trouve un nombre représentant
la colonne d'écran de l'erreur (1 tabulation =
8 colonnes d'écran)
%t type d'erreur (trouve un caractère simple)
%n numéro d'erreur (trouve un nombre)
%m message d'erreur (trouve une chaîne)
%r correspond au « reste » d'un message de fichier mono-ligne
%O/P/Q
%p ligne de pointage (trouve une séquence de '-', '.' ou ' '
et utilise la longueur pour le numéro de colonne)
%*{conv} toute conversion scanf non assignable
%% le caractère simple '%'
La conversion de "%f" dépend de la valeur courante de l'option 'isfname'.
Les conversions de "%f" et de "%m" doivent détecter la fin de la chaîne. Elle
devrait être suivie par un caractère qui ne peut pas être inclus dans la
chaîne. Tout le reste jusqu'à ce caractère est inclus. Mais quand le caractère
suivant est un '%' ou une contre-oblique, "%f" recherchera n'importe quel
caractère de 'isfname', et "%m" n'importe quoi. Si l'item "%f" ou "%m" est
arrivé à la fin, tout sera inclus jusqu'à la fin de la ligne.
Sur MS-DOS, MS-Windows et OS/2, un "C:" initial sera inclus dans "%f", même
quand "%f:" est utilisé. Cela signifie qu'un nom de fichier avec un seul
caractère alphabétique ne sera pas détecté.
La conversion de "%p" est normalement suivie par un '^'. C'est utilisé pour un
compilateur qui produit un ligne telle que
^
ou
---------^
pour indiquer la colonne de l'erreur. Cela peut être utilisé dans un message
d'erreur multi-lignes. Voir |errorformat-javac| pour un exemple utile.
CHANGER DE RÉPERTOIRE
Les caractères majuscules de conversion suivants sont appropriés à des chaînes
d'un format spécial. Il est possible d'utiliser l'un d'eux comme préfixe au
début d'un motif d'items simples séparé des autres par des virgules.
Certains compilateurs produisent des messages qui consistent en noms de
répertoires devant être préfixés à chaque nom de fichier lu par "%f" (GNU
make, par exemple). Les codes suivants peuvent être utilisés pour ces noms de
répertoires ; ils seront mémorisés dans une pile de répertoires interne.
*E379*
%D chaîne de format « entrée de répertoire » ; attend un "%f"
à la suite pour trouver le nom du répertoire
["Directory"]
%X chaîne de format « sortie de répertoire » ; attend un "%f"
à la suite
Lorsque vous définissez un format « entrée de répertoire » ou « sortie de
répertoire », le "%D" ou "%X" doit être donné au début de cette sous-chaîne.
Vim suivra les changements de répertoires et préfixera le nom du répertoire
courant à chaque nom de fichier erroné trouvé avec un chemin relatif. Voir
|quickfix-directory-stack| pour des détails, astuces et limitations à ce
sujet.
MESSAGES MULTI-LIGNES *errorformat-multi-line*
Il est possible de lire la sortie des programmes qui produisent des messages
multi-lignes (c.-à-d. qui occupent plus d'une ligne). Les préfixes utilisables
sont :
%E début d'un message d'erreur multi-lignes
%W début d'un message d'avertissement multi-lignes ["Warning"]
%I début d'un message d'information multi-lignes
%A début d'un message multi-lignes (quelconque) ["All"]
%C continuation d'un message multi-lignes
%Z fin d'un message multi-lignes
Ils peuvent utilisés avec '+' et '-', voir |efm-ignore| plus bas.
Exemple : votre compilateur donne ses messages d'erreurs dans le format
suivant (les numéros des lignes ne font pas partie de la sortie) :
1 Error 275
2 line 42
3 column 3
4 ' ' expected after '--'
Le format d'erreur approprié doit ressembler à :Et le message d'erreur |:clist| généré pour cette erreur :
1:42 col 3 error 275: ' ' expected after '--'
Autre exemple : votre interpréteur Python produit le message d'erreur suivant
(les numéros des lignes ne font pas partie de la sortie) :
1 ==============================================================
2 FAIL: testGetTypeIdCachesResult (dbfacadeTest.DjsDBFacadeTest)
3 --------------------------------------------------------------
4 Traceback (most recent call last):
5 File "unittests/dbfacadeTest.py", line 89, in testFoo
6 self.assertEquals(34, dtid)
7 File "/usr/lib/python2.2/unittest.py", line 286, in
8 failUnlessEqual
9 raise self.failureException, \
10 AssertionError: 34 != 33
11
12 --------------------------------------------------------------
13 Ran 27 tests in 0.063s
Supposons que vous souhaitiez que |:clist| ne vous donne que l'information
essentielle de ce message, à savoir :
5 unittests/dbfacadeTest.py:89: AssertionError: 34 != 33
Le format d'erreur approprié pourra alors être défini comme suit :NOTE : La chaîne "%C" est ici donnée avant le "%A" : comme l'expression
" %.%#" (qui représente l'expression rationnelle " .*") correspond à chaque
ligne débutant par un espace, elle englobe aussi la ligne 7 qui sans cela
déclencherait une erreur séparée. Les chaînes de format d'erreur sont toujours
analysées motif par motif jusqu'à ce que la première correspondance survienne.
NOM DE FICHIER SÉPARÉ *errorformat-separate-filename*
Ces préfixes sont utiles si le nom de fichier est donné une seule fois et que
de multiples messages qui se réfèrent à ce nom de fichier suivent.
%O message de fichier mono-ligne : recherche dans une
correspondance déjà établie ["Overread"]
%P message de fichier mono-ligne : empile le fichier "%f"
["Push"]
%Q message de fichier mono-ligne : dépile le dernier fichier
Exemple : soit un compilateur qui produise la sortie d'erreur suivante (sans
les numéros des lignes) :
1 [a1.tt]
2 (1,17) error: ';' missing
3 (21,2) warning: variable 'z' not defined
4 (67,3) error: end of file found before string ended
5
6 [a2.tt]
7
8 [a3.tt]
9 NEW compiler v1.1
10 (2,2) warning: variable 'x' not defined
11 (67,3) warning: 's' already defined
Cette sortie donne plusieurs messages pour chaque fichier encadré entre
crochets. Ces messages sont correctement analysés par un format d'erreur
comme :L'appel de |:clist| les affichera avec leurs noms de fichiers correspondants :
2 a1.tt:1 col 17 error: ';' missing
3 a1.tt:21 col 2 warning: variable 'z' not defined
4 a1.tt:67 col 3 error: end of file found before string ended
8 a3.tt:2 col 2 warning: variable 'x' not defined
9 a3.tt:67 col 3 warning: 's' already defined
Contrairement aux autres préfixes qui donnent tous des correspondances sur des
lignes entières, "%P", "%Q" et "%O" peuvent être utilisés pour correspondre
avec plusieurs motifs sur une même ligne. Il est ainsi possible de traiter des
messages de fichiers imbriqués comme dans cette ligne :
{"fich1" {"fich2" err1} err2 {"fich3" err3 {"fich4" err4 err5}}}
"%O" peut ensuite analyser les chaînes qui ne contiennent aucune information
de type « empiler/dépiler » un fichier. Voir |errorformat-LaTeX| pour un
exemple complet.
IGNORER ET UTILISER DES MESSAGES ENTIERS *efm-ignore*
Les codes '+' ou '-' peuvent être combinés avec les codes des lettres
majuscules décrits ci-dessus ; dans ce cas, ils doivent précéder la lettre,
p. ex., "%+A" ou "%-G" :
%- ignore cette correspondance multi-lignes
%+ inclut toute la correspondance dans la chaîne d'erreur "%m"
Le préfixe "%G" n'est utilisable que s'il est combiné avec '+' ou '-'. Il
effectue l'analyse des lignes contenant des informations générales, comme la
version du compilateur ou autres en-têtes qui peuvent être sautés.
%-G ignore ce message
%+G message général
CORRESPONDANCES DE MOTIFS
La notation de style scanf "%*[]" est supportée pour des raisons de
compatibilité ascendante avec les versions antérieures de Vim. De toute façon,
il est également possible de spécifier (à peu près) n'importe quelle
expression rationnelle supportée par Vim dans les chaînes de formats.
Comme les caractères spéciaux des expressions rationnelles peuvent faire
partie des chaînes ou des noms de fichiers ordinaires (et doivent donc être
déspécialisés en interne), les méta-symboles doivent être donnés avec un '%'
initial :
%\ le caractère simple '\' (NOTE : il doit être protégé
("%\\") dans une définition ":set errorformat=")
%. le caractère simple '.'
%# le caractère simple '*' (!)
%^ le caractère simple '^'
%$ le caractère simple '$'
%[ le caractère simple '[' pour une plage de caractères []
%~ le caractère simple '~'
Quand vous utilisez des classes de caractères dans les expressions (voir |/\i|
pour un sommaire), les termes englobés par le multi "\+" peuvent être écrits
dans la notation scanf "%*". Par exemple, "%\\d%\\+" ("\d\+", "n'importe
quel nombre") est équivalent à "%*\\d".
NOTE importante : Le groupage \(...\) de sous-correspondances ne peut pas
être utilisé dans les spécifications de format, il est réservé pour des
conversions internes.
ENTRÉES MULTIPLES DANS 'errorformat' *efm-entries*
Pour pouvoir reconnaître les sorties de plusieurs compilateurs, plusieurs
motifs de formats peuvent être entrés dans 'errorformat', séparés par des
virgules (NOTE : les blancs après la virgule seront ignorés). Le premier motif
qui correspond entièrement est utilisé. Si aucun ne convient, une
correspondance partielle avec le dernier motif sera utilisée, même si le nom
de fichier est supprimé et que l'erreur entière est utilisée comme message
d'erreur. Donc, s'il y a un motif qui peut correspondre à la sortie de
plusieurs compilateurs (même partiellement), placez-le après un autre qui est
plus restrictif.
Pour inclure une virgule dans un motif, faites-la précéder par une
contre-oblique (vous devez en saisir deux dans une commande ":set"). Pour
inclure une contre-oblique elle-même, spécifiez-en deux (quatre dans une
commande ":set"). Vous devez également protéger un espace par une
contre-oblique dans une commande ":set".
CORRESPONDANCES VALIDES *quickfix-valid*
Si une ligne ne correspond pas complètement avec une des entrées de
'errorformat', la ligne entière est mise dans le message d'erreur, et
est marquée comme « non valide ». Ces lignes sont sautées par les commandes
":cn" et ":cp" (à moins qu'il n'y ait aucune entrée valide). Vous pouvez
utiliser ":cl!" pour afficher tous les messages d'erreurs.
Si le format d'erreur ne contient pas de nom de fichier, Vim ne peut pas se
rendre au bon fichier. Vous devrez le faire à la main.
EXEMPLES
Le format du fichier produit par le compilateur Aztec sur Amiga est :
nomfich>noligne:nocolonne:typeerreur:noerreur:messageerreur
nomfich nom du fichier dans lequel l'erreur a été détectée
noligne numéro de la ligne où l'erreur a été détectée
nocolonne numéro de la colonne où l'erreur a été détectée
typeerreur type de l'erreur, normalement un simple 'E' ou 'W'
noerreur numéro de l'erreur (voir le manuel du compilateur)
messageerreur description de l'erreur
Ce format correspond avec cette entrée de 'errorformat' :Voici d'autres exemples pour des compilateurs C qui produisent des sorties
d'erreurs mono-lignes : Pour les messages d'erreurs d'Aztec C de Manx (scanf() ne
comprend pas [0-9]). Pour SAS C. Pour les compilateurs C génériques. Pour GCC. Pour GCC avec `gmake` (fusionnez les lignes !). Pour l'ancien compilateur SCO C (pre-OS5). Idem, avec le type et numéro de l'erreur. Pour GCC, avec quelques suppléments.
Vous trouverez des exemples complets pour le support de messages d'erreurs
multi-lignes plus bas, voir |errorformat-Jikes| et |errorformat-LaTeX|.
NOTE : Une contre-oblique ('\') devant un espace ou une double-apostrophe est
nécessaire pour la commande ":set". Il y a deux contre-obliques devant une
virgule : une pour la commande ":set" et une pour éviter que la virgule ne
soit reconnue comme un séparateur de formats d'erreurs.
FILTRER DES MESSAGES
Si vous avez un compilateur qui produit des messages d'erreurs qui ne
correspondent pas aux formats supportés, vous pouvez écrire un programme qui
traduise ces messages afin qu'ils le soient. Utilisez alors ce programme avec
la commande ":make", en modifiant l'option 'makeprg'. Par exemple :Les contre-obliques avant la barre verticale sont nécessaires afin que
celle-ci ne soit pas reconnue comme un séparateur de commandes. La
contre-oblique avant chaque espace est requise pour la commande ":set".
=============================================================================
8. La pile de répertoires *quickfix-directory-stack*
Le mode mise-au-point gère une pile pour mémoriser tous les noms de
répertoires extraits de la sortie de `make`. Pour GNU make c'est assez simple,
car il affiche toujours le chemin absolu de tous les répertoires dans lesquels
il entre et sort, sans distinction entre les changements obtenus avec une
commande `cd` dans le Makefile ou avec le commutateur "-C rép" (change de
répertoire avant de lire le Makefile). Il peut être utile d'utiliser le
commutateur "-w" pour obliger GNU make à afficher le répertoire de travail
avant et après traitement.
Il est plus difficile de déterminer le bon répertoire si vous n'utilisez pas
GNU make. Par exemple, AIX make n'affiche aucune information sur son
répertoire de travail. Dans ce cas, vous devrez améliorer vous-même le
Makefile. Dans le Makefile de lesstiff, il y a une commande qui affiche
"Making {cible} in {rep}". Le problème ici est qu'il n'y a pas de message
lors de la sortie d'un répertoire et que le chemin absolu n'est pas donné.
Pour résoudre le problème du chemin relatif et du message de « sortie de
répertoire » manquant, Vim utilise l'algorithme suivant :
1° Vérifier que le répertoire donné est un sous-répertoire du répertoire
courant. Si c'est le cas, l'enregistrer comme répertoire courant.
2° S'il ne s'agit pas d'un sous-répertoire du répertoire courant, vérifier
si c'est un sous-répertoire de l'un des répertoires parents.
3° Si le répertoire n'est toujours pas trouvé, Vim considère qu'il s'agit
d'un sous-répertoire de son propre répertoire courant.
De plus, Vim vérifie chaque fichier pour déterminer s'il existe réellement
dans les répertoires identifiés. Sinon, le fichier est recherché dans tous les
autres répertoires de la pile de répertoires (et NON dans la sous-arborescence
du répertoire !). S'il reste introuvable, Vim considère qu'il se trouve dans
son propre répertoire courant.
Cet algorithme est imparfait. Ces exemples supposent que `make` affiche des
informations sur l'entrée dans un répertoire de la forme "Making {cible} in
{rep}".
1. Supposons que vous ayez les fichiers et répertoires suivants :
./rep1
./rep1/fich1.c
./fich1.c
Si `make` traite le répertoire "./rep1" avant le répertoire courant et
qu'il y a une erreur dans le fichier "./fich1.c", vous obtiendrez le
chargement du fichier "./rep1/fich1.c" dans Vim.
La seule solution est d'avoir un message de « sortie de répertoire ».
2. Supposons que vous ayez les répertoires suivants :
./rep1
./rep1/rep2
./rep2
Voilà ce que vous obtiendrez :
SORTIE DE `make` RÉPERTOIRE DÉTERMINÉ PAR VIM
"Making all in rep1" ./rep1
"Making all in rep2" ./rep1/rep2
"Making all in rep2" ./rep1/rep2
Il est possible de résoudre ce problème en affichant le chemin absolu des
répertoires dans les messages d'« entrée de répertoire » ou de « sortie de
répertoire »...
Pour éviter ces problèmes, assurez-vous que les chemins absolus des
répertoires et les messages indiquant la sortie de ces répertoires est bien
affichée.
Exemple pour les fichiers Makefile Unix :
bib:
for nr in $(REPBIB); do \
(cd $$nr; echo "Entre dans '$$(pwd)'"; make); \
echo "Quitte le répertoire"; \
done
Ajoutezà votre option 'errorformat' pour supporter la sortie de ce Makefile.
NOTE : Vim ne vérifie pas si le nom de répertoire dans un message « sortie de
répertoire » est le répertoire courant. C'est pourquoi vous pouvez simplement
utiliser le message "Quitte le répertoire".
=============================================================================
9. Formats d'erreurs spécifiques *errorformats*
JIKES(TM) *errorformat-Jikes*
Jikes(TM) est un pseudo-compilateur Java publié par IBM Research qui génère
des messages d'erreurs multi-lignes simples.
Vous trouverez ci-dessous une entrée de 'errorformat' correspondant avec les
messages produits. Vous pouvez la placer dans votre fichier |vimrc| pour
remplacer les formats reconnus par défaut par Vim, ou bien utiliser |:set+=|
pour ajouter ce format à ceux par défaut.Jikes(TM) produit des messages d'erreurs mono-lignes lorsqu'il est invoqué
avec l'option "+E", qui correspondent avec l'entrée suivante :JAVAC *errorformat-javac*
Ces entrées de 'errorformat' semblent fonctionner correctement pour javac, qui
génère une ligne avec '^' pour indiquer la colonne de l'erreur :Ou :ANT *errorformat-ant*
Pour ant ("http://jakarta.apache.org/"), le format d'erreur ci-dessus doit
être modifié afin de prendre en compte le "[javac]" initial au début de chaque
ligne de sortie de javac :L'option 'errorformat' peut aussi être configurée pour supporter ant avec
javac ou jikes en même temps. Si vous utilisez jikes, vous devriez dire à ant
de spécifier l'option de commande +E de jikes pour générer des messages
d'erreurs mono-lignes. C'est ce que fait la deuxième ligne (d'un fichier
"build.xml") ci-dessous :L'entrée suivante de 'errorformat' permet de supporter ant avec javac ou jikes
indifféremment :JADE *errorformat-jade*
L'analyse syntaxique des erreurs de jade (voir "http://www.jclark.com/") est
facile :LATEX *errorformat-LaTeX*
Vous trouverez à la suite un exemple présentant comment spécifier une entrée
de 'errorformat' pour le système de mise en forme de texte (La)TeX, qui
affiche ses messages d'erreurs sur plusieurs lignes. La sortie des commandes
":clist", ":cc", etc. affiche ces lignes multiples en une ligne unique,
l'espace blanc initial est supprimé. Il devrait être facile de transposer le
format d'erreur de LaTeX donné ci-dessous à n'importe quel compilateur
produisant des messages d'erreurs multi-lignes.
Les commandes peuvent être placées dans un fichier |vimrc| ou tout autre
fichier de script Vim, p. ex. un script contenant des configurations
spécifiques à LaTeX qui est chargé uniquement lors de l'édition de sources
LaTeX.
Prenez soin de bien copier toutes les lignes de l'exemple (dans l'ordre
donné), après quoi vous pourrez supprimer les lignes de commentaires. Pour la
notation '\' au début de certaines lignes, voir |line-continuation|.
Préparez tout d'abord 'makeprg' de façon à ce que LaTeX
rapporte plusieurs erreurs, sans interruption après la
première :
Début des messages d'erreurs multi-lignes : Début des messages d'avertissements multi-lignes ; les deux
premières lignes incluent aussi le numéro de ligne.
Signification de certaines expressions rationnelles :
- "%.%#" (".*") correspond à une chaîne (possiblement vide) ;
- "%*\\d" ("\d\+") correspond à un nombre. Suites possibles des messages d'erreurs/avertissements ; la
première inclut aussi le numéro de ligne : Les lignes qui correspondent aux motifs suivants ne
contiennent pas d'information importante ; ne pas les inclure
dans les messages : En principe, on évite d'afficher les lignes vides ou composées
de seuls blancs : Les messages de sortie de LaTeX ne donnent pas les noms des
fichiers sources erronés à chaque ligne ; ils sont plutôt
spécifiés globalement, mis entre parenthèses.
Les motifs suivants essaient de trouver ces noms et de les
enregistrer dans une pile interne. Les motifs potentiels sont
recherchés sur les mêmes lignes (les uns après les autres), le
"%r" final indique que le « reste » de la ligne qui va être
analysée se poursuit jusqu'au prochain fin-de-ligne.
Recherche un nom de fichier mis entre parenthèses "(...)" ; ne
pas l'empiler puisque apparement ce fichier ne contient aucune
erreur : Empile un nom de fichier. Le nom est donné après '(' : Dépile le dernier nom de fichier enregistré quand un ')' est
trouvé :NOTE : Dans certains cas, les noms de fichiers dans les messages de sortie de
LaTeX ne peuvent pas être détectés correctement. L'analyse syntaxique peut
être bloquée par des parenthèses non appariées. L'exemple qui précède ne tend
à s'appliquer qu'aux cas les plus courants. Vous pouvez en personnaliser les
paramètres afin de définir vos préférences (par exemple, tous les ennuyeux
avertissements "Overfull ..." peuvent être exclus de la liste d'erreurs).
Plutôt que de filtrer la sortie du compilateur LaTeX, vous pouvez aussi lire
directement le fichier ".log" produit par le compilateur (La)TeX. Celui-ci
contient souvent des informations plus utiles sur les causes possibles des
erreurs. Néanmoins, pour analyser correctement un tel fichier, un filtre
externe sera nécessaire. Voir la description plus haut pour créer un tel
filtre qui soit supporté par Vim.
PERL *errorformat-Perl*
Dans "$VIMRUNTIME/tools", vous pourrez trouver le script "efm_perl.pl", qui
convertit les messages d'erreurs de Perl dans un format que le mode
mise-au-point comprend. Lisez le début de ce fichier pour savoir comment
l'utiliser.
vim:tw=78:ts=8:ft=help:norl: