Ошибка определения местоположения в Vim Syntastic


11

Я установил Syntastic в Vim, и он отлично находит ошибки (в основном в коде Python, над которым я работаю). Если я обычно прыгаю в файле, я вижу ошибки в строке состояния, когда курсор находится над соответствующей строкой.

Что я не могу понять, так это как перемещаться между ошибками.

Я понимаю, что syntastic загружает ошибки в список местоположений Vim, и я могу сделать так, чтобы они появлялись :lopen, переключались в это окно, выбирали строку, нажимали Enterи переносились в главное окно в правой строке.

Однако я хотел бы не открывать список, просто отредактировать файл с ошибками и нажать сочетание клавиш, чтобы перейти к следующему предупреждению / ошибке.

Это возможно? Документы предполагают, что :lNextи :lpreviousактуальны, но они меня достали E553: No more items.

Ответы:


12

:lne[xt]и :lp[revious]правильные ярлыки.

Но :lN[ext]это не то же самое :lne[xt], что альтернатива :lp[revious].

Полученное сообщение связано с тем, что эти команды не переносятся при достижении последней или первой ошибки.

Команды, которые вы указали в своем вопросе, оба переходят к предыдущей ошибке, но, скорее всего, вы уже на первой ошибке, и ничего раньше . используйте правильные команды, имейте в виду, что они не переносятся, и вы будете в порядке.

Читайте :h location-listполный список команд.


Есть ли способ заставить их обернуть?
BallpointBen

Нет, нет способа заставить их завернуться. В этой теме есть различные решения, основанные на оболочках, и больше в виде плагинов. Мой плагин Vim-QF имеет те . Реализация здесь, если вы не хотите полноценный плагин только для пары сопоставлений.
Ромен

6

Если в списке только одна проблема, :llперейдите к ней.

Вот исправление для вашего .vimrc, которое заставит ключи сопоставляться :lnextи :lprevработать правильно в случае только одной проблемы (путем перехода к ней). Измените nmappings в конце на предпочитаемую вами последовательность клавиш.

https://github.com/scrooloose/syntastic/issues/32 )

" Fix syntastic error jumping
function! <SID>LocationPrevious()
  try
    lprev
  catch /^Vim\%((\a\+)\)\=:E553/
    llast
  endtry
endfunction

function! <SID>LocationNext()
  try
    lnext
  catch /^Vim\%((\a\+)\)\=:E553/
    lfirst
  endtry
endfunction

nnoremap <silent> <Plug>LocationPrevious    :<C-u>exe 'call <SID>LocationPrevious()'<CR>
nnoremap <silent> <Plug>LocationNext        :<C-u>exe 'call <SID>LocationNext()'<CR>
nmap <silent> e[  <Plug>LocationPrevious
nmap <silent> e]  <Plug>LocationNext

Это некрасиво, если выполняется до того, как список местоположений будет впервые заполнен, или после заполнения без ошибок. Смотрите мой ответ для исправления.
Том Хейл



0

Разрешить переход от первого до последнего места ошибки (и наоборот):

" Allow :lprev to work with empty location list, or at first location
function! <SID>LocationPrevious()
  try
    lprev
  catch /:E553:/
    lfirst
  catch /:E\%(42\|776\):/
    echo "Location list empty"
  catch /.*/
    echo v:exception
  endtry
endfunction

" Allow :lnext to work with empty location list, or at last location
function! <SID>LocationNext()
  try
    lnext
  catch /:E553:/
    lfirst
  catch /:E\%(42\|776\):/
    echo "Location list empty"
  catch /.*/
    echo v:exception
  endtry
endfunction

Это ловит следующие ошибки:

E42: No Errors
E776: No location list

И покорно говорит: Location list empty

(Кредит lcd074 )


На самом деле, есть менее повторяющееся решение, но оно может быть сделано с `echo" Список местоположений пуст ".
Том Хейл,

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.