web-dev-qa-db-fra.com

Quel est le moyen le plus simple de supprimer les fichiers d'échange Vim que j'ai déjà récupérés?

Parfois, Vim se bloque et me laisse un fichier d'échange. C'est génial. Ensuite, j'ouvre le fichier que je modifiais et Vim me demande si je veux récupérer. Oui, merci. Quand c'est fini, Vim me dit:

You may want to delete the .swp file now.

Pourquoi, oui, je le fais. Comment je fais ça? Je pensais qu'il commencerait simplement à utiliser l'ancien fichier d'échange comme fichier d'échange à nouveau et à le nettoyer lorsque j'arrêterai de fumer, mais ce n'est pas vrai. Il en crée un nouveau, le nettoie et lorsque je rouvre le fichier, il me demande à nouveau de récupérer le premier.

Sûrement je manque quelque chose.

74
Peeja

Une manière un peu plus simple:

Depuis l'émulateur de terminal:

vim filename

Ensuite, choisissez récupérez, et si vous voulez supprimer le swap, vous écrivez (enregistrez), puis faites-le dans vim:

:e          // no argument needed. It assumes the current buffer.

... et choisissez supprimer cette fois.

Je viens de découvrir ça, et je pense que je vais le faire à partir de maintenant. Ensuite, je ne remplacerai pas accidentellement un fichier de travail non plus, si la récupération s'est avérée corrompue (bien que je ne l'aie jamais essayé auparavant).

Il existe également des astuces pertinentes sur cette question sur Stack Overflow (où j'ai trouvé cette astuce).

75
miyalys

Pour nettoyer TOUS les fichiers vim swap d'un répertoire:

Si vous êtes certain de ne pas avoir besoin de fichiers d'échange vim dans une arborescence de répertoires et souhaitez vous en débarrasser, vous pouvez utiliser la commande suivante dans le répertoire lorsque vim est pas en cours d'exécution (même dans un autre dossier). fenêtre ou même une session de connexion différente):

find . -type f -name "*.sw[klmnop]" -delete

Suppression des fichiers .spwp indésirables sur Google Groupes. Ceci supprimera tous les fichiers dont le nom se termine par .swk, .swl, .swm, .swn, .swo ou .swp dans l'arborescence de répertoires actuelle.

Cela peut ne pas être ce que vous voulez, pour plusieurs raisons:

  • Comme indiqué, il recherche dans le répertoire en cours tree _; c'est-à-dire le répertoire en cours et tous les sous-répertoires, de manière récursive. Cela va au-delà de ce que la question demande et peut être considéré comme excessif.
  • Comme indiqué, tous les fichiers dont le nom se termine par .swk, .swl, .swm, .swn, .swo ou .swp et non seulement .swp seront supprimés. Gary Johnson dit ,

    En outre, tous les fichiers d'échange ne se terminent pas par .swp. Si Vim doit créer un fichier d'échange et que celui-ci se terminant par .swp existe déjà, il utilisera l'extension .swo pour le nouveau fichier, puis .swn. Je pense que cela continue simplement à l'envers dans l'alphabet. Donc, en utilisant quelque chose comme
      \*.sw[nop] 
    

    ou même

      \*.sw? 
    

    serait plus approfondi.

    L'auteur original de this post dit:

    'klmnop' est peut-être exagéré, mais cela garantit généralement que je les ai tous.

  • D'autre part, il pourrait être moins performant. roublesuggère

    find . -type f \( -name ".*.s[a-v][a-z]" -o -name ".*.sw[a-p]" \) -delete
    

    qui correspond à toutes les extensions de trois lettres (minuscules) allant de .saa à .swp. Il ajoute: «Soyez prudent, même s’il s’agit d’une solution plus complète, elle supprimera tous les fichiers image .svg et les fichiers flash Adobe .swf. Vous voudrez peut-être modifier la regex si vous travaillez avec ces fichiers. ”Il correspond également à .sav, .snd (données audio), .sql, .src, .srt (format de sous-titre vidéo SubRip) et à de nombreuses autres extensions courantes.

  • C'est peut-être exagéré. Comme indiqué, tous les fichiers dont le nom se termine par .swk, .swl, .swm, .swn, .swo ou .swp seront supprimés. Mais, apparemment, les fichiers d'échange vim sont généralement des fichiers «pointés». Si vous éditez hello.cpp, le fichier d'échange peut être .hello.cpp.swp. Comme indiqué (mais non expliqué) dans réponse de rouble , il est préférable de ne supprimer que les fichiers dont le nom commence par un point; par exemple, avec

    find . -type f -name ".*.sw[klmnop]" -delete
    
32
Shwaydogg

Tapez ls -a qui liste TOUS les fichiers du répertoire

tapez rm .whatever.your.swp is et appuyez sur enter

C'est si simple.

Tout fichier affiché avec . devant est un fichier caché et n’est normalement pas vu.

