简体   繁体   中英

Vim: Error format matches everything

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 (ie 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 (eg 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.

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
use warnings;
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;
}

Does this work?

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

The %-G%.%# tells vim to ignore entire lines that do not match the other patterns.

关于什么 ...

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

Maybe

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

Check this

:help efm%>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM