views:

39

answers:

2

I am trying to match the following error with efm:

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

The error message can be anything (i.e. it doesn't always match the AssertionError: .* or .*Error: .* formats). The general format is:

errormessage
    at filename:line:column

My problem is that the error message matches any line; I need to restrict the error message to one line only, and only match if it's followed by a matching "at" line.

I have tried the following efm:

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

This almost works, but it matches status lines (e.g. non-errors before and after the error) in addition to the errors. How can I force %E%m ... %Z to be only two lines total (one for the error message, and one for the at line)? I have access to the standard UNIX tools for makeprg if needed.

A: 

What about ...

set efm=%E%m,%Z\ \ \ \ at\ %f:%l:%c
too much php
This is what I had initially, but this matches every line as an "error" with no more information. The `efm` I posted in my question does this but also detects the file name and line and column numbers of the "at" line.
strager
A: 

Do you really want to spend your time learning an obscure pattern language that has no application anywhere else? Unless someone is paying you to write vim compiler plug-ins, I wouldn't (and I love vim!). Since you're willing to open the toolbox, just write a wrapper around your checker and spit out an easy-to-parse format. Eg:

#!/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;
}
Andrew