Come posso usare il undofile?


36

L'ultima notizia su vim.org parla dell'utilizzo del 'undofile' per salvare la cronologia e annullare le modifiche anche dopo un riavvio:

Una funzionalità che mi piace usare da sola non è nota a molti utenti, come ho scoperto lo scorso fine settimana. Oltre a annullare con tutti i livelli che desideri, Vim offre anche la memorizzazione delle informazioni di annullamento in un file. Quindi puoi uscire da Vim, riavviare il computer e annullare comunque le modifiche apportate. Vedi l'aiuto per "undofile". (Bram Moolenaar)

Come posso abilitare e usare questa funzione?


2
Bram probabilmente stava parlando di questo evento
Kurt Pfeifle,

Risposte:


37

La versione più semplice è: crea ~/.vim/undo-dir/directory e aggiungi quanto segue a .vimrc:

set undodir=~/.vim/undo-dir
set undofile

Tuttavia, non è impeccabile ed è meglio leggere. Dal mio .vimrc:

" Let's save undo info!
if !isdirectory($HOME."/.vim")
    call mkdir($HOME."/.vim", "", 0770)
endif
if !isdirectory($HOME."/.vim/undo-dir")
    call mkdir($HOME."/.vim/undo-dir", "", 0700)
endif
set undodir=~/.vim/undo-dir
set undofile

Preferisco non ingombrare le directory casuali con i file di annullamento. Quindi ho impostato l' undodiropzione, che li mette tutti in una directory di annullamento. Ciò lascia un problema: sono pigro e non ho voglia di creare quella directory su tutte le mie macchine (uso un sistema di controllo della versione per sincronizzare le mie .vimrcsu un sacco di macchine). Per fortuna, è abbastanza facile avere Vim controllare e creare le directory se non esistono.

Nota anche la 0700modalità sulla directory di annullamento (che è autorizzazioni complete per il proprietario, nessuna autorizzazione per chiunque altro). Quali file ho modificato, quando, ecc. Dovrebbero rimanere privati. E poiché questa è una directory alla quale solo io posso accedere, non devo preoccuparmi che qualcun altro inserisca un link simbolico, il proprio file di annullamento o qualunque cosa tu debba preoccuparti di usare una directory temporanea di sistema.

Infine, non essendo una directory temporanea di sistema, non è soggetta al criterio di pulizia del tempfile di sistema. Spesso è abbastanza breve, una settimana circa. Ma per evitare che cresca per sempre, ho inserito quanto segue nel mio crontab:

# m h  dom mon dow   command
 43 00 *   *   3     find /home/anthony/.vim/undo-dir -type f -mtime +90 -delete

Quindi dopo 90 giorni di non essere modificati, vengono eliminati. (Onestamente, non sono così grandi, potresti facilmente lasciarli per sempre con quanto sia economico il disco. Ma considera anche la tua privacy se la tua macchina viene mai compromessa.)


Grazie per la risposta dettagliata @derobert! So che questa è una vecchia domanda, ma ho cercato di trovare un modo vimscript per eliminare i vecchi file di annullamento vim ( vi.stackexchange.com/questions/16053/… ). Penso che sarebbe più pulito farlo in questo modo, ma sta dimostrando di non essere facile. Hai mai pensato di utilizzare un vimscript per eliminare i vecchi file vim? In caso contrario, useresti comunque crontab su un vimscript?
Logan,

1
@Logan L'uso di uno script di vim funzionerebbe solo quando vim è in esecuzione, e anche se ci fossero più vims in esecuzione? Quella cron line è semplice, non soffre di questi problemi e chiaramente corretta ...
derobert

Sembra che la mkdir()funzione supporti la creazione di più strutture di directory con l' "p"opzione per {path}parametro. Quindi lo script sopra può essere semplificato un po '. Usare call mkdir($HOME."/.vim/undo-dir", "p", 0700)almeno le opere per me in Vim 7.4.160.
jdhao,
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.