"Find next" in Vim


535

Um in Vim nach zu suchen cake, würde ich eingeben /cake, aber der Cursor springt zur ersten Übereinstimmung, wenn ich die Eingabetaste drücke. Gibt es einen Vim-Befehl analog zu "find next"?


33
Gewöhne dich an die Verwendung :help. :help /Zeigt Hilfe zur Suche an und die Antwort auf Ihre Frage wird nur ein kleines Stück weiter unten auf der Seite angezeigt.
Chris Morgan

Antworten:


876

Es ist nfür das nächste und Nfür das vorherige.

Und wenn Sie die umgekehrte Suche mit ?(zum Beispiel ?cake) anstelle von verwenden /, ist es umgekehrt.

Wenn es auf Ihrem System installiert ist, sollten Sie versuchen, den vimtutorBefehl von Ihrem Terminal aus auszuführen. Dadurch wird ein Tutorial der grundlegenden Vim-Befehle gestartet.

Rob Wells Beratung über *und #ist auch sehr relevant.



Gibt es eine Möglichkeit, zum nächsten Spiel zu springen (nicht in der aktuellen Zeile)?
user13107

@ user13107: n und N arbeiten mit dem gesamten Puffer / der gesamten Datei. Sie sind nicht auf die aktuelle Zeile beschränkt.
Xavier T.

@ XavierT. jede Idee, wie ich eine feste Anzahl von Ergebnissen in der Suche springen kann. Ich meine zum Beispiel zur 10. passenden Linie springen
GP Cyborg

@GPcyborg: nWie bei den meisten vim-Operatoren kann eine Nummer vorangestellt werden, um den Befehl zu wiederholen. Wenn Sie eingeben 10n, wird das 10. Ergebnis (nach dem ersten) angezeigt. Es funktioniert auch für alle Bewegungsoperatoren, die gerne 3j3 Zeilen nach unten gehen.
Xavier T.

210

Die nützlichste Verknüpfung in Vim, IMHO, ist der *Schlüssel.

Setzen Sie den Cursor auf ein Wort und *drücken Sie die Taste, um zur nächsten Instanz dieses Wortes zu springen.

Der #Schlüssel macht dasselbe, springt jedoch zur vorherigen Instanz des Wortes.

Es ist wirklich eine Zeitersparnis.


6
Und falls es nicht offensichtlich war, nund führen NSie vorwärts und rückwärts durch die *Spiele, sobald Sie gedrückt haben *. (Oder Sie können einfach weiter drücken *, um vorwärts oder #rückwärts zu gehen, aber die Verwendung dieser verschobenen Tasten ist im Allgemeinen nicht optimal.)
Herbert Sitz

3
@Herbert, eigentlich bringen dich n und N nicht "vorwärts" und "rückwärts" bzw. Wie oben erwähnt, ist n das nächste und N das vorherige . Die Steuerung der Vorwärts- und Rückwärtssuche erfolgt durch Angabe der Suche mit der Taste '/' und der Taste '?' Taste oder mit der Taste '*' und der Taste '#'.
Rob Wells

Ich denke nicht, dass * so nützlich ist ... die meiste Zeit suche ich nach einem Fragment eines Wortes (zum Beispiel einem Teil eines Funktionsnamens). Ich möchte nicht /Func, lasse mich dazu bringen SomeFuncund drücke dann '*', um zur nächsten Instanz zu gelangen, SomeFuncwenn die nächste Instanz von in Funcist SomeOtherFunc.
weberc2

Schlimmer noch, mit C ++ finde ich, dass es nicht vom Methodenaufruf zur Methodenimplementierung geht, weil /\<foo\>es nicht übereinstimmt"className::foo()"
puk

84

Als ich anfing, musste ich mir eine Demo ansehen .

So suchen Sie in Vim

  1. Art /
  2. Typ Suchbegriff zB "var"
  3. Drücken Sie enter
  4. für die nächste Instanz drücken Sie n(für die vorherige N )

2
Die Eingabe *ist falsch. Dh eine Datei aa aaa. Suche /aa, du musst übereinstimmen. Beim Drücken der ersten Übereinstimmung *ändert sich der Suchbegriff.
Bernhard

1
n ist nicht 'next', sondern "letzte Suche wiederholen". Wenn Sie also? Var eingeben, wird von Ihrer aktuellen Position aus nach oben nach 'var' gesucht. Und 'N' ist tatsächlich "letzte Suche in entgegengesetzter Richtung wiederholen", also würde in diesem Beispiel von der aktuellen Position aus nach unten nach 'var' gesucht.
Rob Wells



13

Wie bereits erwähnt, gibt es verschiedene Möglichkeiten zur Suche:

/pattern
?pattern
* (and g*, which I sometimes use in macros)
# (and g#)

Plus, navigieren prev / next mit Nund n.

Sie können Ihren Suchverlauf auch bearbeiten / abrufen, indem Sie die Suchaufforderung mit aufrufen /und dann mit C-p/ wechseln C-n. Noch nützlicher ist q/, dass Sie zu einem Fenster gelangen, in dem Sie im Suchverlauf navigieren können.

Ebenfalls zu berücksichtigen ist der alles entscheidende 'hlsearch'( :hlszu aktivierende Typ ). Dies erleichtert das Auffinden mehrerer Instanzen Ihres Musters erheblich. Vielleicht möchten Sie Ihre Streichhölzer sogar besonders hell machen mit:

hi Search ctermfg=yellow ctermbg=red guifg=...

Aber dann könnten Sie mit konstanten gelben Übereinstimmungen auf Ihrem gesamten Bildschirm verrückt werden. So werden Sie oft feststellen, dass Sie verwenden :noh. Dies ist so häufig, dass eine Zuordnung in Ordnung ist:

nmap <leader>z :noh<CR>

Ich erinnere mich leicht an diese, zda ich ständig getippt habe /zz<CR>(was ein seltenes Ereignis ist, das schnell zu tippen ist), um meine Hervorhebung zu löschen. Aber das :nohMapping ist viel besser.


2
Wenn Sie sich inspiriert fühlen q/, sollten Sie auch damit spielen q:. Beide sind sehr praktisch! (Nicht wirklich mit dieser Frage verbunden.)
Micah Elliott

Danke, Micah. Ich wusste bereits über 'q:' Bescheid, obwohl ich es nicht so oft benutze. Aber 'q /' wurde in meiner Vim-Ausbildung völlig vermisst, und ich denke, es wird viel Verwendung finden.
Stabledog

2

Wenn Sie Ctrl+ drücken, Enternachdem Sie etwas wie "/ wordforsearch" gedrückt haben, finden Sie das Wort "wordforsearch" in der aktuellen Zeile. Drücken Sie dann nfür das nächste Spiel. Drücken Sie Nfür das vorherige Spiel.


1
"Wenn wir eine Suche ausführen, scannt Vim von der aktuellen Cursorposition nach vorne und stoppt bei der ersten gefundenen Übereinstimmung." Wie Practical Vim betont.
Bass Chuck
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.