Vous utilisez l'annulation persistante de Vim?

96

L'une des nouvelles fonctionnalités de Vim 7.3 est «l'annulation persistante», qui permet d'enregistrer l'annulation dans un fichier lors de la sortie d'un tampon.

Malheureusement, je n'ai pas tout à fait été en mesure de l'activer correctement, ou je dois l'utiliser mal. Voici ce que j'ai essayé jusqu'à présent:

J'ai ajouté ce qui suit à ~ / .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

Après cela, je devrais être en mesure d'ouvrir n'importe quel fichier, de le modifier, puis de le sauvegarder-le fermer, et lorsque je l'ouvrirai à nouveau, je devrais pouvoir annuler / refaire comme si je n'avais jamais quitté. Malheureusement, cela ne semble pas être le cas, car aucune annulation n'est jamais écrite.

Remarques:

  1. Je suis sur Win 7 en utilisant Vim 7.3 du projet Vim sans crème. Une annulation persistante est intégrée.

  2. $ HOME / .vim / undo existe sur mon système de fichiers

duckworthd
la source
38
Juste pour souligner, le point 2) est très important. Vim ne créera pas le répertoire pour vous et l'annulation persistante ne fonctionnera pas jusqu'à ce que vousmkdir ~/.vim/undo
puk
2
+1. Désolé, sous Linux ça marche ... merci de m'en avoir parlé!
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Pour les futurs visiteurs de cette question: NE PAS mettre de guillemets autour de la valeur de undodir! Je suis resté coincé sur ce problème pendant un moment - utilisez un paht absolu, sans guillemets autour de lui.
naiveai

Réponses:

51

Mettez-le dans votre .vimrcpour créer un undodirs'il n'existe pas et activer l'annulation persistante. Testé sur Windows et 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
Matthias Braun
la source
5
Cela peut être préférable pour créer le répertoire::silent call system('mkdir -p ' . &undodir)
Kyle Strand
1
Je l'utilise &parce que je setla teinte undodirplutôt que de la letteinter. (Dans mon esprit, cette distinction entre letet setest l'une des nombreuses, nombreuses, nombreuses "fonctionnalités" ahurissantes de Vimscript, mais YMMV.)
Kyle Strand
1
Merci Kyle, c'est une bonne idée de créer .vimsi ça n'existe pas. Malheureusement, l' -pindicateur n'existe pas sous Windows, j'ai donc modifié la réponse pour appeler mkdirdeux fois pour assurer la compatibilité Windows.
Matthias Braun
2
Ah. Ma principale raison d'utiliser l' -pindicateur est en fait d'éviter une erreur lorsque le répertoire existe. J'ai ma commande dans un if has('win32')bloc, donc je l'utilise simplement mkdirsans -psous Windows.
Kyle Strand
4
Pourquoi ne pas l'utiliser mkdir()? Alors cela peut devenir call mkdir(myUndoDir, 'p'):, qui se comporte comme mkdir -p.
nelstrom
8

J'ai essayé ceci dans mon _gvimrc:

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

Cela a commencé à fonctionner comme annoncé lorsque j'ai supprimé le crochet try-catch, ainsi:

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

J'ai dû créer le répertoire.

Juan Lanus
la source
if has('persistent_undo')
Arelav
silent !mkdir ~/.config/nvim/backups > /dev/null 2>&1
Arelav
set undodir=~/.config/nvim/backups
Arelav
1
endif"Ajout d'un message commenté pour augmenter la longueur du message
Arelav
3

Je suppose que $ HOME ne fonctionne pas comme annoncé.

Sur mon système, :echo $HOMEaffiche H: \, mais : e $HOME/dit: ~/nom de fichier invalide.

Vous pouvez essayer avec un chemin absolu pour voir si cela le guérit

sehe
la source
Je pourrais |: echo $ HOME | et |: e $ HOME / | sans problèmes, mais j'ai quand même essayé de changer les choses. Cela semblait fonctionner à certains moments, et pas à d'autres. En particulier, il n'enregistre jamais de sauvegardes lorsque j'édite mon fichier ~ / .vimrc.
duckworthd
Sous Windows 7, j'utilise $TEMP. Quand je regarde set undodir?ça se voit ~/AppData/Local/Temp. Le fichier d'annulation est conservé et se charge correctement. Peut $TEMP-être sera - t - il plus fiable?
slawek
1

Cela fonctionne maintenant comme prévu: file.txtouvrez dans un tampon Vim 7.4 sur Windows 7, :setlocal undofilepuis enregistrez une modification dans le tampon, et l'annulation du fichier .file.txt.un~est créée à côté car :set undodir?signale que "undodir =". par défaut - c'est-à-dire pas besoin de le spécifier manuellement. Vous pouvez également :set undofiledans une modeline.

JosephHarriott
la source