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

84

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.

Peeja
la source
Voir ici vi.stackexchange.com/questions/13518/… "L'option" Supprimer "n'est pas affichée si le processus Vim est toujours en cours d'exécution" et notez le commentaire concernant les sessions TMUX, c.-à-d. Assurez-vous que Vim n'est pas en cours d'exécution (également, écran GNU) en arrière-plan quelque part, voir ici vi.stackexchange.com/questions/13518/…
zenaan

Réponses:

82

Une manière un peu plus simple:

Depuis l'émulateur de terminal:

vim filename

Ensuite, choisissez Récupérer . Si vous souhaitez supprimer le swap, vous écrivez (enregistrez), puis procédez comme suit depuis 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).

miyalys
la source
16
Je n'ai pas d' deleteoption, il n'y a que: [O] pen (E) dit (R) ecover (Q) uit (A) bort, que dois-je faire?
Arne
4
@Arne: D'après mon expérience, cela signifie généralement que le fichier est actuellement ouvert dans une autre instance de vim?
miyalys
1
L'option [D] elete n'est apparue qu'après la mise à jour de Vim 7.4
jmlarson
@Arne j'ai eu le même problème. Mais après un certain temps, environ une heure, j'ai redémarré vim et l'option était disponible. Le PC n'a pas été redémarré à cette époque. vim peut penser qu'un autre processus vim est en cours d'exécution. C'est pourquoi il ne montre pas l'option.
ka3ak
6
Pour ceux qui disent ne pas voir d’ (D)eleteoption, voir :help swap-exists; citer C'est-à- On Unix this choice is only offered when the process that created the swap file does not appear to be running.dire que vous avez peut-être un autre processus en cours d'exécution qui masque cette option. Cela pourrait aussi expliquer pourquoi vous avez un swpfichier en premier lieu!
Lqueryvg
39

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 que vous souhaitez vous en débarrasser, vous pouvez utiliser la commande suivante dans le répertoire lorsque vim n'est pas en cours d'exécution (même dans une autre fenêtre ou même avec un autre nom de connexion). session):

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

Un peu d' inspiration et de pensées me sont venues de suppression des fichiers de .swp indésirable sur les groupes Google. Ceci supprimera tous les fichiers dont le nom se termine avec .swk, .swl, .swm, .swn, .swoou .swp dans l'arborescence du répertoire courant.

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

  • Comme indiqué, il recherche dans l' arborescence de répertoires actuelle  ; 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é, il supprimera tous les fichiers dont le nom se termine avec .swk, .swl, .swm, .swn, .swoou .swp, et pas seulement .swpGary Johnson a déclaré :

    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 ce 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.  le rouble suggè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: «Attention, bien que cette solution soit plus complète, elle supprimera tous les fichiers image .svg et les fichiers flash .swf adobe. Vous pouvez modifier l'expression régulière si vous travaillez avec ces fichiers. » Il correspond également .sav, .snd(données sonores), .sql, .src, .srt(SubRip format vidéo de sous - titres), et bien d' autres extensions communes.

  • C'est peut-être exagéré. Comme indiqué, il supprimera tous les fichiers dont le nom se termine avec .swk, .swl, .swm, .swn, .swoou .swp. Mais, apparemment, les fichiers d'échange vim sont généralement des fichiers «pointés». Si vous modifiez hello.cpp, le fichier d'échange peut être .hello.cpp.swp. Comme indiqué (mais non expliqué) dans la 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
    
Shwaydogg
la source
14

Type ls -aqui répertorie TOUS les fichiers du répertoire

tapez rm .whatever.your.swpet appuyez surenter

C'est si simple.

Tout fichier qui montre 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.

Wolfy
la source
4
Ce n'est pas très simple, cependant. Je dois quitter Vim, naviguer dans le répertoire de swap, me rappeler le nom du fichier et éventuellement décider si c'est file.swpou file.swo. Ensuite, je dois retourner là où j'étais. Frapper :eest une solution beaucoup plus simple.
Peeja
1
ls: cannot access +A: No such file or directory
Jonathan
voici
7

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.
toogley
la source
6
Quelqu'un peut-il me dire pourquoi vim ne peut pas avoir de comportement sensible par défaut, sans plugins?
Pavel Šimerda
6

Non, autant que je sache, rien ne manque. Vimcontinue 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 sur d:)

