7

vim の errorformat 構文で、メッセージの一部を使用して結果をフィルタリングする方法はありますか?

例として、一部のリンカ エラーには、エラー自体以外に、エラーとして区別するための明示的な行がありません。

/path/to/foo.cpp:42: undefined reference to 'UnimplementedFunction'

また

/path/to/foo.cpp:43: multiple definition of 'MultiplyDefinedFunction'

次のエラー形式を使用します。

set efm=%f:%l:\ %m

これらの両方を正しくキャッチして表示しますが、他の多くのケース ("[string]:[number]: " で始まる任意の行) と誤って一致します。

または、両方を明示的に指定します。

set efm=
set efm+=%f:%l:\ undefined\ reference\ to\ %m
set efm+=%f:%l:\ multiple\ definition\ of\ %m

誤検知は削除されますが、「メッセージ」はあまり役に立たなくなります。実際のエラーは含まれなくなります (その後にあるものは何でも)。


この状況に対処するために不足している構文はありますか?

理想的には、次のようなことを言えるようになりたいです。

set efm+=%f:%l:\ %{StartMessage}undefined\ reference\ to\ %*\\S%{EndMessage}
set efm+=%f:%l:\ %{StartMessage}multiple\ definition\ of\ %*\\S%{EndMessage}

... StartMessage と EndMessage の間で一致したすべてがエラーのメッセージとして使用されます。

4

2 に答える 2

5

errorformat は、vim の正規表現構文を使用することもできます (やや厄介な方法ではありますが)。これにより、問題の解決策が得られます。非キャプチャグループとゼロ幅アサーションを使用して、これらのシグナリング フレーズを消費せずに存在を要求できます。これにより、%mがそれらをピックアップできるようになります。単純な正規表現構文として、このゼロ幅アサーションは次のようになります。

\%(undefined reference\|multiple definition\)\@=

しかし、それを使用するには、 byとbyefmを置き換える必要があり、行で使用するには、バックスラッシュ、スペース、垂直バーをエスケープする必要があるため、最終的には次のようになります。\%\%%%:set

:set efm=%f:%l:\ %\\%%(undefined\ reference%\\\|multiple\ definitions%\\)%\\@=%m

それでエラーファイル

/path/to/foo.cpp:42: undefined reference to 'UnimplementedFunction'
/path/to/foo.cpp:43: multiple definition of 'MultiplyDefinedFunction'
notafile:123: just some other text

で次のようになります:copen

/path/to/foo.cpp|42| undefined reference to 'UnimplementedFunction'
/path/to/foo.cpp|43| multiple definition of 'MultiplyDefinedFunction'
|| notafile:123: just some other text
于 2016-04-30T19:27:08.203 に答える