给定这样的C#编译器消息,当启用warnings-as-errors时:
File.cs(3,1415): error CS1572: Warning as Error: XML comment on 'FooLibrary.Foo.Foo()' has a param tag for 'foo', but there is no parameter by that name
我希望将errorformat
标记为警告,而不是输入错误。
我的errorformat
中已经有了这样的值:
%f(%l\\,%c):\ %trror\ %m^M
%f(%l\\,%c):\ %trror\ %m
(无论何时看到^M
,都知道它是我文件中的实际控制代码,但它不能很好地传输到Web上。只需指示C#编译器输出\r\n
而不仅仅是\n
,这是一种温和的滋扰。)
这是我第一次尝试:
%f(%l\\,%c):\ error\ %m: %tarning\ as\ Error:\ %m^M
%f(%l\\,%c):\ error\ %m: %tarning\ as\ Error:\ %m
Vim感到遗憾的是,它无法处理一个字符串中多次出现的%m
。
然后我开始喜欢包含断言的不寻常的正则表达式。这是我试过的:
%f(%l\\,%c):\ error\ %\\(%[A-Z0-9]%#:\ %tarning\ as\ Error:\ %[%^^M]%#%\\)%\\@=%m^M
%f(%l\\,%c):\ error\ %\\(%[A-Z0-9]%#:\ %tarning\ as\ Error:\ %[%^^M]%#%\\)%\\@=%m
这不起作用;它获得类型“C”(可能来自“CS1572”)和消息“W”(%t
应该消耗的值)。 (在其他一些实验中,省略%t
,证明有必要在断言中使用字符串的其余部分,否则它在那时停止了%m
的匹配。非常他们很奇怪。)
认识到它并没有将它们视为正则表达式组,因为它们可能是一种特殊的线性方式,然后我尝试颠倒断言并结束这一点:
%f(%l\\,%c):\ error\ %\\(%m^M%\\)%\\@=%[A-Z0-9]%#:\ %tarning\ as\ Error:\ %.%#^M
%f(%l\\,%c):\ error\ %\\(%m^M%\\)%\\@=%[A-Z0-9]%#:\ %tarning\ as\ Error:\ %.%#
不幸的是,这些也失败了,得到类型“C”而不是“警告”和(尽管最后让消息保持完整),将^M
留在字符串的末尾。
我已经用尽了我在errorformat
命令中可以想到的可能性;有没有其他可能解决这个问题,或者我是否需要运行另一个脚本来包装它,这将把格式变成Vim可以应付的东西?
(所有这些都是为了在quickfix列表中获得“警告”而不是“错误”。悲伤,不是吗?)
答案 0 :(得分:0)
如果你不适合
set efm=%f(%l\\,%c):\ error\ %[A-Z0-9]%#:\ %tarning\ as\ Error:\ %m
会丢失错误编号然后我建议您使用
set efm=%f(%l\\,%c):\ %m
并使用
对列表进行后处理function QFPostProc(location)
let qflist=[]
for entry in (a:location?getloclist(0):getqflist())
" Using the fact that “%tarning” can match only warnings
" thus unconditionally setting type to 'W'
" Replace 'W' with something like
" matchstr(entry.text, '\u\ze\a\+ as Error')
" if this is not true.
call add(qflist, extend(entry, {'type': 'W'}))
endfor
if a:location
call setloclist(0, qflist, 'r')
else
call setqflist(qflist, 'r')
endif
endfunction
。这应该被称为
:make | call QFPostProc(0)
或
:lmake | call QFPostProc(1)
答案 1 :(得分:0)
无法测试^ M的东西,但这适用于linux样式的行结尾:
set efm=%f(%l\\,%c):%*[^:]:\ %t%*[^:]:%m
并获取错误(警告)号码:
set efm=%f(%l\\,%c):\ error\ CS%n:\ %t%*[^:]:%m