Est-il possible de créer des fichiers à sauvegarde automatique Vim?


32

Certains traitements de texte et éditeurs de texte enregistrent automatiquement les fichiers que nous modifions de temps en temps, ce qui est très pratique pour survivre à de graves accidents, etc.

Existe-t-il un moyen de faire en sorte que Vim enregistre automatiquement nos fichiers après un intervalle spécifique?

Réponses:


30

Il n'y a pas d'option intégrée, bien que :help 'autosave'(dans todo.txt) fasse référence à une description de ce qu'une telle option pourrait faire.

Une façon possible de l'implémenter consiste à utiliser l' CursorHoldévénement autocommand. Cet événement est déclenché lorsque l'utilisateur n'a pas appuyé sur une touche pendant des 'updatetime'millisecondes.

autocmd CursorHold * update

La :updatecommande enregistre le tampon uniquement s'il est modifié. Si vous vouliez également que cela se produise lorsque le mode d'insertion est actif, CursorHoldIpourrait être ajouté à la liste des événements.

autocmd CursorHold,CursorHoldI * update

Une autre alternative est l' 'autowrite'option, qui enregistrera le tampon avant d'exécuter une commande externe (utile pour enregistrer avant d'exécuter :make) ou de basculer vers un autre tampon.


Comment pouvez-vous remarquer si cela fonctionne?
nilon

@nilon Il devrait imprimer dans la barre d'état qu'il est enregistré, comme si vous aviez appuyé sur: w vous-même.
MaudPieTheRocktorate

12

Vim possède une fonction d'enregistrement automatique, mais il l'enregistre dans le fichier de "récupération".

Lorsque vous modifiez un document, par exemple, MyFile.txtvim créera le fichier de restauration .MyFile.txt.swp. Si votre système venait à planter, ou votre session devait mourir, alors vous pouvez vous reconnecter et récupérer essentiellement là où vous vous étiez arrêté, en tapant:

vim -r MyFile.txt

Cela ouvrira le fichier pour modification et récupérera les dernières modifications que vous y avez apportées.

Vous pouvez ensuite enregistrer la version récupérée de la manière habituelle :w.

Malheureusement, lorsque vous quittez vim, il laisse le .MyFile.txt.swppourtour et vous devez le supprimer manuellement:

rm .MyFile.txt.swp

Voir la page Man "Recovery" Aussi Chapitre 11


1
Lorsque vous quittez Vim correctement (c'est-à-dire avec :wqou :q!ou ZZou etc.), les fichiers d'échange doivent être automatiquement supprimés.
Poignée de porte

4
@Doorknob pas quand vous quittez après une récupération ... ;-)
rolfl

8

J'ai créé un plugin vim-autosave qui utilise la fonction Vim 8 des Timers pour sauvegarder périodiquement vos tampons.


Woah, les plugins Vim 8 sortent déjà. Ça a l'air super, Christian!
thameera

Merci, Christian. Cela semble prometteur. Je me demande si le plugin prend en charge les fichiers nouveaux / non enregistrés. Je ne trouve pas la réponse dans la documentation du plugin. Mon ordinateur a décidé de redémarrer la nuit dernière et j'avais plusieurs notes rapides sur les nouveaux tampons. Vim n'a pas créé ni conservé de fichiers swp.
JAponte

Non, actuellement, il ne prend pas en charge les fichiers nouveaux / non enregistrés. Si vous le souhaitez, allez-y et créez un problème de blanchiment.
Christian Brabandt

2

Je fais en sorte que mon Vim enregistre tout à chaque fois que le focus est perdu.

autocmd FocusLost <your-patterns-here> silent! wall

Mes modèles sont assez longs et je les utilise dans plusieurs autocmds mais pour être complet, voici à quoi ça ressemble:

if exists(':keeppatterns')
    let s:keeppatterns = 'keeppatterns '
else
    let s:keeppatterns = ''
endif

augroup AutoSaveGroup
    " :help file-pattern has some info,
    " but some of it is is buried in the PATTERNS section of usr_40.txt
    let s:autoPattern = "*.{c,h,[ch]pp,[acjt]s,inl,cg,cgfx,fx,py,bat,cmd,jam,vim,yml,yaml,vsprops,erb,rb,html,htm},SCons*,*vimrc"

    autocmd!
    execute "autocmd FocusLost"     s:autoPattern   "silent! wall"
    execute "autocmd BufWritePre"   s:autoPattern   s:keeppatterns . 'call FixFormatting(expand("<afile>"))'

    execute "autocmd FileChangedRO" s:autoPattern "silent !p4 edit %:p"
    execute "autocmd FileChangedRO" s:autoPattern "write!"

    autocmd FocusLost   *.txt   silent! wall
augroup END

1

Comme d'autres l'ont indiqué, vim a un fichier d'échange (.swp) qui sera créé où que se trouve votre fichier d'origine, mais dans votre fichier .vimrc, vous pouvez définir le répertoire .swp.

Vous devrez créer le répertoire avec mkdir, puis définir votre .vimrc à cet emplacement.

set backup " make backup files
set backupdir=~/.vim-tmp,~/.tmp,~/tmp,/var/tmp,/tmp

1

Le plugin vim-workspace possède une fonction d'enregistrement automatique assez personnalisable qui peut répondre à vos besoins. Par défaut, il active l'enregistrement automatique dans une session d'espace de travail (sa principale caractéristique), mais vous pouvez le définir pour qu'il soit toujours enregistré automatiquement si c'est tout ce que vous recherchez ( let g:workspace_autosave_always = 1).


1

Essayez d'enregistrer le tampon chaque fois que le texte est modifié:

autocmd TextChanged,TextChangedI <buffer> silent write

Cela fonctionne pour moi.

La source

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.