Meilleures pratiques pour les fichiers d'échange VIM?

14

Chaque fois que je coupe une session dans vim en perdant ma connexion, je suis plutôt rempli de dred (et pourtant je continue à utiliser vim ... quel masochiste je dois être) parce que quand j'ouvre à nouveau mes fichiers une pile de swap- les fichiers attendent pour tenter de détruire mon travail. Quelles sont les meilleures pratiques pour travailler avec des fichiers d'échange vim? Choisissez-vous simplement le plus récent? Si le fichier fonctionne comme prévu, supprimez-vous simplement les fichiers d'échange? Comment vous en débarrassez-vous?

leeand00
la source
5
Les fichiers d'échange sont là pour protéger votre travail. Pensez à utiliser l'écran gnu.
1
Je ne veux pas désactiver la fonctionnalité; c'est ennuyeux mais comme vous le dites utile.
leeand00
1
Je veux juste savoir comment l'utiliser correctement.
leeand00
2
@DrEval J'utilise tmux
leeand00
2
Si vous utilisez tmux, vous ne devriez pas avoir à vous soucier de perdre votre connexion: il vous suffit de vous reconnecter à votre session lorsque vous vous reconnectez. Vous pourriez également être intéressé par mosh et par le plugin Recover de @ ChristianBrabandt .
Rich

Réponses:

22

Ne paniquez pas!

La récupération de fichiers est toujours sûre, car vim n'écrit jamais de modifications tant que vous ne les avez pas écrites vous-même. Ainsi, la récupération à partir d'un fichier d'échange et la fermeture sans sauvegarde ne changeront rien.

Organisez vos fichiers d'échange:

Obtenez vim pour mettre tous vos fichiers d'échange au même endroit, afin que vous sachiez toujours où ils se trouvent:

set directory^=$HOME/.vim/swap//

ou où vous préférez. L'utilisation //à la fin du nom de fichier oblige Vim à utiliser des chemins de fichier absolus pour les noms de fichier d'échange afin de ne pas obtenir de collisions de noms. Assurez-vous que le répertoire existe, sinon vim ne l'utilisera pas (il ne le créera pas pour vous).

Remarque: Cela ne fonctionne que sur les variables d'environnement, si vous souhaitez utiliser une variable vimscript, nous devons utiliser un peu de :executemagie:

execute "set directory^=".my_vim_home_var."/swap//"

Diff les différences:

L'aide de vim propose une commande très utile d'utiliser dans cette situation: :DiffOrig. Ce n'est pas une commande vim par défaut , copiez donc l'implémentation de :h :DiffOrigdans votre vimrc. (c'est aussi dans $VIMRUNTIME/defaults.vimsi vous avez vim8). Maintenant, vous pouvez récupérer le fichier et exécuter simplement DiffOrig pour obtenir un vimdiff de ce qui a changé depuis la version non modifiée.

Si vous souhaitez comparer le contenu de plusieurs fichiers d'échange, récupérez votre fichier avec chaque fichier d'échange différent, puis écrivez le résultat dans des fichiers temporaires. Maintenant, chargez les fichiers et exécutez-les :diffthissur chaque fichier, apportez les modifications souhaitées, réécrivez-les dans le fichier d'origine et supprimez les fichiers temporaires et d'échange.

Commandes utiles:

:swapname: obtenir le nom que vim utilise pour le fichier d'échange pour le tampon actuel ( :h :swapname) :recover: récupère le fichier sélectionné, comme lorsque vous démarrez vim et appuyez sur R( :h :recover)

Consultez l'aide:

Vim a une section entière du manuel de l' utilisateur sur la récupération: :usr_11.txt
l'aide de référence de vim sur les fichiers d'échange: :h swap-file, h recovery
Aide sur l'option de répertoire (pour définir l'emplacement du fichier d'échange)::h 'directory'

Edit: exemple modifié pour définir le répertoire, comme indiqué dans les commentaires de @B Layer

flemingfleming
la source
Qu'en est-il lorsque vous vous retrouvez avec plusieurs fichiers d'échange? En raison de nombreuses connexions abandonnées?
leeand00
1
Je l'ai mentionné dans le deuxième paragraphe de "Diff the Differencces". Une fois que vous avez utilisé les différences pour déterminer les modifications que vous souhaitez conserver, supprimez tous les fichiers temporaires et les anciens fichiers d'échange que vous avez effectués (vous savez maintenant où se trouvent tous les fichiers d'échange).
flemingfleming
1
Pour info, vous n'avez pas besoin d'utiliser exec... set directory^=$HOME/.vim/swap//fonctionne très bien tant qu'il $HOMEs'agit d'une variable d'environnement initialisée. Tu vois :h expand-env. Fonctionne également avec dictionary, undodiret backupdirpour n'en nommer que quelques-uns.
Couche B
Merci de me le rappeler! J'utilise une variable vimscript dans ma configuration à la place, d'où l'exécuter, et les variables d'environnement oubliées n'en ont pas besoin. En y réfléchissant, je devrais probablement simplement utiliser vim pour définir une variable d'environnement à la place.
flemingfleming
2

Personnellement, j'ai désactivé les fichiers d'échange et de sauvegarde, car cela a tendance à créer des fichiers d'échange et des fichiers de sauvegarde partout et crée fréquemment des conflits. L'annulation persistante de Vim a été beaucoup plus fiable et sans erreur.

Vim a actuellement une annulation persistante, c'est une méthode de sauvegarde beaucoup plus fine. Chaque fois que vous appuyez sur Esc, l'état actuel du fichier est capturé.

Vous pouvez utiliser des :undolistplugins comme gundo ou undo-tree pour parcourir votre historique d'annulation.

Pour utiliser vim de cette façon:

  • créer un répertoire où l'historique de modification de chaque fichier sera capturé
  • dire à vim d'utiliser ce répertoire
  • activer l'annulation persistante

Dans la coque:

mkdir ~/.vim/undodir

À Vim

set undodir=~/.vim/undodir
set undofile

Pour désactiver les fichiers d'échange: :set noswapfile

alpha_989
la source
1
Il y a quelques gros problèmes avec cette réponse. 1. L'annulation persistante résout un problème différent pour échanger des fichiers (et 'writebackup'résout un autre problème). L'activation de l'annulation persistante n'aidera pas en cas de panne de votre ordinateur. Vous pouvez affirmer que les fichiers d'échange ne sont pas nécessaires pour d'autres raisons (stabilité du système d'exploitation moderne, existence d'onduleurs), mais vous ne l'avez pas fait dans cette réponse. 2. le réglage 'undodir' n'active pas l'annulation persistante! Vous devez définir 'undofile'pour cette
Rich