Impostare un segno sul valore precedente


9

A volte uso i segni per navigare facilmente tra diversi file usando mA, mB... e 'A, 'B...

E a volte (più spesso di quanto vorrei ammettere) a causa della disattenzione o qualunque sia la ragione, lo uso m[LETTER]con un marchio già esistente che cancella il suo valore precedente quando non lo voglio. Il più delle volte quando lo faccio non ho aperto il file originariamente indicato dal segno.

In questo caso, quando ho capito immediatamente di aver commesso un errore, è possibile ottenere il valore precedente del mio marchio oltre a ricordare dove stava puntando, navigare in questa posizione e impostarlo di nuovo?

Non ho trovato un comando del genere nel documento, quindi se non esiste esiste una soluzione intelligente che alcuni di voi usano in questa situazione?


1
Puoi anche consultare questo post per ulteriori informazioni: superuser.com/questions/687441/…
nobe4

@ Nobe4 grazie per il tuo link non l'avevo trovato ma sembra confermare che non è proprio possibile farlo facilmente.
statox

Utilizzare i comandi di salto ( ctrl-o, ctrl-ie :jumps) con il proprio ricordo personale :)
VanLaser

Risposte:


5

Ecco alcuni VimScript di base che fanno all'incirca quello che vuoi.

Sostituiamo le mappature mapassanti mzper memorizzare il valore corrente g:previous_marksprima di chiamare l'originale mper impostare effettivamente il segno. Definiamo anche <Leader>maattraverso <Leader>mzper mostrare la storia per detto marchio.

Probabilmente vorrai archiviare le informazioni in g:previous_marksun modo più organizzato e aggiungere la possibilità di ripristinare rapidamente un segno (piuttosto che vedere solo le posizioni), ma questo esempio mostra come si può fare, ulteriori modifiche vengono lasciate come esercizio al lettore ;-)

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()

Caspita come al solito incredibile risposta! Proverò a impiegare del tempo questo fine settimana per attuare l'esercizio per il lettore;)
statox

2

Non esattamente quello che vuoi, ma forse più utile: il plug-in della firma . Mostra i segni correnti come segni nel margine della grondaia e ha semplici scorciatoie per modificarli. Può anche mettere l'elenco dei segni in un elenco di posizioni per un rapido accesso.


Non sono un grande fan del segno visibile sul margine ma sembra che abbia alcune caratteristiche interessanti che darò un'occhiata.
statox

@statox Nella stessa vena, ci sono anche segni distintivi . Mostra letteralmente tutti i segni (il plugin sopra si occupa solo di quelli alfabetici) e può essere attivato / disattivato con una chiave. Lo trovo utile di tanto in tanto.
Sato Katsura,

Sì, ho usato i segni di spunta per un po 'di tempo (a differenza della firma) ecco perché ho detto che non sono un fan dei marchi a margine ma sto provando la firma in questo momento per vedere se mi piace :-)
statox

2

Poiché il problema reale sembra essere la navigazione tra più file / posizioni, suggerirei questa semplice soluzione, che si basa sul plug-in Unite :

:Unite jump -auto-preview

Questo comando (che può essere mappato su qualcosa come <leader>jad esempio) mostrerà la jump list, con un'anteprima: ogni volta che navighi nell'elenco con j/ k, verranno visualizzate diverse linee attorno alla posizione del cursore in quel file.

inserisci qui la descrizione dell'immagine


Alternativa:

I segni predefiniti sono così facili da sovrascrivere: forse i segnalibri con nome si adatterebbero meglio al tuo caso d'uso, ad esempio con il plugin simple_bookmarks .


Non posso davvero dire che il problema sia questo tipo di navigazione perché uso quei segni davvero occasionalmente e il più delle volte navigo in modo diverso attraverso i miei file. Tuttavia ho pensato a lungo che avrei dovuto usare la jump list più spesso in modo da sembrare un bel modo di farlo!
statox

Anche se possono essere salvati tra sessioni vim, è troppo facile sovrascrivere i segni. Ho aggiunto una soluzione alternativa.
VanLaser,

In effetti la tua soluzione alternativa sembra valere la pena di provare grazie mille!
statox
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.