4 votes

Comment faire pour que vim analyse mon message d'erreur de plusieurs lignes pour la fenêtre de correction rapide ?

Je veux exécuter mon application sous vim en utilisant make et je veux que le quickfix affiche mes erreurs.

J'ai donc ce format, qui commence d'abord par Error: et ensuite le nom du fichier, la ligne et la colonne séparés par : et ensuite, sur la ligne suivante, il y aura un message de plusieurs lignes sans formatage spécial, puis le message se terminera par ErrorEnd .

Voici donc un exemple :

Error: /somefile/something/something.c:12:123
SOME MESSAGE 
ANOTHER HELPFUL MESSAGE
ANOTHER MESSAGE
ErrorEnd

Je suis un peu perdu dans la documentation pour savoir comment faire correspondre ces lignes. Tout semble si confus et les exemples ne sont pas comme celui-ci. Je sais comment faire correspondre la première ligne, mais je ne sais pas comment faire correspondre les lignes suivantes au message d'erreur. La question est donc de savoir quelle serait la chaîne de format d'erreur qui pourrait tout analyser.

3voto

Ingo Karkat Points 61399

Vous avez raison, l'analyse des messages d'erreur de plusieurs lignes pour Quickfix est difficile. Je ne suis même pas sûr qu'il soit possible d'analyser les erreurs dans un bloc tel que individuel erreurs.

Une solution de contournement que j'ai utilisée pour les sorties d'erreur difficiles à gérer est d'ajouter une étape de transformation (en utilisant typiquement sed ) à 'makeprg' qui convertit les erreurs de plusieurs lignes en messages traditionnels d'une ligne par erreur ; quelque chose comme

Error: /somefile/something/something.c:12:123 SOME MESSAGE
Error: /somefile/something/something.c:12:123 ANOTHER HELPFUL MESSAGE
Error: /somefile/something/something.c:12:123 ANOTHER MESSAGE

dans votre cas.

3voto

lzap Points 5049

Extrait de la page d'aide de vim errorformat :

Multi-line messages             *errorformat-multi-line*

It is possible to read the output of programs that produce multi-line
messages, i.e. error strings that consume more than one line.  Possible
prefixes are:
    %E      start of a multi-line error message
    %W      start of a multi-line warning message
    %I      start of a multi-line informational message
    %A      start of a multi-line message (unspecified type)
    %>      for next line start with current pattern again |efm-%>|
    %C      continuation of a multi-line message
    %Z      end of a multi-line message
These can be used with '+' and '-', see |efm-ignore| below.

Using "\n" in the pattern won't work to match multi-line messages.

Example: Your compiler happens to write out errors in the following format
(leading line numbers not being part of the actual output):

     1  Error 275 
     2  line 42 
     3  column 3 
     4  ' ' expected after '--' 

The appropriate error format string has to look like this:
   :set efm=%EError\ %n,%Cline\ %l,%Ccolumn\ %c,%Z%m

Edit : Ah vous voulez dire erreur multi-ligne. C'est vrai. C'est plus difficile.

2voto

Ben Points 2765

Vous pouvez capturer plusieurs lignes de texte dans le message d'erreur en utilisant la commande %+ préfixe tel que décrit à :help efm-ignore en combinaison avec le spécificateur de format d'erreur multi-lignes %E , %C , %Z etc., décrits à l'adresse :help errorformat-multi-line . Dans votre exemple spécifique, la méthode suivante semble fonctionner :

let &l:efm='%EError: %f:%l:%c,%-ZErrorEnd,%+C%.%#'

Notez le %+C qui correspond à tout sur la ligne et l'ajoute au message d'erreur. Notez également comment j'ai dû mettre le %-Z article antes de cet élément pour qu'il soit utilisé, puisque le premier élément errorformat correspondant sera utilisé lors de l'analyse de la ligne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X