Setzen Sie eine Markierung auf den vorherigen Wert

9

Manchmal benutze ich Markierungen leicht durch verschiedene Dateien navigieren mit mA, mB... und 'A, 'B...

Und manchmal (öfter als ich zugeben möchte) wegen Unaufmerksamkeit oder aus irgendeinem Grund verwende ich m[LETTER]eine bereits vorhandene Marke, die ihren vorherigen Wert löscht, wenn ich nicht möchte. Die meiste Zeit, wenn ich das tue, habe ich die Datei, auf die ursprünglich die Marke zeigt, nicht geöffnet.

Ist es in diesem Fall, wenn ich sofort feststellte, dass ich einen Fehler gemacht habe, möglich, den vorherigen Wert meiner Marke zu erhalten, außer sich zu erinnern, wohin sie zeigte, zu diesem Ort zu navigieren und ihn erneut einzustellen?

Ich habe im Dokument keinen solchen Befehl gefunden. Wenn dieser nicht vorhanden ist, gibt es eine clevere Problemumgehung, die einige von Ihnen in dieser Situation verwenden?

statox
quelle
1
Auch Sie könnten an dieser Stelle für weitere Informationen suchen: superuser.com/questions/687441/...
nobe4
@ Nobe4 danke für deinen Link Ich hatte ihn nicht gefunden, aber es scheint zu bestätigen, dass es nicht wirklich möglich ist, das einfach zu machen.
Statox
Verwenden Sie die Sprungbefehle ( ctrl-o, ctrl-iund :jumps) mit Ihrem eigenen persönlichen Speicher :)
VanLaser

Antworten:

5

Hier ist ein grundlegendes VimScript, das ungefähr das tut, was Sie wollen.

Wir überschreiben die maDurchgangszuordnungen mz, um den aktuellen Wert zu speichern, g:previous_marksbevor wir das Original aufrufen m, um die Markierung tatsächlich zu setzen. Wir definieren auch <Leader>madurch <Leader>mz, um den Verlauf für diese Marke anzuzeigen.

Möglicherweise möchten Sie die Informationen übersichtlicher speichern g:previous_marksund die Möglichkeit hinzufügen, eine Markierung schnell wiederherzustellen (anstatt nur die Positionen zu sehen). Dieses Beispiel zeigt jedoch, wie dies durchgeführt werden kann. Weitere Optimierungen bleiben als Übung übrig an den Leser ;-)

let g:previous_marks = {}
fun! MyMark(mark)
    let l:marks = ''
    redir => l:marks
        try
            silent! execute 'marks ' . a:mark
        catch
        endtry
    redir END

    if l:marks != ''
        if !has_key(g:previous_marks, a:mark)
            let g:previous_marks[a:mark] = []
        endif
        call add(g:previous_marks[a:mark], split(l:marks, "\n")[1])
    endif

    execute 'normal! m' . a:mark
endfun

fun! ShowHistory(mark)
    if !has_key(g:previous_marks, a:mark)
        echoerr 'No history for ' . a:mark
        return
    endif

    for l:line in g:previous_marks[a:mark]
        echo l:line
    endfor
endfun

fun! MakeMappings()
    for l:char in range(97, 122)
        let l:char = nr2char(l:char)

        execute 'nnoremap <silent> m' . l:char . ' :call MyMark("' . l:char . '")<CR>'
        execute 'nnoremap <silent> <Leader>m' . l:char . ' :call ShowHistory("' . l:char . '")<CR>'
    endfor
endfun

call MakeMappings()
Martin Tournoij
quelle
Wow wie immer tolle Antwort! Ich werde versuchen, mir dieses Wochenende Zeit zu nehmen, um die Übung für den Leser
durchzuführen
2

Nicht genau das, was Sie wollen, aber vielleicht nützlicher: das Signatur- Plugin. Es zeigt die aktuellen Markierungen als Zeichen am Rinnenrand an und verfügt über einfache Verknüpfungen zum Bearbeiten. Es kann auch die Liste der Schilder in eine Standortliste für den schnellen Zugriff einfügen.

Sato Katsura
quelle
Ich bin kein großer Fan der sichtbaren Markierung am Rand, aber es scheint einige interessante Funktionen zu haben, die ich mir ansehen werde.
Statox
@statox In der gleichen Richtung gibt es auch Showmarks . Es zeigt buchstäblich alle Markierungen (das obige Plugin behandelt nur alphabetische Markierungen) und kann mit einem Schlüssel umgeschaltet werden. Ich finde es gelegentlich nützlich.
Sato Katsura
Ja, ich habe einige Zeit Showmarks verwendet (im Gegensatz zur Signatur), deshalb habe ich gesagt, dass ich kein Fan von Markierungen am Rand bin, aber ich versuche gerade die Signatur, um zu sehen, ob es mir gefällt :-)
statox
2

Da das eigentliche Problem die Navigation zwischen mehreren Dateien / Positionen zu sein scheint, würde ich diese einfache Lösung vorschlagen, die auf dem Unite- Plugin basiert :

:Unite jump -auto-preview

Dieser Befehl (der <leader>jbeispielsweise zugeordnet werden kann) zeigt die Sprungliste mit einer Vorschau an: Jedes Mal, wenn Sie mit j/ durch die Liste navigieren k, werden mehrere Zeilen um die Cursorposition in dieser Datei angezeigt.

Geben Sie hier die Bildbeschreibung ein


Alternative:

Die Standardmarken können so einfach überschrieben werden: Vielleicht passen benannte Lesezeichen besser zu Ihrem Anwendungsfall, z. B. mit dem Plugin simple_bookmarks .

VanLaser
quelle
Ich kann nicht wirklich sagen, dass das Problem diese Art der Navigation ist, da ich diese Markierungen gelegentlich verwende und die meiste Zeit anders durch meine Dateien navigiere. Trotzdem habe ich lange darüber nachgedacht, dass ich die Sprungliste öfter benutzen sollte, damit das eine gute Möglichkeit ist!
Statox
Selbst wenn sie zwischen vim-Sitzungen gespeichert werden können, ist es zu einfach, Markierungen zu überschreiben. Ich habe eine alternative Lösung hinzugefügt.
VanLaser
In der Tat scheint Ihre alternative Lösung einen Versuch wert zu sein, vielen Dank!
Statox