Vim错误格式:在消息字符串中包含表达式的一部分

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


%+ 有帮助吗?:help efm-ignore - 1983
2个回答

7
错误格式还可以使用vim的正则表达式语法(尽管方式有些别扭),这为我们提供了解决问题的方法。我们可以使用一个非捕获组和一个零宽断言来要求这些信号短语的存在而不消耗它们。然后,这允许%m将它们拾取起来。作为普通的正则表达式语法,这个零宽断言看起来像:
\%(undefined reference\|multiple definition\)\@=

但是为了在 efm 中使用它,我们需要将 \ 替换为 %\,将 % 替换为 %%,并且在 :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

1
我一直在使用sed来重写输出,以便在想要将任意输出(不一定是同质的)放入quickfix窗口的情况下使用。
你可以编写make.sh来启动make(或者你正在使用的构建工具),并删除你不关心的内容:
make | sed '/undefined reference\|multiple definition/!d'

(删除不包含“undefined reference”或“multiple definition”的行)

如果由于您关心的错误字符串数量过多而变得难以处理,您可以执行相反的操作,只删除您不关心的内容:

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

然后在vim中键入:set makeprg=make.sh。保留html,不做解释。

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