2009-10-06 2 views
9

私はドキュメントを読みましたが、さらに混乱しました。
私は、コンパイラによって生成され、次のエラーがあります。Vim errorformat

  rot; 
     ^
"cpp\c1.cpp", line 13: error(114): identifier 
      "rot" is undefined 


1 error detected in the compilation of "c1.cpp". 

私はエラー行が指定されているラインを検出する方法を知っているが、私は私のerrorlistに余分役に立たない情報の負荷を取得し、エラーメッセージがあるが2つの行に分かれています。私はマージしたいと思っています。

私の出発エラーフォーマットは次のとおりです。

:set efm=\"%f\"\\,\ line\ %l:\ error(%n):\ %m 

我々はそれをしているので、すべての時間を作る実行するために頼ることなく、EFMをテストする簡単な方法はありますか?

+1

どのようなものが無駄な情報ですか?誤って指定子の1つをつかんでいる実際のコンパイラエラー出力からのものですか?それは2行のメッセージを説明するかもしれませんか?これが役に立つ場合は、ソースから取得したデフォルト値(ヘルプ内で見つけられませんでした):%f>%l:%c:%t:%n:%m、%f:% %d%n%m%%%%%%%%%%%%%%%\% %l:%m、%f:%l:%m、%f |%l | %m "' – Cascabel

答えて

25

まず、デバッグについて説明します。残念ながら、そこにそれを行うための、特に簡単な方法は何だが、一つの有用な可能性が、その後makeを実行して唾出力をファイルにすることです:

:let &makeprg="cat ~/outputfile.log" 
:make 

エラーフォーマットを作りに関しては、これは試行錯誤のビットを必要としません。複数行のメッセージに対して%A、%C、%Zを使用できます。%-Gを使用すると、内容を無視できます。順序は非常に重要であり、時には%Cまたは%Zが%Aよりも前に来ることに注意してください。あなたの場合は、下のefmでどこかに行くことができるかもしれません。すべてのスペースや引用符をエスケープする必要がないので、私はlet &efm =let &efm .=を使うのではなく、徐々にビルドすることができます。また、はるかに読みやすくなっています。

" Start of the multi-line error message (%A), 
" %p^ means a string of spaces and then a^to 
" get the column number 
let &efm = '%A%p^' . ',' 
" Next is the main bit: continuation of the error line (%C) 
" followed by the filename in quotes, a comma (\,) 
" then the rest of the details 
let &efm .= '%C"%f"\, line %l: error(%n): %m' . ',' 
" Next is the last line of the error message, any number 
" of spaces (' %#': equivalent to ' *') followed by a bit 
" more error message 
let &efm .= '%Z %#%m' . ',' 
" This just ignores any other lines (must be last!) 
let &efm .= '%-G%.%#' 
+6

+1デバッグヒントWindowsのcatユーティリティが利用できない場合、 ':let&makeprg =" type outputfile.log "' – mMontu

+1

'efm'をどこで変更するかによって、私は特にファイルタイプのプラグインや同様のvimファイルを考えています –

+0

これは本当に最初のことであることが分かります。私のC++コードでタブの代わりにスペースを使用する良い理由は、タブを使用してコンパイラの出力にタブを使用すると、%p ^は失敗します。 – Paul