繁体   English   中英

错误格式,其中类型位于消息的中间

[英]errorformat where the type is in the middle of the message

给定这样的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标记为类型warning而不是error类型。

我的错误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”而不是“ warning”,并且(尽管使消息完整无缺)最后在字符串末尾加上了^M

我已经尽我所能在errorformat命令中想到的可能性了。 还有其他解决方案吗,还是我需要运行另一个脚本来包装它,从而将格式转换成Vim可以应付的东西?

(在快速修复列表中获得“警告”而不是“错误”一词的全部。难过,不是吗?)

如果你不满意

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)

无法测试^ M的东西,但是这适用于linux样式行结尾:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM