Vim errorformat:在消息字符串中包含部分表达式

Vim errorformat:在消息字符串中包含部分表达式,vim,errorformat,Vim,Errorformat,使用vim的errorformat语法,有没有办法在过滤结果中使用部分消息 例如,某些链接器错误没有任何明确的内容来区分它们是否为行上的错误,错误本身除外: /path/to/foo.cpp:42: undefined reference to 'UnimplementedFunction' 或 使用以下错误格式: set efm=%f:%l:\ %m 将正确捕获并显示这两种情况,但会错误地匹配许多其他情况(以“[string]:[number]:”开头的任何行) 或者,明确指定这两者:

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

例如,某些链接器错误没有任何明确的内容来区分它们是否为行上的错误,错误本身除外:

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


使用以下错误格式:

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之间匹配的所有内容都被用作错误消息。

我一直在使用sed重写输出,在这种情况下,我希望在quickfix窗口中获得一些不一致的任意输出

您可以编写make.sh来激发make(或您用来构建的任何东西),并删除您不关心的内容:

make | sed '/undefined reference\|multiple definition/!d'
(删除不包含“未定义引用”或“多个定义”的行)

如果由于您关心的错误字符串的数量太多,这会变得太不舒服,那么您可以做相反的事情,只杀死您不关心的东西:

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

然后
:在vim中设置makeprg=make.sh
errorformat还可以使用vim的正则表达式语法(尽管方式相当笨拙),这为我们提供了问题的解决方案。我们可以使用非捕获组和零宽度断言来要求存在这些信号短语而不使用它们。然后允许
%m
拾取它们。作为普通正则表达式语法,此零宽度断言如下所示:

\%(undefined reference\|multiple definition\)\@=
但是为了在
efm
中使用它,我们需要将
\
替换为
%\
,将
%
替换为
%
,并且在
中使用:设置
行,我们需要避开反斜杠、空格和竖条,因此我们最终拥有:

: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

%+
有帮助吗<代码>:帮助efm忽略
/path/to/foo.cpp|42| undefined reference to 'UnimplementedFunction'
/path/to/foo.cpp|43| multiple definition of 'MultiplyDefinedFunction'
|| notafile:123: just some other text