Comment puis-je utiliser le undofile?


36

La dernière nouvelle sur vim.org parle de l’utilisation du 'undofile' pour sauvegarder votre historique et annuler les modifications, même après un redémarrage:

Une fonctionnalité que j'aime utiliser moi-même n'est pas connue de nombreux utilisateurs, comme je l'ai découvert le week-end dernier. En plus d'annuler avec autant de niveaux que vous le souhaitez, Vim permet également de stocker les informations d'annulation dans un fichier. Vous pouvez ainsi quitter Vim, redémarrer votre ordinateur et toujours annuler les modifications que vous avez apportées. Voir l'aide pour 'undofile'. (Bram Moolenaar)

Comment puis-je activer et utiliser cette fonctionnalité?


2
Bram parlait probablement de cet événement
Kurt Pfeifle

Réponses:


37

La version la plus simple est: créer un ~/.vim/undo-dir/répertoire et ajouter ce qui suit au .vimrc:

set undodir=~/.vim/undo-dir
set undofile

Cependant, ce n'est pas parfait, et il vaut mieux continuer à lire. De la mienne .vimrc:

" Let's save undo info!
if !isdirectory($HOME."/.vim")
    call mkdir($HOME."/.vim", "", 0770)
endif
if !isdirectory($HOME."/.vim/undo-dir")
    call mkdir($HOME."/.vim/undo-dir", "", 0700)
endif
set undodir=~/.vim/undo-dir
set undofile

Je préfère ne pas encombrer de répertoires aléatoires avec des fichiers d'annulation. J'ai donc défini l' undodiroption qui met tous ces éléments dans un répertoire d'annulation. Cela pose un problème: je suis paresseux et je n’ai pas l’impression de créer ce répertoire sur toutes mes machines (j’utilise un système de contrôle de version pour synchroniser mes .vimrctâches sur plusieurs machines). Heureusement, il est assez facile de demander à Vim de vérifier et de créer les répertoires s’ils n’existent pas.

Notez également le 0700mode sur le répertoire d'annulation (c'est-à-dire des autorisations complètes pour le propriétaire, aucune autorisation pour quiconque). Quels fichiers j'ai édités, quand, etc. devraient rester privés. Et comme il ne s'agit que d'un répertoire auquel je peux accéder, je n'ai pas à craindre que quelqu'un d'autre y mette un lien symbolique, ni son propre fichier d'annulation, ni à quoi que ce soit, car vous auriez à vous soucier de l'utilisation d'un répertoire temporaire du système.

Enfin, n'étant pas un répertoire temporaire du système, il n'est pas soumis à la stratégie de nettoyage du fichier temporaire du système. Souvent, c'est assez court - une semaine ou deux. Mais pour l'empêcher de grandir pour toujours, j'ai mis ce qui suit dans mon crontab:

# m h  dom mon dow   command
 43 00 *   *   3     find /home/anthony/.vim/undo-dir -type f -mtime +90 -delete

Donc, après 90 jours sans modification, ils sont supprimés. (Honnêtement, ils ne sont pas si gros que ça, vous pourriez facilement les laisser pour toujours avec le prix du disque. Mais considérez également votre propre vie privée si votre machine est un jour compromise.)


Merci pour la réponse détaillée @derobert! Je sais que c’est une vieille question, mais j’essaie de trouver une méthode de suppression de vieux fichiers vim undim ( vimcript ) ( vi.stackexchange.com/questions/16053/… ). Je pense que ce serait plus propre de le faire de cette façon, mais cela s'avère difficile. Avez-vous déjà pensé à utiliser vimscript pour supprimer les anciens fichiers vim? Sinon, utiliseriez-vous toujours crontab sur un vimscript?
Logan

1
@Logan L'utilisation d'un script vim ne fonctionnerait que lorsque vim est en cours d'exécution, et que se passe-t-il si plusieurs vims sont en cours d'exécution? Cette ligne cron est simple, ne souffre pas de ces problèmes et est clairement correcte ...
derobert

Il semble que cette mkdir()fonction supporte la création de plusieurs structures de répertoires avec l' "p"option pour {path}paramètre. Donc, le script ci-dessus peut être un peu simplifié. Utiliser des call mkdir($HOME."/.vim/undo-dir", "p", 0700)œuvres pour moi dans Vim 7.4.160 au moins.
Jdhao
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.