Wie gehe ich zum nächsten grep-Ergebnis?

7

Ich verwende grep, um Funktionsvorkommen in einem Projekt zu finden.

:grep "set_val" *

Geht aus vim und gibt aus:

code.py:68:        self._device.set_val('Level', new_level)
code.py:84:        self._device.set_val("Mode", "Remote")
Press ENTER or type command to continue

Ich drücke die Eingabetaste und bin bei code.py:68welchem ​​das erste Mal vorkommt.

Wie bewege ich mich zu anderen Ereignissen?

TheMeaningfulEngineer
quelle
1
Wie wäre es, das QF-Fenster zu öffnen?
Kent

Antworten:

21

:grep/ :vimgrepBeide verwenden die Quickfix-Liste, um Standorte zu speichern. Wie Sie bemerkt haben, springt vim automatisch zum ersten Vorkommen (verwenden Sie !, um dieses Verhalten zu vermeiden). Verwenden Sie einfach :cnext, um zum nächsten Speicherort in der Quickfix-Liste zu gelangen.

Quickfix-Befehle

  • :cnext/ :cpreviousum den Quickfix in der Quickfix-Liste vorwärts und rückwärts zu navigieren
  • :cfirst/ :clastum zum Anfang und Ende der Quickfix-Liste zu springen
  • Verwenden Sie :copendiese Option, um das Quickfix-Fenster zu öffnen. Verwenden Sie <cr>diese Option, um zu einem Eintrag zu springen
  • Verwenden Sie :cclosediese Option, um das Quickfix-Fenster zu schließen
  • Verwenden Sie :ccdiese Option , um den aktuellen Fehler anzuzeigen.
  • :colder/ :cnewerum ältere / neuere Quickfix-Listen zu überspringen

Ich würde empfehlen, dass Sie Zuordnungen für :cnextund erstellen :cprevious. Ich persönlich benutze unimpaired.vim , das ]q& [qMappings für :cnextund bereitstellt :cprevious.

Wenn Sie möchten, dass das Quickfix-Fenster automatisch geöffnet wird, geben Sie Folgendes in Ihr Feld ein vimrc:

augroup autoquickfix
    autocmd!
    autocmd QuickFixCmdPost [^l]* cwindow
    autocmd QuickFixCmdPost    l* lwindow
augroup END

Zu diesem Thema gibt es eine Vimcasts- Episode : Durchsuchen Sie mehrere Dateien mit: vimgrep .

Projektweite Suche und Ersetzung

Wenn Sie :grep/ :vimgrepals Möglichkeit verwenden, eine projektweite Suche und Ersetzung durchzuführen, empfehle ich Ihnen, :cdo/ :cfdo(in Vim 7.4.980+) zu verwenden.

:grep 'foo'
:cfdo %s/foo/bar/g|w

Wenn Ihre Version von Vim nicht haben :cdo/ :cfdogeben Sie die folgenden Befehle in der vimrcDatei zur Verfügung zu stellen :Cdo/ :Cfdoalternative Befehle.

if !exists(':cdo')
  command! -nargs=1 -complete=command Cdo try | sil cfirst |
        \ while 1 | exec <q-args> | sil cn | endwhile |
      \ catch /^Vim\%((\a\+)\)\=:E\%(553\|42\):/ |
      \ endtry

  command! -nargs=1 -complete=command Cfdo try | sil cfirst |
        \ while 1 | exec <q-args> | sil cnf | endwhile |
      \ catch /^Vim\%((\a\+)\)\=:E\%(553\|42\):/ |
      \ endtry
endif

Verwenden eines alternativen Programms für :grep

Manchmal grepist es nicht gut genug für Ihre Suchanforderungen. Sie können Ihr :grepProgramm über die 'grepprg'Einstellung ändern (müssen möglicherweise auch geändert 'grepformat'werden). Persönlich verwende ich ripgrep, indem ich Folgendes zu meiner vimrcDatei hinzufüge, wie in rgder Manpage angegeben:

set grepprg=rg\ --vimgrep
set grepformat^=%f:%l:%c:%m

Hinweis: Möglicherweise möchten Sie ein -SFlag verwenden, z. B. die set grepprg=rg\ -S\ --vimgrepSuche nach "intelligenten Groß- und Kleinschreibung" (Suche ohne Berücksichtigung der Groß- und Kleinschreibung, wenn alle Kleinbuchstaben verwendet werden).

Jetzt :grepwird verwendet, um rgzu suchen. zB :grep foo -t js.

Es gibt einige alternative Grep-Programme, die Sie sich ansehen sollten: ack , ag , ripgrep und git grep( Fugitive.vim bietet :GgrepWrapper)

Weitere Hilfe finden Sie unter:

:h :grep
:h 'grepprg'
:h quickfix
:h :cnext
:h :copen
:h :ccl
:h :cc
:h :colder
:h :cdo
:h :cfdo
Peter Rincker
quelle
Danke für die tolle Antwort. Ihr Code zum automatischen Öffnen des Quickfix-Fensters funktioniert, aber für mich öffnet er sich und ich muss dann Befehle verwenden, um dorthin zu springen (Strg + W und Abwärtspfeil). Kann ich eine Zeile hinzufügen, um den Cursor nach dem automatischen Öffnen automatisch in das Quickfix-Fenster zu springen? Vielen Dank. -Asaf
Asaf
Wenn Sie :cwindow/ :copeninnerhalb des QuickFixCmdPostautocmd-Ereignisses verwenden, wird der aktuelle Puffer nach dem Auslösen wiederhergestellt. Sie können dem Fenster einen beliebigen :wincmd boder einen beliebigen Fensterbefehl hinzufügen autocmd, das Fenster wird jedoch wiederhergestellt. Dies wird in angedeutet :h autocmd-use. Wenn Sie darüber nachdenken, ist dieses Verhalten sinnvoll, da möglicherweise mehrere Autocmds an ein Ereignis angehängt sind, die alle bestimmte Annahmen wie den aktuellen Puffer haben. Ich kann mir vorstellen, dass der Weg, um das Problem zu erzwingen, darin besteht, dies in Ihren Quickfix-Befehl zu packen. zB:command! Grep -nargs=+ grep <args> | cwindow
Peter Rincker