Ошибка определения местоположения в 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полный список команд.

romainl
источник
Есть ли способ заставить их обернуть?
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
Грег Белл
источник
Это некрасиво, если выполняется до того, как список местоположений будет впервые заполнен, или после заполнения без ошибок. Смотрите мой ответ для исправления.
Том Хейл
4

Поскольку :lnextи т. Д. Набирать утомительно (обычно вы хотите быстро выполнить итерацию по ним, плагин unimpaired.vim - Pairs of hand mapping mapsings обеспечивает (среди прочих) короткие ]lсопоставления).

Инго Каркат
источник
1

Написано 30 октября 2017

Я бы порекомендовал установить плагин vim-unimpaired

Это также отличная ссылка на списки vim в целом.

Syntastic использует locationsсписок. Команды ниже (отображения, отмеченные звездочкой, взяты из unimpaired.vimплагина, упомянутого выше).

введите описание изображения здесь

arcseldon
источник
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" Список местоположений пуст ".
Том Хейл,