Ustaw znak na jego poprzednią wartość

9

Czasami używam znaków poruszać się łatwo za pomocą różnych plików za pomocą mA, mB... i 'A, 'B...

I czasami (częściej niż chciałbym to przyznać) z powodu nieuwagi lub jakiegokolwiek innego powodu używam m[LETTER]z już istniejącym znakiem, który usuwa swoją poprzednią wartość, gdy nie chcę. Przez większość czasu, gdy to robię, nie otwieram pliku pierwotnie wskazanego znakiem.

W takim przypadku, gdy natychmiast uświadomiłem sobie, że popełniłem błąd, czy możliwe jest uzyskanie poprzedniej wartości mojego znaku innego niż zapamiętanie, gdzie był wskazywany, nawigacja do tej lokalizacji i ustawienie jej ponownie?

W dokumencie nie znalazłem takiego polecenia, więc jeśli nie istnieje, czy istnieje sprytne obejście, którego niektórzy z was używają w tej sytuacji?

statox
źródło
1
Możesz również spojrzeć na ten post, aby uzyskać dodatkowe informacje: superuser.com/questions/687441/…
nobe4
@ Nobe4 dzięki za link Nie znalazłem go, ale wydaje się potwierdzać, że tak naprawdę nie jest to możliwe.
statox
Za pomocą polecenia Jump ( ctrl-o, ctrl-ii :jumps) ze swojej własnej pamięci osobistej :)
VanLaser

Odpowiedzi:

5

Oto podstawowy VimScript, który z grubsza robi to, co chcesz.

Zastępujemy mapowania maprzelotowe, mzaby zapisać bieżącą wartość g:previous_marksprzed wywołaniem oryginału w mcelu ustawienia znaku. Mamy również zdefiniować <Leader>mapoprzez <Leader>mzpokazanie historii dla wspomnianego znaku.

Prawdopodobnie zechcesz przechowywać informacje w g:previous_marksbardziej uporządkowany sposób i dodać możliwość szybkiego przywrócenia znaku (zamiast tylko patrzeć na lokalizacje), ale ten przykład pokazuje, jak można to zrobić, kolejne poprawki są pozostawione jako ćwiczenie do czytelnika ;-)

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
źródło
Wow jak zwykle niesamowita odpowiedź! W ten weekend postaram się poświęcić trochę czasu na ćwiczenie czytelnika;)
statox
2

Niezupełnie to, czego chcesz, ale być może bardziej przydatne: wtyczka podpisu . Pokazuje bieżące znaki jako znaki na marginesie rynny i ma proste skróty do ich edycji. Może także umieścić listę znaków na liście lokalizacji w celu szybkiego dostępu.

Sato Katsura
źródło
Nie jestem wielkim fanem widocznego znaku na marginesie, ale wydaje mi się, że ma kilka interesujących funkcji, przyjrzę się temu.
statox
@statox W tym samym stylu są też znaki towarowe . Pokazuje dosłownie wszystkie znaki (powyższa wtyczka dotyczy tylko znaków alfabetycznych) i można przełączać za pomocą klawisza. Czasami uznaję to za przydatne.
Sato Katsura
Tak, korzystam ze znaków towarowych od kilku lat (w przeciwieństwie do podpisu), dlatego powiedziałem, że nie jestem fanem znaków na marginesie, ale próbuję teraz podpisu, aby zobaczyć, czy mi się podoba :-)
statox
2

Ponieważ faktycznym problemem wydaje się być nawigacja między wieloma plikami / pozycjami, sugerowałbym to proste rozwiązanie oparte na wtyczce Unite :

:Unite jump -auto-preview

To polecenie (które można zamapować na coś takiego jak <leader>jna przykład) wyświetla listę przeskoków z podglądem: za każdym razem, gdy poruszasz się po liście za pomocą j/ k, wyświetlanych jest kilka wierszy wokół pozycji kursora w tym pliku.

wprowadź opis zdjęcia tutaj


Alternatywny:

Domyślne znaki są tak łatwe do zastąpienia: być może nazwane zakładki lepiej pasują do twojego przypadku użycia, np. Z wtyczką simple_bookmarks .

VanLaser
źródło
Naprawdę nie mogę powiedzieć, że problemem jest ten rodzaj nawigacji, ponieważ używam tych znaków naprawdę sporadycznie i przez większość czasu poruszam się inaczej w moich plikach. Niemniej jednak od dawna myślałem, że powinienem częściej korzystać z listy skoków, co wydaje się być dobrym sposobem na zrobienie tego!
statox
Nawet jeśli można je zapisać między sesjami vima, zbyt łatwo jest nadpisywać znaki. Dodałem alternatywne rozwiązanie.
VanLaser,
Rzeczywiście, twoje alternatywne rozwiązanie wydaje się warte wypróbowania, bardzo dziękuję!
statox