Artisan Numérique

/développement/éditeur de texte/vim/ VIM - Sauvegarde automatique des buffers

Lorsque j'ai abandonné gVim au profit de VIM en console, j'y ai paumé une petite fonctionnalité que j'adorais : la sauvegarde automatique de mes fichiers lorsque la fenêtre perdait le focus. Voici donc un petit quelque chose à rajouter à son vimrc pour obtenir à peu prés le même résultat.

Juste pour mémoire, :en mode GUI, la sauvegarde automatique à la perte du focus de VIM se fait très simplement en ajoutant à .vimrc la ligne suivante:

autocmd LostFocus * wa!
Sauvegarde à la perte du focus

Bien évidement cela ne fonctionne pas en console car urxvt ne transmet pas les évènements gain/perte de focus à l'application cliente (ou du moins je n'ai pas dégoté l'échappement qui correspondrait à cela).

La solution consiste donc à se baser cette fois sur l'évènement CursorHold et CursorHoldI qui se déclenchent, respectivement en mode Normal ou Insertion, lorsque l'on arrête de taper quelque chose pendant un temps fixé par la variable updatetime. Cela nous donne le code suivant :

" Fonction d'autosauvegarde en cas de buffer modifié
function! AutoSave()
  " itération sur l'ensemble des buffers en cours
  for iBuffer in range(bufnr("$"))
    " Recherche d'un buffer modifié
    if getbufvar(iBuffer, "&modified")
      " on en a un, sauvegarde forcée pour tout le monde
      :wa!
      echo "Fichiers sauvegardés"
      return
    endif
  endfor
endfunction
set updatetime=1000
autocmd CursorHold * call AutoSave()
autocmd CursorHoldI * call AutoSave()
Sauvegarde lorsque l'éditeur est inactif

Lorsqu'au bout de 1000ms (j'ai raccourcis le temps qui était par défaut de 4000ms) l'évènement CursorHold (ou CursorHoldI) est déclenché, on lance une fonction dont le rôle est de scanner l'ensemble des buffers ouverts. Si un buffer est modifié, on lance alors une sauvegarde générale.

Et voilà, rien de plus compliqué que cela et une fois de plus, un problème réglé facilement avec VIM.