2

warnings-as-errors がオンになっていると、次のような 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

type errorではなくtype warningerrorformatとしてマークしたいと思います。

私はすでに次のような値を持っていますerrorformat:

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

( . ^M_ _\r\n\n

これが私が最初に試したことです:

%f(%l\\,%c):\ error\ %m: %tarning\ as\ Error:\ %m^M
%f(%l\\,%c):\ error\ %m: %tarning\ as\ Error:\ %m

Vim は、1 つの文字列内で複数回出現する を処理できないという事実を嘆いていました%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 に答える