Erro de navegação no local no Vim Syntastic


11

Eu tenho o Syntastic instalado no Vim e ele encontra erros perfeitamente (principalmente no código Python em que estou trabalhando). Se eu pular normalmente no arquivo, vejo os erros na barra de status quando o cursor está sobre uma linha relevante.

O que não consigo descobrir é como navegar diretamente entre os erros.

Entendo que o sintático está carregando os erros em uma lista de localizações do Vim e posso fazê-lo aparecer :lopen, alternar para essa janela, escolher uma linha e clicar Entere ser levado para a janela principal na linha direita.

O que eu gostaria de fazer, porém, não é ter a lista aberta, basta editar o arquivo com erros e pressionar um atalho de teclado para pular para onde quer que esteja o próximo aviso / erro.

Isso é possível? Os documentos sugerem isso :lNexte :lprevioussão relevantes, mas eles me entendem E553: No more items.

Respostas:


12

:lne[xt]e :lp[revious]são os atalhos corretos.

Mas :lN[ext]não é o mesmo que :lne[xt]: é uma alternativa para :lp[revious].

A mensagem que você recebe deve-se ao fato de esses comandos não serem contornados quando você alcança o último ou o primeiro erro.

Os comandos listados na sua pergunta saltam para o erro anterior, mas é provável que você já esteja no primeiro erro e não há nada antes . use os comandos corretos, lembre-se de que eles não se espalham e você será bom.

Leia :h location-listpara obter uma lista completa de comandos.


Existe uma maneira de fazê-los embrulhar?
usar o seguinte

Não, não há como fazê-los embrulhar. Existem várias soluções baseadas em wrapper nesse encadeamento e mais na forma de plug-ins. Meu próprio plugin vim-qf possui esses . A implementação está aqui se você não quiser um plugin completo apenas para alguns mapeamentos.
Romainl 29/07/19

6

Se houver apenas um problema na lista, :llnavegará até ele.

Aqui está uma correção para o .vimrc que fará com que as chaves sejam mapeadas :lnexte :lprevfuncionem corretamente no caso de apenas um problema (saltando para ele). Altere os nmappings no final para sua sequência de teclas preferida.

(em 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

Isso é feio se executado antes da lista de locais ser preenchida pela primeira vez ou depois da população sem erros. Veja minha resposta para uma correção.
Tom Hale



0

Permita o contorno do primeiro ao último local do erro (e vice-versa):

" 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

Isso captura os seguintes erros:

E42: No Errors
E776: No location list

E humildemente diz: Location list empty

(Crédito para lcd074 )


Na verdade, existe uma solução menos repetitiva, mas poderia ser feita com o `eco" Lista de localizações vazias "`.
Tom Hale

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.