Wie springe ich zum Speicherort meiner letzten Bearbeitung?

68

Ich ändere oft in der Mitte einer großen Datei, ggspringe nach oben, um etwas zu überprüfen, und stelle dann fest, dass ich vergessen habe, eine Marke zu setzen, an der ich gerade bearbeitete. Gibt es eine eingebaute Möglichkeit, zum Ort der zuletzt geänderten Zeile zu springen?

bdesham
quelle

Antworten:

84

Der `.Befehl bringt Sie zu Ihrer letzten Änderung.

Das `geht zu einer Marke und .ist eine "spezielle" Marke, die automatisch an die Position gesetzt wird, an der die letzte Änderung vorgenommen wurde. Sehen Sie :help `.für einige weitere Informationen.

Es gibt auch ``welche, die Sie dorthin zurückbringen, wo sich der Cursor befand, bevor Sie Ihren letzten Sprung gemacht haben. Siehe : Hilfe`` für weitere Informationen.

Eine weitere nützliche Marke ist `^; Dies ist die Position, an der sich der Cursor zuletzt befand, als der Einfügemodus gestoppt wurde. Sehen :help `^.

Sehen Sie :help mark-motionsfür einige weitere allgemeine Informationen über die Verwendung von Marken (darunter auch einige andere „spezielle“ Markierungen , die automatisch eingestellt werden).

howardh
quelle
7
Sie können auch g;und verwenden g,, um zwischen Positionen in der Änderungsliste zu wechseln. Siehe :h g;und:h g,
Peter Rincker
3
Sie können auch '(Apostroph) anstelle von `(Backtick) verwenden.
Sparhawk
21

Hier ist ein anderer Ansatz, der zu Ihrem vorgegebenen Szenario passt und zu der Stelle springt, an der Sie sich unmittelbar vor dem befanden gg(nicht zu der zuletzt geänderten Zeile).

Verwenden CtrlO

Wenn Sie drücken gg, wird Ihre alte Cursorposition auf die Sprungliste verschoben . Von :help jumplist:

Sprünge werden in einer Sprungliste gespeichert. Mit dem Befehl CTRL-Ound CTRL-Ikönnen Sie zu Cursorpositionen vor älteren Sprüngen und wieder zurück springen. So können Sie die Liste nach oben und unten verschieben. Für jedes Fenster gibt es eine eigene Sprungliste. Die maximale Anzahl von Einträgen ist auf 100 festgelegt.

[…]

Wenn Sie einen Sprungbefehl verwenden, wird die aktuelle Zeilennummer am Ende der Sprungliste eingefügt. Befand sich dieselbe Zeile bereits in der Sprungliste, wird sie entfernt. Das Ergebnis ist, dass Sie beim Wiederholen CTRL-Onur einmal zu alten Positionen zurückkehren.

Dies setzt voraus, dass Sie Vim (nicht vi) mit der +jumplistFunktion verwenden. Wenn :echo has('jumplist')druckt 1, dann können Sie diese verwenden.

wchargin
quelle
19

Um die Antwort von dnetserr und den Kommentar von Peter Rincker zu ergänzen, verwaltet Vim eine Liste von Änderungen und weist einige damit verbundene Befehle auf.

:changes

listet die Änderungen auf und zeigt Ihnen, wo sie waren und was sie waren. Zum Beispiel:

change line  col text
    2     8   17 #include <stdio.h>
    1     3    0 #include "stm32f407.auto.h"
>

Die Zeile mit dem >Symbol zeigt, wo Sie sich im Änderungsstapel befinden, ähnlich wie die Sprungliste ( :jumps) oder der Tag-Stapel ( :tags). Ebenso wie die Sprungliste und der Variablenstapel können Sie diese Liste durchlaufen.

Im normalen Modus sollen die Bewegungen g;zu einem vorherigen Änderungsort und g,zum nächsten gehen. Sie können auch die Nummer der Änderung vor g;oder g,nach dieser Änderung aus der Liste eingeben. Oben, 2g;würde mich dahin bringen, wo die Änderung mit stdio.h stattgefunden hat.

In der Mitte des Stapels werden die Zahlen aus :changesaktualisiert, um die relativen Abstände anzuzeigen. Zum Beispiel:

change line  col text
    1     8   17 #include <stdio.h>
>   0     3    0 #include "stm32f407.auto.h"
    1    10    4 other

Dies zeigt, dass ich einen ( 1g;oder nur g;) zurück oder einen ( 1g,oder nur g,) vorwärts gehen kann .

Dies ist großartig, wenn die Änderung, zu der Sie gelangen möchten, tatsächlich vor einigen Modifikationen stattgefunden hat

Dies hat den Nachteil, dass es nicht wie eine normale Bewegung zu wirken scheint. Zum Beispiel können Sie nicht tun dg;, um vom Cursor zur vorherigen Änderungsposition zu löschen, wohingegen d'.und d'^als Bewegungen arbeiten.

John O'M.
quelle
15

g; wechselt zur zuvor bearbeiteten Zeile.

dnetserr
quelle
3
Sie können auch g (Komma) verwenden, um zu einer neueren Bearbeitungsposition zu wechseln.
James
5

Da der Rückgängig-Befehl in Vi als Wiederholung fungiert, als der letzte Befehl rückgängig gemacht wurde, habe ich ihn uuals Mittel verwendet, um dorthin zurückzukehren, wo ich ihn zuletzt bearbeitet habe.

Wenn Sie Vim mit nocompatibleset ausführen (wie die meisten Leute), möchten Sie, ugefolgt von CTRL+R, undo & redo verwenden. Ansonsten uuwird wie in Vi gearbeitet.

hlovdal
quelle
Es wird, wenn :set nocompatiblenicht verwendet wird.
muru
2
Mein vim(mit nocompatible) macht zwei Undos mit uu, aber ich benutze uund CTRL+rfür den gleichen Effekt.
Shahbaz,
Diese Antwort hat den Vorteil, dass sie auch mit vi funktioniert, falls Sie kein VIM für Aix / HPUX / Solaris / andere Unix-Varianten haben.
Guntram Blohm