2

给定这样的 C# 编译器消息,当打开警告作为错误时:

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标记为 type warning而不是 type error

我已经有这样的价值观errorformat

%f(%l\\,%c):\ %trror\ %m^M
%f(%l\\,%c):\ %trror\ %m

(当你看到^M时,知道它是我文件中的实际控制代码,但它不能很好地传输到网络。这足以表明 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 可以处理的格式?

(所有这些都是为了在快速修复列表中获得“警告”而不是“错误”这个词。可悲,不是吗?)

4

2 回答 2

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)
于 2012-12-10T04:05:26.173 回答
0

无法测试 ^M 的东西,但这适用于 linux 风格的行尾:

set efm=%f(%l\\,%c):%*[^:]:\ %t%*[^:]:%m

并获取错误(警告)编号:

set efm=%f(%l\\,%c):\ error\ CS%n:\ %t%*[^:]:%m
于 2012-12-10T04:05:39.277 回答