使用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之间匹配的所有内容用作错误消息。
答案 0 :(得分:3)
errorformat也可以使用vim的正则表达式语法(虽然以一种相当尴尬的方式),它为我们提供了解决问题的方法。我们可以使用非捕获组和零宽度断言来要求存在这些信号短语而不消耗它们。然后,这允许%m
选择它们。作为普通的正则表达式语法,这个零宽度断言看起来像:
\%(undefined reference\|multiple definition\)\@=
但是为了在efm
中使用它,我们需要将\
替换为%\
而将%
替换为%%
并用于{{1}我们需要转义反斜杠,空格和垂直条,所以我们最终得到:
: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
答案 1 :(得分:1)
在这样的情况下,我一直在使用sed来重写输出,我希望在quickfix窗口中获得一些不必要的任意输出。
您可以编写make.sh来触发make(或者您正在构建的任何内容)并修剪掉您不关心的内容:
make | sed '/undefined reference\|multiple definition/!d'
(删除不包含'未定义引用的行'或多重定义')
如果由于你关心的错误字符串的数量而变得过于不合适,你可以做反过来,只是杀掉你不关心的东西:
make | sed 's/some garbage\|other useless message//'
然后在{vim
中:set makeprg=make.sh