Come posso eliminare la mia cronologia degli annullamenti in vim?


23

Annulla è bello avere in Vim. Ma a volte, a un noto punto, voglio cancellare la mia cronologia di annullamento, per poterlo usare u per annullare singole modifiche, ma solo per tornare a un certo punto. (Ad esempio, questo potrebbe essere il mio ultimo impegno).

Un modo per ottenere questo risultato è chiudere e riaprire il file: la cronologia degli annullamenti inizia a essere pulita in quel momento. Ma questa è una seccatura.

In passato, ho realizzato questo con :edit!. Ma in Vim 7.3, questo non elimina la cronologia degli annullamenti.

C'è un altro modo per farlo, oltre a chiudere il file?


quindi in realtà vuoi solo ripristinare lo stato del file così come era nell'ultimo commit? vuoi essenzialmente rimappare il tasto 'u' per qualcosa di simile git checkout -f file o hg rollback file?
akira

@akira: no, voglio essere in grado di usarlo u per annullare singole modifiche, ma non oltre il punto in cui ho commesso l'ultima volta. Esattamente come se, ogni volta che ho commesso, ho chiuso il file e riaperto. Quale è cosa :edit! era solito fare - era come chiudere il file e riaprirlo. Questo non deve essere legato a un punto di commit, è solo il momento in cui lo vorrei più spesso.
Nathan Long

ah, questo rende il problema molto più chiaro. dovresti cambiare la tua domanda un po '.
akira

Risposte:


11
:set undoreload=0 | edit

dovrebbe fare quello che stai chiedendo


1
Ha! Disattiva quella funzione, eh? :) Non sono sicuro del motivo per cui mi ci è voluto così tanto tempo per notarlo.
Nathan Long

6

Il vecchio: modifica! comportamento in un liner:

:exe "set ul=-1 | e! | set ul=" . &ul

Questo funziona. Ti dispiacerebbe spiegarlo?
Nathan Long

Concatena il valore dell'impostazione undolevels alla fine della stringa di comandi (in modo che possa essere ripristinato) ed eseguirli. Per maggiori informazioni consultare la documentazione: :h :exe, :h :bar, :h :set-args, :h 'ul' e :h :edit!.
Aldrik

6

La funzione di Benoit non ha funzionato per me, ma ho trovato qualcosa di simile nel manuale di vim, qui:

http://www.polarhome.com/vim/manual/v73/undo.html#undo-remarks

L'ho schiaffeggiato in una funzione, aggiunto al mio vimrc e sembra funzionare bene su vim 7.3:

" A function to clear the undo history
function! <SID>ForgetUndo()
    let old_undolevels = &undolevels
    set undolevels=-1
    exe "normal a \<BS>\<Esc>"
    let &undolevels = old_undolevels
    unlet old_undolevels
endfunction
command -nargs=0 ClearUndo call <SID>ForgetUndo()

Questo può essere usato con :ClearUndo.


1
Lavorando normalmente con il plugin Gundo e annullando il ricaricamento dei file, questa cosa mi è davvero utile. Tuttavia, ho cambiato due cose: invece del normale comando di modifica (che a sua volta lascia alcune modifiche alla storia su 7.4 sembra), io uso semplicemente una modifica! (e scrivi sempre prima di cancellare la cronologia degli annullamenti). Sembra che alcuni elenchi interni non siano aggiornati correttamente, quindi se vuoi usarlo con il plugin Gundo, esegui una modifica aggiuntiva! alla fine delle funzioni impedirà l'errore in seguito.
PlasmaHH

@PlasmaHH Potresti pubblicare la funzione per cancellare la cronologia degli annullamenti, perché non ho capito cosa hai cambiato ... (potresti postarlo come risposta per quelli di noi che usano gundu). Grazie
Ben

5

Probabilmente:

:let old_ul=&ul
:set ul=-1
:let &ul=old_ul
:unlet old_ul

( 'ul' è pseudonimo per 'undolevels' ).


Funziona! Ora sto cercando di fare un singolo comando per farlo - preferibilmente :edit!. Come inizio, ho creato una funzione chiamata ClearUndos () con i comandi che hai elencato, ma chiamarla non sembra fare nulla, mentre fare i comandi individualmente fa ...
Nathan Long

3
:command -nargs=0 Reset let old_ul=&ul | set ul=-1 | e! | let &ul = old_ul | unlet old_ul
Benoit

è quello che dovrebbe essere il contenuto della funzione? Non funziona per me, ma forse ho frainteso. Inoltre, forse spostalo nella sua risposta?
Nathan Long

Forse non puoi mettere crudo | in un contenuto di comando. Quindi creare una funzione che faccia ciò che ho detto nella mia risposta e impostare il comando su call thefunction().
Benoit

2

"Cancella cronologia annullamenti (: w per cancellare il file di annullamento se presentato)
command! -bar UndoClear exe "set ul=-1 | m-1 | let &ul=" . &ul

  • Quando si imposta 'undolevels' su -1 le informazioni di annullamento non sono immediatamente cancellato, questo succede alla prossima modifica, ad es. m-1, che in realtà non cambia il tuo testo.
  • quando 'undofile' è acceso, :w per cancellare il file di annullamento o catena come UndoClear|w.

1

In una sceneggiatura:

function! <SID>ForgetUndo
     let old_ul = &ul
     set ul=-1
     let &ul = old_ul
     unlet old_ul
endfunction
command -nargs=0 Reset call <SID>ForgetUndo()

Quindi utilizzare :Reset chiamarlo


La tua linea di definizione della funzione ha bisogno () alla fine.
Nathan Long

Questo è strano: l'esecuzione di questi comandi individualmente funziona bene e l'eco dei valori in tutta la funzione mostra che sono impostati e disinseriti in modo appropriato. Ma l'esecuzione della funzione non resetta la cronologia dei miei annullamenti: in seguito, posso ancora annullare più volte. Forse il set ul= il comando riguarda solo una variabile locale fino allo spegnimento dello script, e dal momento in cui lo ripristiniamo prima che lo script esca, non influisce mai sull'ambiente? Hai provato questa funzione e hai funzionato? Significa, c'è qualcosa di strano nel mio setup?
Nathan Long
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.