Rappelez-vous que les changements sont immédiats et permanents, soyez donc prudent.

13
Wolfy

Btw. certains plugins le font automatiquement pour vous: autoswap.vim

d'après la description:

  1. Le fichier est-il déjà ouvert dans une autre session Vim dans une autre fenêtre?
  2. Si tel est le cas, basculez vers la fenêtre dans laquelle nous modifions ce fichier.
  3. Sinon, si fichier d'échange est plus ancien que le fichier lui-même, éliminez-le simplement.
  4. Sinon, ouvrez le fichier en lecture seule afin que nous puissions l'examiner et le sauvegarder.
7
toogley

Non, autant que je sache, rien ne manque. Vim continue de conserver le fichier d'échange comme sauvegarde jusqu'à ce que vous le supprimiez explicitement.

Enregistrez, quittez et rouvrez le même fichier. Vous serez invité (à nouveau) avec

[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort, (D)elete it

Maintenant, appuyez simplement sur d :)

6
Avio

Vim, comme la plupart des commandes Unix, est simple et explicite, plutôt que supposé et implicite.

Vous récupérez avec (r). Si vous n'aimez pas la récupération ou si la récupération est corrompue, vous pouvez la rejeter. Si vous aimez, vous pouvez enregistrer le fichier. Le fichier de récupération n'est pas supprimé pour vous car ce n'est pas explicite et ne sera pas correct pour 100% des situations.

Donc, vous (r) ecover, (w) rite et (q) uit, puis éditez à nouveau et choisissez (d) elete ou "rm .myfile.js.swp" et éditez à nouveau. Du point de vue de Vim, cela est rapide et constitue toujours un comportement correct à 100%.

2
Oli Comber

Ces fichiers étaient gênants pour moi aussi, mais j’ai défini l’option dans .vimrc - set noswapfile pour empêcher vim de le créer et, au lieu de cela, de conserver les fichiers en mémoire.

1
Dmitrii

Voici un regex plus complet pour nettoyer tous les fichiers d'échange vim basés sur le propre fichier gitignore de Github pour Vim

$ find ./ -type f \( -name "\.*\.s[a-v][a-z]" -o -name "\.*\.sw[a-p]" \) -delete

Attention, bien qu’il s’agisse d’une solution plus complète, elle supprimera tous les fichiers image .svg et les fichiers .swf Adobe Flash. Vous voudrez peut-être modifier l'expression régulière si vous travaillez avec ces fichiers.

1
rouble

Voici un extrait de code à ajouter dans .vimrc. Il supprime tous les fichiers d'échange associés au tampon de fichier actuel et réinitialise l'extension d'échange.

function! DeleteFileSwaps()
    write
    let l:output = ''
    redir => l:output 
    silent exec ':sw' 
    redir END 
    let l:current_swap_file = substitute(l:output, '\n', '', '')
    let l:base = substitute(l:current_swap_file, '\v\.\w+$', '', '')
    let l:swap_files = split(glob(l:base.'\.s*'))
    " delete all except the current swap file
    for l:swap_file in l:swap_files
        if !empty(glob(l:swap_file)) && l:swap_file != l:current_swap_file 
            call delete(l:swap_file)
            echo "swap file removed: ".l:swap_file
        endif
    endfor
    " Reset swap file extension to `.swp`.
    set swf! | set swf!
    echo "Reset swap file extension for file: ".expand('%')
endfunction
command! DeleteFileSwaps :call DeleteFileSwaps()

Une fois le problème rencontré, on peut exécuter :DeleteFileSwaps. C’est formidable si on le combine avec les commandes :windo ou :tabdo.

:tabdo DeleteFileSwaps 

Autres détails : Un fichier peut avoir plus d'un fichier d'échange. La raison en est que le fichier d'échange, avec l'extension .swp, existe toujours et que vim continuera à en créer de nouveaux. Pour savoir si .swp existe:

  • Avec le fichier cible ouvert dans vim, exécutez :sw pour obtenir le fichier d'échange actuel.
  • Vérifiez le répertoire dans lequel se trouve le fichier d'échange actuel.
  • Ensuite, vérifiez si le répertoire contient un fichier d'échange portant le nom du fichier ouvert et portant l'extension .swp.

L'extrait ci-dessus suit le même processus, mais supprime tous les fichiers d'échange.

J'espère que cela t'aides.

1
nate

si on vous le demande, appuyez sur D supprimer le fichier d'échange du fichier actuel.

si vous ne l'êtes pas, vous devez le faire manuellement.

une autre façon de faire est de:

pour localiser/rechercher un fichier:

find | grep ".searchRefineVertTabs.jsp.swp"

puis supprimez ce fichier:

rm ./.searchRefineVertTabs.jsp.swp
0
Kaleem Ullah

À partir du manuel :h swap:

Vous pouvez voir le nom du fichier d'échange en cours d'utilisation avec la commande: :sw[apname]

0
JosephHarriott