Wie kann ich Markierungen verwenden, um zu Speicherorten in Dateien zu springen, die ich kürzlich geöffnet, aber nicht geändert habe?

11

Oft bearbeite ich eine Datei - denke, meine Arbeit ist erledigt - dann schließe ich die Datei und gehe zum nächsten Schritt über. Aber dann wird mir klar, dass ich zu diesem Code zurückkehren und ihn ein bisschen weiter optimieren muss.
Wenn ich die Datei erneut öffne, kann ich die .Markierung verwenden und zur Position der letzten Bearbeitung mit springen '..
Jetzt versuche ich, eine Möglichkeit zu finden, mit den Markierungen von vim zu Speicherorten in Dateien zu springen, die ich kürzlich besucht, aber nicht geändert habe.
Ich weiß, dass ich eine Marke manuell setzen kann, aber die meiste Zeit erwarte ich nicht, dass ich zurückkomme. Daher setze ich keine Marke und muss eine Marke verwenden, die vim automatisch generiert.
Die "Marke scheint, als könnte dies ein Weg sein, dies zu erreichen :h motion.

" Zur Cursorposition beim letzten Verlassen des aktuellen Puffers. Der Standardwert ist das erste Zeichen der ersten Zeile. Siehe | Last-Position-Jump | wie man dies für jede geöffnete Datei verwendet. Pro Puffer wird nur eine Position gespeichert, nicht eine für jedes Fenster. Solange der Puffer in einem Fenster sichtbar ist, wird die Position nicht geändert. {nicht in Vi}.

Aber wenn ich

  • Schließen Sie alle Fenster, in denen ein Puffer angezeigt wird (der Puffer ist jedoch noch in der Pufferliste vorhanden). oder:
  • Töte alle Instanzen des Puffers

Die Markierung scheint nicht aktualisiert zu werden. Wie kann ich mit einer Markierung zu einer Position der letzten Cursorposition im Puffer / in der Datei springen?

the_velour_fog
quelle
2
Ich denke, Sie suchen Ctrl+ound Ctrl+i... :h jump-motionsfür weitere Informationen
Sundeep
@spasic das ist kein schlechter Vorschlag, aber sobald Sie ein paar Dutzend Sprünge machen, würde die Position in einer massiven Sprungliste verloren gehen. Indem Sie die Markierungen in den Puffer verschieben, müssen Sie eine kleinere Liste von Markierungen / Positionen verwalten
the_velour_fog
Wenn Sie es nicht schon gelesen hätten, wäre dieser Tipp interessant. Vielleicht müssen Sie Ihreviminfo
statox
@ Statistik danke. Ich habe das gesehen und die Spitze im vim hilft. Ich denke, diese Lösungen bewirken ein automatisches Springen zur "Marke, wenn Sie eine Datei öffnen. Ich wollte wirklich nur manuell zur letzten Cursorposition springen. Außerdem konnte ich einfach nicht verstehen, wann die "Marke gesetzt und aktualisiert wird, sodass die "Marke für mich unbrauchbar ist.
the_velour_fog

Antworten:

6

Hier ist eine klassische Lösung: Verwenden

`H

um zur letzten HTML-Datei zu springen und so weiter ...

augroup VIMRC
  autocmd!

  autocmd BufLeave *.css  normal! mC
  autocmd BufLeave *.html normal! mH
  autocmd BufLeave *.js   normal! mJ
  autocmd BufLeave *.php  normal! mP
augroup END
romainl
quelle
2
danke, das scheint wirklich nützlich zu sein. Ich habe es in mein vimrc geladen, um es auszuprobieren. Ich habe zu autocmd geändert, WinLeaveda ich bemerkt habe, dass BufLeavees nicht ausgelöst wird, wenn Sie einen Split schließen und der Puffer noch an einer anderen Stelle geöffnet ist. Ich weiß, dass es ein bisschen ein Randfall ist, aber es WinLeavescheint über einen größeren Bereich von Situationen vom Typ "Datei schließen" zu funktionieren, aber ich
teste
3

Ich habe diese Vimscript-Erklärung geschrieben, die zu funktionieren scheint

autocmd BufLeave * :normal ml

Erläuterung

  • BufLeave Auto-Befehl: Dies scheint ausgelöst zu werden, wenn Sie
    • in ein anderes Fenster wechseln
    • wenn Sie das letzte Fenster schließen, in dem der Puffer angezeigt wird
    • wenn Sie den Puffer selbst mit schließen bd
  • :normal- Es scheint, dass der commandTeil von autocmd standardmäßig ein Ex-Befehl ist. Um vim anzuweisen, einen Befehl für den normalen Modus auszuführen, müssen Sie hinzufügen:normal
  • ml- eine Marke setzen l(Mnemonik: zuletzt )

Verwendung

Um die Cursorposition vom letzten Mal im Puffer abzurufen, drücken Sie einfach

'l

oder

`l
the_velour_fog
quelle
0

Wenn Sie möchten , dass Ihr Cursor die letzte Position wiederherstellt, die viminfo bekannt ist , können Sie verwenden

autocmd BufReadPost * call setpos(".", getpos("'\""))

Die Antwort von romainl war für mich besonders nützlich und ich habe sie oft benutzt (seit ich ein Webentwickler bin):

augroup VIMRC
    autocmd!
    autocmd BufLeave,WinLeave *.html normal! mH
    autocmd BufLeave,WinLeave *.css normal! mC
    autocmd BufLeave,WinLeave *.js normal! mJ
augroup end

nnoremap <space>h `Hzz
nnoremap <space>c `Czz
nnoremap <space>j `Jzz

Die letzte potenziell nützliche Sache ist die Option :help 'nostartofline:

               *'startofline'* *'sol'* *'nostartofline'* *'nosol'*
'startofline' 'sol' boolean (default on)
            global
            {not in Vi}
    When "on" the commands listed below move the cursor to the first
    non-blank of the line.  When off the cursor is kept in the same column
    (if possible).  This applies to the commands: CTRL-D, CTRL-U, CTRL-B,
    CTRL-F, "G", "H", "M", "L", gg, and to the commands "d", "<<" and ">>"
    with a linewise operator, with "%" with a count and to buffer changing
    commands (CTRL-^, :bnext, :bNext, etc.).  Also for an Ex command that
    only has a line number, e.g., ":25" or ":+".
    In case of buffer changing commands the cursor is placed at the column
    where it was the last time the buffer was edited.
    NOTE: This option is set when 'compatible' is set.
dylnmc
quelle