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?

thameera
la source

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.

Jamessan
la source
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

rolfl
la source
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.

Christian Brabandt
la source
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
dash-tom-bang
la source
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
Utilisateur enregistré
la source
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).

Jaybay
la source
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

simhumileco
la source