Comment détecter si les fichiers swp contiennent des modifications non enregistrées?

11

Lors de l'édition du code source à l'aide de gvim (v.7.4.488), je veux valider certaines modifications du vcs (j'utilise git 2.1.4 à partir de la ligne de commande dans Ubuntu linux).

git --status

montre quels fichiers j'ai modifiés. Cependant, il montre également le vim .*.swpdes tampons actuellement visibles (à la fois si le fichier contient des modifications non enregistrées et lorsque le fichier modifié est le même que le .*.swpfichier). Bien entendu, git peut ignorer ces fichiers ou vim peut stocker les fichiers d'échange dans un emplacement différent (voir vim.wikia ou cette question sur stackoverflow ). Mais j'aime les .*.swpfichiers qui apparaissent git --statuslorsqu'ils contiennent des modifications non enregistrées, car cela me signale que je valide des fichiers dans un état différent de celui dans lequel je pense qu'ils se trouvent.

Comment puis-je éviter que les faux positifs des .*.swpfichiers s'affichent git --statuslorsque le fichier enregistré est le même que le .*.swpfichier, tout en étant en mesure de voir que le fichier à valider est dans un état différent de celui que je modifie avec vim?

  • Est-il possible d'avoir uniquement des .*.swpfichiers-lorsque le fichier sur le disque et le fichier dans vim sont différents?
  • Existe-t-il un autre moyen de détecter les fichiers non enregistrés?

La combinaison des commentaires de @elyashiv et @VanLaser résulte en une méthode plus simple que de détecter si les fichiers d'échange impliquent des fichiers non enregistrés:

  1. ne laissez pas git ignorer les fichiers. *. sw [po];
  2. lors git --statusde la .*.sw[po]validation , si révèle des fichiers, faites un :wain vi; et,
  3. ajouter et valider.
Kasper van den Berg
la source
1
vous pouvez utiliser :wapour vous assurer qu'il n'y a pas de fichiers non enregistrés.
elyashiv
2
vraiment, c'est beaucoup plus "sain" de s'assurer que tous vos fichiers sont sauvegardés avant vous git commit...
VanLaser

Réponses:

8

vim -rsur la ligne de commande répertorie tous les fichiers d'échange dans le répertoire en cours et les répertoires temporaires, et s'ils contiennent des modifications non enregistrées. Recherchez la ligne qui dit modified: no/YES.

Je ne sais pas comment dire à Vim de chercher dans un répertoire différent, vous devrez donc passer à chaque répertoire contenant un fichier d'échange et l'exécuter vim -r. Vous pouvez proposer un script qui analyse la sortie de git status, ou qui est utilisé find -name '.*.sw[po]', puis qui s'exécute vim -rdans chaque répertoire, pour afficher tous les fichiers d'échange avec les modifications non enregistrées.

(J'utilise à la .*.sw[po]place de .*.swp, car parfois des .swofichiers sont créés en plus des .swpfichiers, lorsque vous modifiez un fichier qui a déjà un fichier d'échange. Des .swnfichiers peuvent également être créés si vous modifiez un fichier avec deux fichiers d'échange existants, mais je ne pense pas J'en ai déjà vu un dans la nature. Si vous êtes vraiment paranoïaque, vous pouvez utiliser .*.sw[a-p]ou simplement .*.sw?.)

Voir :help -rpour (un peu) plus d'informations sur l' -roption, ou :help recover.txtpour plus d'informations sur la récupération et l'échange de noms de fichiers.

Lithis
la source
1
Eh bien, les fichiers d'échange de Vim sont des fichiers cachés (précédés .du nom de fichier), de sorte que le bon schéma serait .*.sw[a-p](bien que dans les cas pathologiques, vous puissiez réellement arriver à la fin .foo.saa). Cela devrait également empêcher les fichiers Flash correspondants, car je doute que ce soit généralement un fichier caché.
jamessan
@jamessan L'interligne .est requis dans un glob de shell, mais *.swpfonctionne comme un argument pour find. Mais le leader .rend les choses plus simples. Merci!
Lithis
8
  • Est-il possible d'avoir uniquement des .*.swpfichiers-lorsque le fichier sur le disque et le fichier dans vim sont différents?

Oui. L'extrait ci-dessous (adapté du vimrc de tpope ) désactivera le fichier d'échange pour un tampon lorsqu'il n'est pas modifié, donc les fichiers d'échange n'existent que pour les fichiers modifiés.

autocmd CursorHold,BufWritePost,BufReadPost,BufLeave *
  \ if isdirectory(expand("<amatch>:h")) | let &swapfile = &modified | endif

Avertissement : étant donné que le fichier d'échange n'existe que lorsque le tampon est modifié, vous perdez l'utilisation du fichier d'échange comme verrou consultatif. Si le tampon n'est pas modifié, un autre Vim peut commencer à le modifier sans remarquer qu'il est déjà ouvert. Si le deuxième Vim enregistre avant que le premier n'effectue plus de modifications, alors elles ne seront pas remarquées jusqu'à ce que l'utilisateur essaie d'enregistrer ou quelque chose déclenche Vim pour vérifier si le fichier est modifié.

jamessan
la source