2010-09-15 9 views
5

Estoy tratando de coincidir con el siguiente error con efm:Vim: formato de error coincide con todo lo

AssertionError: 1 == 2 
    at /home/strager/projects/blah/blah.js:13:37 

El mensaje de error puede ser cualquier cosa (es decir, que no siempre coincide con los AssertionError: .* o .*Error: .* formatos). El formato general es:

errormessage 
    at filename:line:column 

Mi problema es que el mensaje de error coincide con ninguna línea; Necesito restringir el mensaje de error a una sola línea, y solo coincido si va seguido de una línea "a" coincidente.

He intentado el siguiente efm:

set efm=%Z\ \ \ \ at\ %f:%l:%c,%E%m 
" %Z at %f:%l:%c,%E%m 

Esto casi funciona, pero coincide con líneas de estado (por ejemplo, no son errores antes y después del error), además de los errores. ¿Cómo puedo forzar que %E%m ... %Z tenga solo dos líneas en total (una para el mensaje de error y otra para la línea at)? Tengo acceso a las herramientas estándar de UNIX para makeprg si es necesario.

Respuesta

0

... ¿Qué hay de

set efm=%E%m,%Z\ \ \ \ at\ %f:%l:%c 
+0

Esto es lo que tenía inicialmente, pero esto coincide con cada línea como un "error" sin más información. El 'efm' que publiqué en mi pregunta lo hace, pero también detecta el nombre del archivo y los números de línea y columna de la línea" at ". – strager

1

¿Realmente quiere gastar su tiempo en aprender un lenguaje de patrones oscura que no tiene aplicación en otro sitio? A menos que alguien te pague por escribir complementos de compilador vim, yo no (¡y me encanta vim!). Dado que está dispuesto a abrir la caja de herramientas, simplemente escriba un envoltorio alrededor de su comprobador y escuche un formato fácil de analizar. Por ejemplo:

#!/usr/bin/perl -w 

use strict; 

open my $fh, '-|', 'compiler', @_ or die $!; 

my $last_line = <$fh> // exit; 
while (defined(my $line = <$fh>)) { 
    my($file, $l, $c) = $line =~ /^ at (.+?):(\d+):(\d+)$/; 
    print "$file:$l:$c: $last_line" if defined($file); 
    $last_line = $line; 
} 
+0

¿Cómo usar este script perl en vim? – Dilawar

+0

Just ': set makeprg = ...'. Es decir, cualquiera que sea el programa que estaba usando como 'makeprg', simplemente reemplácelo con este script. – Andrew

1

¿Funciona?

set efm=%Z\ \ \ \ at\ %f:%l:%c,%E%m,%-G%.%# 

El% -G%.% # Vim dice ignorar líneas enteras que no coinciden con los otros patrones.

Cuestiones relacionadas