Avio
la source
11
Vraiment? Je veux dire, je le savais. Mais c'est stupide. Ce n'est certainement pas "simple".
Peeja
1
À propos, quelle est la différence entre arrêter et abandonner?
trusktr
5
il n'y a pas d'option de suppression dans mon cas. que devrais-je faire? (J'ai sauvé, arrêté et rouvert)
Paschalis
Vous n'avez pas besoin de quitter vim d'abord, il vous suffit de taper: e <retour> une fois que vous avez choisi "edit anyway" ou "recover" sur le fichier, et vous aurez l'option de le supprimer
00prometheus
2

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%.

Oli Comber
la source
D'accord, y a-t-il un moyen de demander à vim de me donner le chemin d'accès au fichier d'échange? Je suis heureux d'exécuter une deuxième commande pour supprimer le fichier d'échange (en fait, j'aime le caractère explicite de cela), mais j'aimerais une commande pour supprimer le fichier d'échange où qu'il se trouve. Par exemple, j'ai un répertoire swapfile séparé. Si deux fichiers ouverts ont le même nom de base, je ne peux pas décider par programme quel est le fichier d'échange correct pour le tampon actuel.
Peeja
1
C'est vrai, mais fournir une simple option "Récupérer et supprimer" serait bien. C'est aussi probablement facile à mettre en œuvre. Je le ferai un jour quand j'aurai fini d'aller à l'école si cela n'a pas déjà été fait.
trusktr
1
La plupart des commandes unix sont simples, explicites et ont un comportement par défaut raisonnable. La récupération de Vim n’est pas simple, l’UX est aussi mauvaise que sous LibreOffice, le comportement est tout à fait faux et le résultat, dans de nombreux cas, est la perte de données.
Pavel Šimerda
1

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, pour conserver les fichiers en mémoire.

Dmitrii
la source
Selon le PO, les fichiers d'échange sont utiles, donc les désactiver peut ne pas être la meilleure option.
Kusalananda
Ne désactivez pas les fichiers d'échange. Si votre machine tombe en panne, vous perdrez votre travail.
Lqueryvg
Bien sûr, cette option implique des risques, et comme je sais, ces fichiers d'échange ont été créés à la création de vi * editiors lorsque les plantages se produisaient très souvent. Maintenant, je pourrais dire que vim fonctionne de manière stable et qu’il existe en tant qu’héritage, à mon humble avis.
Dmitrii
1

Voici une regex plus complète 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 flash .swf adobe. Vous voudrez peut-être modifier l'expression régulière si vous travaillez avec ces fichiers.

rouble
la source
1

Voici un extrait à ajouter .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 la situation difficile atteinte, l’exécution :DeleteFileSwaps est excellente. C’est formidable si vous combinez avec :windoou des :tabdocommandes.

:tabdo DeleteFileSwaps 

Détails supplémentaires : Un fichier peut avoir plus d'un fichier d'échange. La raison parce que le fichier d'échange, avec l'extension de .swp, existe toujours et vimcontinuera à en créer de nouveaux à cause de cela. Pour savoir s'il .swpexiste:

  • Avec le fichier cible ouvert dans vim, exécutez-le :swpour 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.

Nate
la source
0

Du manuel :h swap:

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

Joseph Harriott
la source
Attention ... ce n'est probablement pas le nom du fichier que vous devez supprimer. Tant que vous n'avez pas supprimé le .swpfichier, la :swcommande vous donnera probablement le nom du .swofichier - ce qui n'est pas ce que vous souhaitez supprimer.
Lqueryvg
0

si on vous le demande, appuyez sur Dpour 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
Kaleem Ullah
la source
1
On me demande, mais mon choix est de récupérer . La question est de savoir comment le supprimer juste après ma récupération, car ce n'est plus nécessaire. Cela ressemble à un échec de vim de ne pas le faire pour moi. Mais la réponse acceptée est le flux de travail le plus propre que j'ai trouvé jusqu'à présent.
Peeja
-1

Vous pouvez utiliser,

rm -f .<filename>.<ext>.swp

Exemple:

rm -f .rc.local.swp
RizonBarns
la source
Cela fonctionne techniquement, mais il est loin d'être aussi facile avec la réponse acceptée actuellement.
Peeja
Plus <ext>est redondant ici car un nom de fichier sous Linux ne comporte aucune extension ou plus.
Pavel Šimerda