6

我正在尝试将以下错误与efm

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

错误消息可以是任何内容(即它并不总是与AssertionError: .*or.*Error: .*格式匹配)。一般格式为:

errormessage
    at filename:line:column

我的问题是错误消息与任何行匹配;我需要将错误消息限制为仅一行,并且仅在其后跟匹配的“at”行时才匹配。

我尝试了以下方法efm

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

这几乎可以工作,但除了错误之外,它还匹配状态行(例如,错误之前和之后的非错误)。我怎样才能强制%E%m ... %Z总共只有两行(一条用于错误消息,一条用于at行)?makeprg如果需要,我可以使用标准的 UNIX 工具。

4

4 回答 4

1

您真的想花时间学习一种在其他任何地方都没有应用的晦涩的模式语言吗?除非有人付钱给你写 vim 编译器插件,否则我不会(而且我喜欢 vim!)。由于您愿意打开工具箱,只需在检查器周围编写一个包装器并输出一个易于解析的格式。例如:

#!/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;
}
于 2010-09-17T21:19:58.493 回答
1

这行得通吗?

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

%-G%.%# 告诉 vim 忽略与其他模式不匹配的整行。

于 2011-01-26T18:05:54.653 回答
0

关于什么 ...

set efm=%E%m,%Z\ \ \ \ at\ %f:%l:%c
于 2010-09-15T22:58:25.573 回答
0

也许

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

检查这个

:help efm%>
于 2018-11-02T17:16:27.353 回答