7

使用 vim 的 errorformat 语法,有没有办法在过滤结果中使用部分消息?

例如,除了错误本身之外,一些链接器错误没有任何明确的内容可以将它们区分为在线错误:

/path/to/foo.cpp:42: undefined reference to 'UnimplementedFunction'

或者

/path/to/foo.cpp:43: multiple definition of 'MultiplyDefinedFunction'

使用错误格式:

set efm=%f:%l:\ %m

会正确捕获并显示这两种情况,但会错误地匹配许多其他情况(任何以“[string]:[number]:”开头的行)。

或者,明确指定它们:

set efm=
set efm+=%f:%l:\ undefined\ reference\ to\ %m
set efm+=%f:%l:\ multiple\ definition\ of\ %m

消除了误报,但“消息”变得不那么有用了——不再包括实际错误(只是它之后的任何内容)。


我缺少处理这种情况的语法中的任何内容吗?

理想情况下,我希望能够说出以下内容:

set efm+=%f:%l:\ %{StartMessage}undefined\ reference\ to\ %*\\S%{EndMessage}
set efm+=%f:%l:\ %{StartMessage}multiple\ definition\ of\ %*\\S%{EndMessage}

... StartMessage 和 EndMessage 之间匹配的所有内容都用作错误消息。

4

2 回答 2

5

errorformat 也可以使用 vim 的正则表达式语法(尽管以一种相当尴尬的方式),这为我们提供了解决问题的方法。我们可以使用非捕获组和零宽度断言来要求这些信号短语的存在而不消耗它们。这然后允许%m拿起它们。作为普通的正则表达式语法,这个零宽度断言看起来像:

\%(undefined reference\|multiple definition\)\@=

但是为了在其中使用它,efm我们需要替换\by%\%by%%以及在:set一行中使用,我们需要转义反斜杠、空格和竖线,所以我们终于有了:

:set efm=%f:%l:\ %\\%%(undefined\ reference%\\\|multiple\ definitions%\\)%\\@=%m

有了那个错误文件

/path/to/foo.cpp:42: undefined reference to 'UnimplementedFunction'
/path/to/foo.cpp:43: multiple definition of 'MultiplyDefinedFunction'
notafile:123: just some other text

出来如下:copen

/path/to/foo.cpp|42| undefined reference to 'UnimplementedFunction'
/path/to/foo.cpp|43| multiple definition of 'MultiplyDefinedFunction'
|| notafile:123: just some other text
于 2016-04-30T19:27:08.203 回答
1

在这种情况下,我一直在使用 sed 重写输出,因为我想在快速修复窗口中获得一些非同质的任意输出。

你可以编写 make.sh 来触发 make (或任何你用来构建的东西)并修剪掉你不关心的东西:

make | sed '/undefined reference\|multiple definition/!d'

(删除不包含“未定义引用”或“多重定义”的行)

如果由于您关心的错误字符串的数量而变得过于笨拙,您可以做相反的事情并杀死您不关心的东西:

make | sed 's/some garbage\|other useless message//'

然后:set makeprg=make.sh在 vim

于 2016-04-30T18:47:55.657 回答