Comment se débarrasser des avertissements lors de l'ouverture d'un fichier contenant un fichier .swp?

46

Comment puis-je me débarrasser des avertissements ennuyeux lorsque j'ouvre un fichier qui contient un fichier .swp? Ou bien, comment ne pas générer les fichiers .swp? Exemple d'avertissement:

E325: ATTENTION
Found a swap file by the name ".notes.swp"
          owned by: james   dated: Fri Dec  3 17:38:07 2010
         file name: ~james/school/se/project-dir/rottencucumber/doc/notes
          modified: no
         user name: james   host name: james-laptop
        process ID: 2251 (still running)
While opening file "notes"
             dated: Fri Dec  3 18:46:10 2010
      NEWER than swap file!

(1) Another program may be editing the same file.
    If this is the case, be careful not to end up with two
    different instances of the same file when making changes.
    Quit, or continue with caution.

(2) An edit session for this file crashed.
    If this is the case, use ":recover" or "vim -r notes"
    to recover the changes (see ":help recovery").
    If you did this already, delete the swap file ".notes.swp"
    to avoid this message.

Swap file ".notes.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort:
James
la source

Réponses:

44

Ce message est en fait assez important si vous vous souciez de ne pas perdre de texte que vous n'avez potentiellement pas sauvegardé. Cela ne devrait pas être considéré comme agaçant et ne devrait pas vous amener à supprimer à la hâte le fichier d'échange ni à configurer vimson exécution.

Tout fichier que vous éditez avec vimvous un fichier d'échange correspondant lorsque vous modifiez , qui vimutilise pour garder une trace des changements. Lorsque vous quittez l'édition d'un fichier, vimle fichier d'échange correspondant est automatiquement ignoré. Par conséquent, l'existence d'un fichier d'échange et votre tentative d'écriture sur le fichier d'origine doivent être prises en compte et une action appropriée doit être entreprise.

