errorformat,其中类型位于消息的中间

时间:2012-12-10 02:12:33

标签: vim errorformat

给定这样的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列表中获得“警告”而不是“错误”。悲伤,不是吗?)

2 个答案:

答案 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