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

Jer*_*lai 7 vim errorformat

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

例如,除了错误本身之外,一些链接器错误没有任何明确的区别将它们区分为行上的错误:

/path/to/foo.cpp:42: undefined reference to 'UnimplementedFunction'
Run Code Online (Sandbox Code Playgroud)

要么

/path/to/foo.cpp:43: multiple definition of 'MultiplyDefinedFunction'
Run Code Online (Sandbox Code Playgroud)

使用错误格式:

set efm=%f:%l:\ %m
Run Code Online (Sandbox Code Playgroud)

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

或者,明确指定它们:

set efm=
set efm+=%f:%l:\ undefined\ reference\ to\ %m
set efm+=%f:%l:\ multiple\ definition\ of\ %m
Run Code Online (Sandbox Code Playgroud)

消除误报,但'消息'变得不那么有用 - 不再包含实际错误(只是在它之后的任何内容).


我缺少什么语法来处理这种情况?

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

set efm+=%f:%l:\ %{StartMessage}undefined\ reference\ to\ %*\\S%{EndMessage}
set efm+=%f:%l:\ %{StartMessage}multiple\ definition\ of\ %*\\S%{EndMessage}
Run Code Online (Sandbox Code Playgroud)

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

Geo*_*edy 5

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

\%(undefined reference\|multiple definition\)\@=
Run Code Online (Sandbox Code Playgroud)

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

:set efm=%f:%l:\ %\\%%(undefined\ reference%\\\|multiple\ definitions%\\)%\\@=%m
Run Code Online (Sandbox Code Playgroud)

有了这个错误文件

/path/to/foo.cpp:42: undefined reference to 'UnimplementedFunction'
/path/to/foo.cpp:43: multiple definition of 'MultiplyDefinedFunction'
notafile:123: just some other text
Run Code Online (Sandbox Code Playgroud)

出来如下: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
Run Code Online (Sandbox Code Playgroud)