Vim errorformat - PullRequest
       14

Vim errorformat

10 голосов
/ 06 октября 2009

Я прочитал документы, но запутался еще больше.
У меня есть следующая ошибка, сгенерированная компилятором:

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


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

Я знаю, как определить строку, в которой указана строка ошибки, но в моем списке ошибок появляется масса лишней бесполезной информации, и сообщение об ошибке разбивается на две строки, поэтому я предпочел бы объединить.

Мой начальный формат ошибки:

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

Так как мы находимся в этом, есть ли быстрый способ тестирования efm без необходимости постоянно запускать make?

1 Ответ

26 голосов
/ 06 октября 2009

Прежде всего, я говорю об отладке. К сожалению, нет особенно простого способа сделать это, но одна полезная возможность - запустить 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%.%#'
...