2009-10-06 15 views
9

He leído los documentos, pero me confundí aún más.
Tengo el siguiente error generado por el compilador:Vim errorformat

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


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

Sé cómo detectar la línea donde se indica la línea de error, pero me da un montón de información inútil extra en mi ErrorList, y el mensaje de error es dividido en dos líneas, que preferiría fusionar.

Mi errorformat de partida es:

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

Dado que estamos en ello, ¿hay una manera rápida de probar la EFM, sin recurrir a ejecutar hacen todo el tiempo?

+1

¿Qué tipo de cosas es la información inútil? ¿Es algo del resultado de error del compilador que es agarrado erróneamente por uno de los especificadores? Eso podría explicar el mensaje de dos líneas, también? En caso de que esto sea útil, el valor predeterminado, tomado de la fuente (no pude encontrarlo en la ayuda): '"% f>% l:% c:% t:% n:% m,% f:% l:% t% * \\ D% n:% m,% f% l% t% * \\ D% n:% m,% * [^ \ "] \"% f \ "% * \\ D % l:% m,% f:% l:% m,% f |% l | % m "' – Cascabel

Respuesta

25

Antes que nada, hablo sobre la depuración. Desafortunadamente, no hay manera particularmente fácil de hacerlo, pero una posibilidad útil es ejecutar make y escupir la salida en un archivo y, a continuación:

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

En cuanto a hacer el errorformat, esto requiere un poco de ensayo y error . Puede usar% A,% C y% Z para mensajes de líneas múltiples y puede usar% -G para ignorar cosas. El orden es muy importante y tenga en cuenta que a veces el% C o incluso% Z vienen antes del% A! En su caso, es posible que pueda obtener un lugar con el beneficio a continuación. Tiendo a usar let &efm = y let &efm .= en lugar de configurarlo ya que no tiene que escaparse de todos los espacios o comillas y puede construirlo gradualmente. También es mucho más legible.

" 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 para la sugerencia de depuración En Windows, donde la utilidad cat no está disponible, se puede usar ': let & makeprg =" type outputfile.log "' – mMontu

+1

Dependiendo de dónde esté cambiando 'efm', puede quiero usar 'let & l: efm =' en lugar de 'let & efm =' para obtener el comportamiento 'setlocal'-equivalent. Estoy pensando especialmente en un plugin de tipo de archivo o archivo vim similar. –

+0

Resulta que esta es la primera realidad una buena razón para usar espacios en lugar de pestañas en mi código C++, si usa pestañas y la salida del compilador usa pestañas, el% p^fallará :( – Paul