Les deux scénarios présentés dans le message ( E325: ATTENTION Found a swap file) sont en fait assez commun: (1) soit un autre vimprogramme édite le même fichier que vous essayez de modifier (il pourrait en fait être une autre personne - auquel cas il vraiment ne serait pas logique supprimer aveuglément le fichier d'échange - ou cela pourrait être vous dans une autre fenêtre ou un autre onglet du terminal), ou (2) une vimsession précédente s'est bloquée (le plus souvent, cela se produit lorsque vous éditez à distance et que la session réseau est coupée - dans lequel Si la session vim n’est pas sortie normalement et que le .swpfichier reste en place, un autre exemple de ce second scénario est la fermeture accidentelle de la fenêtre ou de l’onglet du terminal contenant une vimsession active ou en arrière-plan .

Lorsque je rencontre ce message, je commence par réfléchir à la question de savoir si je modifie ce fichier dans une autre fenêtre de terminal ou un autre onglet, car je travaille normalement avec plusieurs fenêtres de terminaux avec plusieurs onglets:

entrez la description de l'image ici

Si je me rends compte que je suis en train d’éditer ailleurs, et que je peux y revenir , j’appuie sur la qtouche de (Q)uitcette session supplémentaire et je reviens à l’édition via la vimsession d’ origine .

Parfois , si je ne suis pas tout à fait sûr, je (Q)uitpuis courir jobspour vérifier si je suis en cours d' exécution vimdans le terminal exactement le même; si rien ne se présente, je cours ps -ef | grep vimpour vérifier si je cours vimailleurs (par exemple dans une autre fenêtre de terminal ou un autre onglet). Le fait est que j'essaie toujours de reprendre l'édition via la vimsession d' origine .


Si je suis certain de ne pas pouvoir revenir à la session d’édition initiale et que les options suivantes me sont encore proposées, j’appuie sur rpour (R)ecover.

Swap file ".notes.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort:

En appuyant sur r, vous verrez un message comme celui-ci:

Swap file ".notes.swp" already exists!
"notes" 18L, 46C
Using swap file ".notes.swp"
Original file "/private/tmp/notes"
Recovery completed. Buffer contents equals file contents.
You may want to delete the .swp file now.

Press ENTER or type command to continue

Si, en revanche, je ne suis plus confronté à ces options, car je suis à l'invite du shell, je lance vimavec l' -roption, comme suit:

vim -r notes

Le message résultant sera similaire:

Using swap file ".notes.swp"
Original file "/private/tmp/notes"
Recovery completed. Buffer contents equals file contents.
You may want to delete the .swp file now.

Press ENTER or type command to continue

Dans tous les cas, appuyez sur ENTERpour continuer et vous verrez votre fichier.

Note: Si Vim a des doutes sur ce qu'il a trouvé, il va donner un message d'erreur et insérer des lignes avec "???" dans le texte. Si vous voyez un message d'erreur pendant la récupération, recherchez dans le fichier "???" pour voir ce qui ne va pas. Vous voudrez peut-être couper et coller pour obtenir le texte dont vous avez besoin.

La remarque la plus courante est "??? LINES MISSING". Cela signifie que Vim ne peut pas lire le texte du fichier d'origine. Cela peut arriver si le système est tombé en panne et que des parties du fichier d'origine n'ont pas été enregistrées.

Cela dit, je n'ai jamais vu ces ???marques, alors cela doit être un événement vraiment rare .


Ensuite, sauvegardez (c’est-à-dire écrivez) le contenu dans un autre fichier (en général, j’ajoute simplement "2" à la fin du nom de fichier original):

:w notes2

Ensuite, forcez-vous à quitter cette vimsession:

:q!

Ensuite, comparez les deux fichiers:

diff notes notes2

Si le diffrésultat ne renvoie rien , cela signifie qu'il n'y a pas de différence et qu'il est prudent de supprimer le fichier d'échange et le deuxième fichier:

rm .notes.swp notes2

A ce stade, ouvrez le fichier d'origine et procédez comme s'il n'y avait jamais eu de problème:

vim notes

Si le diffretourne quelque chose , cela signifie que le fichier d'origine (via le fichier d'échange) contient des modifications qui, grâce à la restauration, ont été enregistrées dans le second fichier.

Puisque ces modifications sont capturées dans le second fichier, vous pouvez supprimer le fichier d'échange et remplacer le fichier d'origine par le second:

rm .notes.swp
remove .notes.swp? y

mv notes2 notes
overwrite notes? (y/n [n]) y

A ce stade, ouvrez le fichier d'origine et procédez comme s'il n'y avait jamais eu de problème:

vim notes

Cela semble beaucoup de travail, mais une fois que vous vous êtes habitué au flux de travail, cela prend environ 20 secondes maximum.

utilisateur664833
la source
2
Je ne peux pas croire que ce n'est pas la réponse acceptée. C'est parfait. +1
David
tellement mieux que la réponse acceptée. Si seulement nous avions un moyen de résoudre ce problème!
Michael Durrant
1
Le message n'est pas toujours utile. Si je modifie un fichier, je tiens à savoir si le fichier a changé depuis que j'ai commencé à le modifier , au moment où j'essaie de le sauvegarder , et non pas si je le modifie également dans une autre fenêtre de vim. C'est tout à fait correct pour moi d'ouvrir un fichier dans deux terminaux, tant que les enregistrements dans le fichier ne sont pas entrelacés. Vim n'a vraiment besoin que de me harceler quand j'essaie de sauver, pas quand je l'ouvre.
Ken Simon
Malheureusement, cela ne répond pas à la question, il dit simplement que je ne devrais pas ignorer l'écran nag. Mon scénario est que le fichier est déjà ouvert dans vim (pour l’édition, peut-être), que je souhaite voir différentes parties du fichier en même temps, et que je ne souhaite pas de scission des tampons car clang_complete continue à redimensionner les tampons. . Dans ce cas, je souhaite réellement savoir comment ouvrir un fichier en lecture seule dans Vim et le laisser ignorer le fichier d'échange.
Lelanthran
@Lelanthranvim -n file_name
user664833
19

Le message collé suggère que le fichier "notes" est toujours ouvert dans une autre session Vim. Ce n'est certainement pas une bonne idée de modifier un fichier en cours de modification ailleurs.

Si ce message est incorrect, vous devez déterminer comment votre session Vim s'est terminée de manière incorrecte et éviter cela à l'avenir.

En ce qui concerne la récupération, cela peut être un problème dans cette instance car "notes" est plus récent que le fichier Vim .swp qui lui est associé, mais vous pouvez toujours essayer. Assurez-vous simplement de copier d'abord votre fichier "notes" dans un emplacement de sauvegarde.

Ce serait une bonne idée de lire " :help recover.txt".

La leçon à tirer ici est que vous n'êtes pas censé voir ce message et que vous voulez dire quelque chose qui ne va pas quelque part. Ce n'est (probablement) pas la faute de Vim.

Si, à ce stade, vous êtes absolument absolument déterminé à ne pas laisser Vim créer des fichiers .swp afin de pouvoir récupérer des crashs et d’autres problèmes connexes, vous pouvez insérer " set noswapfile" dans ~/.vimrc.

Heptite
la source
1
FAITES ATTENTION! J'ai presque perdu tout mon travail en jouant avec VIM. Copiez votre code avant d'essayer quoi que ce soit.
Squirrl
Je suggère fortement aux lecteurs de relire la réponse de user664833 ( Ce message est en fait assez important ... ) car je pense que cela donne de bien meilleures informations et conseils que cette réponse à mon humble avis
Michael Durrant
11

Vous pouvez utiliser -n pour ouvrir vim sans utiliser de fichier d'échange :

Pour le faire tout le temps, il suffit de mettre

alias vim='vim -n' 

dans votre fichier .bashrc ou .bash_aliases

si vous avez besoin d’exécuter vim sans l’option -n, lancez simplement

\vim
Brad Parks
la source
3
Je ne recommanderais pas de toujours utiliser un fichier d'échange, mais "-n" est en fait précisément ce dont j'avais besoin. J'utilise un fichier d'échange, normalement. Cependant, lorsque vous utilisez Vim en tant qu'outil de différenciation, j'aimerais pouvoir afficher les diffs de fichiers que je modifie sans que ces diffs ne me donnent ce message ou n'interfèrent avec mon fichier d'échange.
Agentlien
1
J'aime cette réponse - c'est court, c'est précis et ça répond à la question!
Lelanthran
2

vim supprimera le fichier .swp généré lorsque vous le quitterez correctement.

Ignacio Vazquez-Abrams
la source
1

Comment puis-je me débarrasser des avertissements ennuyeux lorsque j'ouvre un fichier qui contient un fichier .swp?

Utilisez l' option message court dans votre ~/.vimrc:

set shortmess=A

Ce qui est également la valeur par défaut lorsque vous utilisez le mode POSIX.

Cependant, ne faites pas ceci : c'est comme si vous retiriez les sacs gonflables de votre voiture pour augmenter l'efficacité énergétique. À long terme, vous passerez plus de temps à récupérer qu'à répondre à la question.

évêque
la source
1
En supposant un système mono-utilisateur, ce n'est pas si horrible d'une configuration. J'aime avoir beaucoup d'onglets de terminal ouverts, et parfois je veux éditer un fichier que j'ai déjà enterré dans un autre onglet. Si je veux faire quelques modifications rapides, c'est bien. Si je me retrouve dans l'autre fenêtre vim, la beauté est que ça va me mettre en garde alors que le fichier a changé avant que je l' enregistrer, et je peux faire rapidement :epour voir ce qui est arrivé (y compris un rapide upour annuler revenir à ce que J'avais beaucoup mieux aimé cela que d'être ennuyé d'avoir déjà un fichier ouvert.
Ken Simon
1

Cela m'est arrivé lorsque mon terminal a fermé de manière inattendue ma connexion avec vi ouvert.

Heureusement, je n'ai perdu aucun changement.

Pour supprimer cet avertissement et rejeter le swap:

  1. Trouver le processus id à regarder process ID: 2251 (still running), dans ce cas c'est 2251
  2. Vérifiez que vous avez le bon identifiantps 2251
  3. Tuez le processus en utilisantkill 2251

Et c'est tout.

N'oubliez pas que les fichiers d'échange sont là pour vous protéger et que vous ne devez pas les désactiver complètement.

kintsukuroi
la source
Mais que se passe-t-il s'il n'y a pas de vi(m)processus?
Scott le
-2

J'ai résolu ce problème en trois étapes simples:

1 :) Exécutez "ls -la" où le fichier existe afin de pouvoir afficher le fichier .swp de la même manière.

2 :) Maintenant, "rm -i * .swp" c'est-à-dire, supprimez le fichier ".swp" du répertoire.

3 :) Confirmez maintenant si le fichier ".swp" a été supprimé.

4 :) Profitez maintenant de ces avertissements.

Ankur Srivastava
la source
3
Pourquoi dans le monde suggérez-vous rm -rfde supprimer un fichier? J'ai remplacé -rfpar un plus raisonnable-i
Nifle