2010-09-15 10 views
5

Próbuję dopasować następujący błąd z efm:Vim: Format Error dopasowuje wszystko

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

komunikat o błędzie może być cokolwiek (to nie zawsze odpowiadają AssertionError: .* lub .*Error: .* formatów). Ogólny format:

errormessage 
    at filename:line:column 

Moim problemem jest to, że komunikat o błędzie mecze dowolny linia; Muszę ograniczyć komunikat o błędzie tylko do jednej linii i pasować tylko wtedy, gdy jest po niej pasująca linia "at".

Próbowałem następujących efm:

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

To prawie działa, ale pasuje do linii statusu (np niebędące błędy przed i po wystąpieniu błędu) oprócz błędów. Jak mogę wymusić, aby %E%m ... %Z było tylko dwoma liniami (jeden dla komunikatu o błędzie, a drugi dla linii at)? W razie potrzeby mam dostęp do standardowych narzędzi UNIX dla makeprg.

Odpowiedz

0

Co o ...

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

To jest to, co miałem na początku, ale to pasuje do każdej linii jako "błąd" bez dodatkowych informacji. "Efm", który napisałem w moim pytaniu, robi to, ale również wykrywa nazwę pliku oraz numery linii i kolumn linii "at". – strager

1

Czy naprawdę chcesz spędzić czas nauki języka niejasne wzór wniosku, że nie ma nigdzie indziej? Dopóki ktoś nie płaci ci za napisanie wtyczek vim-kompilatora, nie zrobiłbym (i kocham vima!). Ponieważ chcesz otworzyć przybornik, po prostu napisz opakowanie do sprawdzania i wypakuj łatwy do przeanalizowania format. Np .:

#!/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

Jak korzystać z tego skryptu perl w vim? – Dilawar

+0

Po prostu ': ​​set makeprg = ...". Oznacza to, że niezależnie od programu używanego jako 'makeprg', po prostu zastąp go tym skryptem. – Andrew

1

Czy to działa?

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

% -G%.% # Mówi vimowi, aby ignorował całe linie, które nie pasują do innych wzorów.

Powiązane problemy