Usando l'annullamento persistente di Vim?


96

Una delle nuove funzionalità di Vim 7.3 è l'annullamento persistente, che consente di salvare l'elemento undotree in un file quando si esce da un buffer.

Sfortunatamente, non sono stato in grado di abilitarlo correttamente o devo averlo usato in modo sbagliato. Ecco cosa ho provato finora:

Ho aggiunto quanto segue a ~ / .vimrc

set undofile                " Save undos after file closes
set undodir=$HOME/.vim/undo " where to save undo histories
set undolevels=1000         " How many undos
set undoreload=10000        " number of lines to save for undo

Dopo questo, presumibilmente dovrei essere in grado di aprire qualsiasi file, modificarlo, quindi salvarlo e chiuderlo, e quando lo riapro dovrei essere in grado di annullare / ripetere come se non fossi mai andato via. Sfortunatamente, questo non sembra essere il caso, poiché non viene mai scritto un undofile.

Appunti:

  1. Sono su Win 7 usando Vim 7.3 dal progetto Vim senza crema. L'annullamento persistente è integrato.

  2. $ HOME / .vim / undo esiste sul mio file system


38
Giusto per sottolineare, il punto 2) è molto importante. Vim non creerà la directory per te e l'annullamento persistente non funzionerà fino a quando nonmkdir ~/.vim/undo
puk

2
+1. Scusa, su Linux funziona ... grazie per avermelo detto!
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Per eventuali futuri visitatori di questa domanda: NON inserire virgolette attorno al valore di undodir! Sono rimasto bloccato su questo problema per un po ': usa un paht assoluto, senza virgolette attorno ad esso.
naiveai

Risposte:


51

Mettilo nel tuo .vimrcper creare un undodirse non esiste e abilitare l'annullamento persistente. Testato su Windows e Linux.

" Put plugins and dictionaries in this dir (also on Windows)
let vimDir = '$HOME/.vim'
let &runtimepath.=','.vimDir

" Keep undo history across sessions by storing it in a file
if has('persistent_undo')
    let myUndoDir = expand(vimDir . '/undodir')
    " Create dirs
    call system('mkdir ' . vimDir)
    call system('mkdir ' . myUndoDir)
    let &undodir = myUndoDir
    set undofile
endif

5
Questo può essere preferibile per creare la directory::silent call system('mkdir -p ' . &undodir)
Kyle Strand

1
Lo uso &perché setlo undodirpreferisco piuttosto che letfarlo. (Nella mia mente questa distinzione tra leted setè una delle tante, molte, molte "caratteristiche" incredibilmente orribili di Vimscript, ma YMMV.)
Kyle Strand

1
Grazie Kyle, è una buona idea creare .vimse non esiste. Sfortunatamente il -pflag non esiste su Windows, quindi ho modificato la risposta per chiamare mkdirdue volte per garantire la compatibilità con Windows.
Matthias Braun

2
Ah. Il motivo principale per cui utilizzo il -pflag è in realtà per evitare un errore quando la directory esiste. Ho il mio comando all'interno di un if has('win32')blocco, quindi lo uso solo mkdirsenza -psu Windows.
Kyle Strand

4
Perché non usare mkdir()? Quindi questo può diventare call mkdir(myUndoDir, 'p'):, che si comporta come mkdir -p.
nelstrom

8

Ho provato questo nel mio _gvimrc:

" Persistent undo
try 
    set undodir=C:\vim\undodir
    set undofile
catch
endtry

Ha iniziato a funzionare come pubblicizzato quando ho cancellato la parentesi try-catch, quindi:

" Persistent undo
set undodir=C:\vim\undodir
set undofile

Ho dovuto creare la directory.


if has('persistent_undo')
Arelav

silent !mkdir ~/.config/nvim/backups > /dev/null 2>&1
Arelav

set undodir=~/.config/nvim/backups
Arelav

1
endif"aggiunta di un messaggio commentato per aumentare la lunghezza del messaggio
Arelav

3

Suppongo che $ HOME non funzioni come pubblicizzato.

Sul mio sistema, :echo $HOMEmostra H: \, ma : e $HOME/dice: ~/nome file non valido.

Potresti provare con un percorso assoluto per vedere se lo cura


Potrei |: echo $ HOME | e |: e $ HOME / | senza problemi, ma ho provato comunque a cambiare le cose. A volte sembrava funzionare, altre no. In particolare, non salva mai i backup quando modifico il mio file ~ / .vimrc.
duckworthd

Su Windows 7 che sto usando $TEMP. Quando guardo set undodir?si vede ~/AppData/Local/Temp. Il file di annullamento viene mantenuto e si carica correttamente. Forse $TEMPsarà più affidabile?
slawek

1

Ora funziona come previsto: file.txtapri in un buffer Vim 7.4 su Windows 7, :setlocal undofilequindi salva una modifica nel buffer e l'undofile .file.txt.un~viene creato insieme perché :set undodir?riporta che "undodir =." per impostazione predefinita, ovvero non è necessario specificarlo manualmente. Puoi anche :set undofilein una modeline.

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.