Vim: Bewegen Sie den Cursor an seine letzte Position

251

Ist es in (g) Vim möglich, den Cursor an seine vorherige Position zu bewegen (im normalen Modus)? Ideal wäre es, in der Liste der vorherigen Cursorpositionen hin und her zu wechseln. Aber auch nur zum letzten Ort zu wechseln würde ausreichen (so etwas wie cd -in Bash mit Verzeichnissen).

Hier ist eine kleine Demonstration:

line |1| <- cursor position
line 2
line 3
line 4

Und nehmen wir an, ich habe es getan 2j, so ist es jetzt:

line 1
line 2
line |3| <- cursor position
line 4

Jetzt möchte ich etwas (außer 2koffensichtlich) drücken , um zur ersten Position und möglicherweise zu den vorherigen Positionen zurückzukehren.

Idan K.
quelle

Antworten:

409

Der schnellste Weg ist, entweder zu treffen:

''

(zwei Apostrophe) oder:

``

(zwei Backticks). Beachten Sie, dass der Unterschied darin besteht, dass der Backtick an derselben Stelle in der Zeile angezeigt wird, während der Apostroph am Anfang der Zeile angezeigt wird. Auf einer britischen Tastatur ist der Apostroph leichter zugänglich, daher verwende ich diesen eher. Es gibt viele nützliche Markierungen wie diese, siehe :help mark-motions.

Für einige andere Bewegungen ( 2jglaube ich nicht) gibt es auch die Sprungliste, mit der Sie zwischen einer Reihe von Bewegungen hin und her navigieren können. CtrlOund CtrlImachen Sie diese Navigation, aber sehen Sie :help jump-motionsfür weitere Informationen.

DrAl
quelle
3
Eigentlich verhält sich keiner von denen genau so, wie ich es erwartet habe, aber ich denke, es ist nichts anderes verfügbar.
Idan K
1
@Idan K - wie gibt `` (Double Backtick) Ihnen nicht genau das, was Sie wollen? (Mit Ausnahme des Aspekts "Geschichte").
Dan
3
@Dan: Wenn ich es im obigen Beispiel versuche, sehe ich dieses Verhalten: Ich stehe in Zeile 1, drücke dann jzweimal hintereinander (jetzt bin ich in Zeile 3) und drücke dann auf Double Backtick, um zu Zeile 1 zu gelangen, und ich erwarte es zu Linie 2 zu bewegen.
Idan K
2
Ich denke, Sie müssen sich bewegen (2j oder so), dann bearbeiten (oder eine Aktion ausführen, um den Text zu ändern) und dann '' verwenden, um zur vorherigen Position zurückzukehren. Es ist nicht logisch, "2j" zu verwenden, nichts zu tun und zur vorherigen Position zurückzukehren
Asenar
8
@IdanK Die Jumplist wird nur aktualisiert (dh die vorherige Cursorposition wird aufgezeichnet), wenn Sie einen tatsächlichen "Sprung" verwenden, bei dem es sich (glaube ich) um einen anderen i j k lBewegungsbefehl als die Bewegungen handelt. (Die vollständige Liste aus den Hilfedokumenten lautet "'"', "`", "G", "/", "?", n", "N", "%", "(", ")", "[[", "]]", "{", "}", ":s", ":tag", "L", "M", H" and the commands that start editing a new file.) Nein, dies wird nicht "rückgängig gemacht" 2joder ähnliches, aber es funktioniert für fast alles andere. Dies ist sinnvoll, da 2jet al. haben bereits einfache Inversionen ( 2kusw.), während die anderen dies nicht tun.
Kyle Strand
61

Sie können auch verwenden g;und g,in der Liste Ihrer vorherigen Bearbeitungsorte vorwärts und rückwärts verschieben .

Auf Tastaturen außerhalb der USA

Bei meinen Schweizer und deutschen Tastaturlayouts ;erfordert das unbequeme Tippen die Verwendung der ShiftTaste. Daher habe ich g-als bequemeren Alias ​​für g;in definiert $MYVIMRC:

" Map g- as an alias for g;
nnoremap g- g;
Serge Stroobandt
quelle
Obwohl mir das sehr gefällt, springt es nur zwischen Änderungen in einer Datei. Wenn Sie Puffer 1 und dann Puffer 2 bearbeiten, springt er nicht zurück zu Puffer 1.
thouliha
39

Warum hat niemand das Problem mit DrAls Antwort herausgefunden ? Das ''oder ``wird das ursprüngliche Problem dieses Beitrags nicht lösen! Diese beiden Befehle funktionieren bei einigen Cursorbewegungen wie nicht2j , zumindest für mich. Es wird Neulinge verwirrender machen.

Das Verhalten von ''oder ``und CtrlIoder CtrlObasiert auf der Sprungliste. Das 2jwird die Positionsänderungen nicht in der Sprungliste speichern, so dass dieser Befehl nicht funktioniert 2j.

''oder ``wechseln Sie zwischen der letzten Position und der aktuellen Position. CtrlIund CtrlOarbeiten Sie den Sprunglistenverlauf durch.

g;und g,bewegen Sie sich durch Bearbeitungspositionen, die auch sehr häufig verwendet werden.

ZhaoGang
quelle
1
Vielen Dank für den Hinweis! Ich frage mich, was dann für Fälle wie funktioniert 2j?
33

Direkt aus der Hilfe (: Hilfe springen):

: ju [mps] Druckt die Sprungliste (kein Bewegungsbefehl). {nicht in Vi} {nicht verfügbar ohne die Jumplist | + Feature}

                          *jumplist*

Sprünge werden in einer Sprungliste gespeichert. Mit den Befehlen STRG-O und STRG-I können Sie vor älteren Sprüngen zu Cursorpositionen und wieder zurück gehen. So können Sie die Liste nach oben und unten verschieben. Für jedes Fenster gibt es eine separate Sprungliste. Die maximale Anzahl von Einträgen ist auf 100 festgelegt. {Ohne die Jumplist | + nicht verfügbar Feature}

Facundo Casco
quelle