Fehlerortnavigation in Vim Syntastic

10

Ich habe Syntastic in Vim installiert und es findet Fehler perfekt (hauptsächlich in Python-Code, an dem ich arbeite). Wenn ich normal in der Datei herumspringe, werden die Fehler in der Statusleiste angezeigt, wenn sich der Cursor über einer relevanten Zeile befindet.

Was ich nicht herausfinden kann, ist, wie man direkt zwischen den Fehlern navigiert.

Ich verstehe, dass syntastisch das Laden der Fehler in eine Vim-Standortliste ist und ich kann das mit erscheinen lassen :lopen, zu diesem Fenster wechseln, eine Zeile auswählen und drücken Enterund zum Hauptfenster in der rechten Zeile weitergeleitet werden.

Was ich jedoch tun möchte, ist, die Liste nicht geöffnet zu haben, einfach in der fehlerhaften Datei zu bearbeiten und eine Tastenkombination zu drücken, um zu der Stelle zu springen, an der sich die nächste Warnung / der nächste Fehler befindet.

Ist das möglich? Die Dokumente schlagen das vor :lNextund :lprevioussind relevant, aber sie verstehen mich E553: No more items.

Chris Jones
quelle

Antworten:

11

:lne[xt]und :lp[revious]sind die richtigen Verknüpfungen.

Ist :lN[ext]aber nicht dasselbe wie :lne[xt]: Es ist eine Alternative zu :lp[revious].

Die Meldung, die Sie erhalten, beruht auf der Tatsache, dass diese Befehle nicht umbrochen werden, wenn Sie den letzten oder den ersten Fehler erreichen.

Die Befehle , die Sie in Ihrer Frage sowohl Sprung zum vorherigen Fehler aufgelistet , aber die Chancen sind Sie bereits auf dem ersten Fehler sind und es gibt nichts vor . Verwenden Sie die richtigen Befehle, denken Sie daran, dass sie sich nicht umschließen und Sie werden gut sein.

Lesen Sie :h location-listfür eine vollständige Liste der Befehle.

romainl
quelle
Gibt es eine Möglichkeit, sie zum Wickeln zu bringen?
BallpointBen
Nein, es gibt keine Möglichkeit, sie zum Wickeln zu bringen. Es gibt verschiedene Wrapper-basierte Lösungen in diesem Thread und mehr in Form von Plugins. Mein eigenes Plugin vim-qf hat diese . Die Implementierung ist hier, wenn Sie nicht nur für ein paar Zuordnungen ein vollwertiges Plugin möchten.
Romainl
5

Wenn sich nur ein Problem in der Liste befindet, :llnavigieren Sie dorthin .

Hier ist eine Korrektur für Ihre .vimrc-Datei, mit der die Tasten nur bei einem Problem zugeordnet werden :lnextund :lprevordnungsgemäß funktionieren (indem Sie darauf springen). Ändern Sie die nmappings am Ende auf Ihre bevorzugte Tastenfolge.

(von 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
Greg Bell
quelle
Dies ist hässlich, wenn es ausgeführt wird, bevor die Standortliste zum ersten Mal ausgefüllt wird, oder nachdem keine Fehler in der Auffüllung aufgetreten sind. Siehe meine Antwort für eine Lösung.
Tom Hale
1

Geschrieben am 30. Oktober 2017

Ich würde empfehlen, das Plugin vim-unimpaired zu installieren

Dies ist auch ein guter Hinweis auf die Vim-Listen im Allgemeinen.

Syntastic verwendet die locationsListe. Befehle unten (mit einem Stern gekennzeichnete Zuordnungen stammen aus dem unimpaired.vimoben genannten Plugin).

Bildbeschreibung hier eingeben

Arcseldon
quelle
0

Wrap-Around vom ersten bis zum letzten Fehlerort zulassen (und umgekehrt):

" 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

Das fängt die folgenden Fehler ab:

E42: No Errors
E776: No location list

Und demütig sagt: Location list empty

(Gutschrift an lcd074 )

Tom Hale
quelle
Eigentlich gibt es eine weniger sich wiederholende Lösung, aber es könnte mit dem Echo "Standortliste leer" geschehen.
Tom Hale
0

Ich denke, die beste Möglichkeit, die Standortliste zu verwenden, ist die Verwendung des Denite + Unite-Location-Plugins: https://github.com/chemzqm/unite-location

Arthur Sult
quelle