Vim:错误格式匹配所有内容

时间:2010-09-15 18:14:51

标签: vim errorformat

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

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

错误消息可以是任何内容(即它并不总是与AssertionError: .*.*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 个答案:

答案 0 :(得分:1)

你真的想花时间学习一种其他地方没有应用的模糊语言吗?除非有人付钱给你编写v​​im编译器插件,否则我不会(我喜欢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;
}

答案 1 :(得分:1)

这有用吗?

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

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

答案 2 :(得分:0)

怎么样......

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

答案 3 :(得分:0)

也许

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

检查

:help efm%>