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

6

我正在尝试将以下错误与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 行)? 如果需要,我可以使用标准 UNIX 工具来进行 makeprg
4个回答

1

这个可以工作吗?

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

在编程中,%-G%.%# 告诉 vim 忽略不符合其他模式的整行。


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

如何在vim中使用这个perl脚本? - Dilawar
只需键入:set makeprg=...。也就是说,无论您使用的是什么程序作为makeprg,都可以将其替换为此脚本。 - Andrew
我已经自作主张使用 use warnings; 替换了 -w 开关。 -w 开关几乎只在与不支持词法警告的 Perl 5.5 兼容时需要,但由于您的脚本使用了 open 语法,因此无论如何都需要 5.6 版本。(实际上,由于使用了 //, 它需要 5.10+ 版本。) - melpomene
你的代码只有在编译器将错误信息写入标准输出(stdout),而非标准错误(stderr)时才能正常工作。 - melpomene

0

关于...

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

这是我最初的代码,但它将每一行都匹配为一个“错误”,没有更多的信息。我在我的问题中发布的efm可以做到这一点,还可以检测“at”行的文件名、行号和列号。 - strager

0

可能

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

请检查这个

:help efm%>

虽然此代码片段可能解决问题,但附上解释真的有助于提高帖子的质量。请记住,您正在为未来的读者回答问题,而这些人可能不知道您提供代码建议的原因。 - dpr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接