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.