¿Cómo deshacerse de las advertencias al abrir un archivo que tiene un archivo .swp?

46

¿Cómo puedo deshacerme de las molestas advertencias cuando abro un archivo que tiene un archivo .swp? O, ¿cómo no genero los archivos .swp? Advertencia de ejemplo:

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
fuente

Respuestas:

44

Este mensaje es bastante importante si le importa no perder el texto que potencialmente no ha guardado. Debería no ser considerado molesto, y debe no hacer que se elimine toda prisa el archivo de intercambio o configurar vimpara funcionar sin ella.

Cualquier archivo con el que edite vimtendrá un archivo de intercambio correspondiente mientras edita , que se vimutiliza para realizar un seguimiento de los cambios. Cuando deje de editar un archivo, vimdescartará automáticamente el archivo de intercambio correspondiente. Por lo tanto, la existencia de un archivo de intercambio y su intento de escribir sobre el archivo original deben ser motivo de consideración y acción apropiada.

Los dos escenarios presentados en el mensaje ( E325: ATTENTION Found a swap file) son en realidad bastante comunes: (1) o bien otro vimprograma está editando el mismo archivo que está tratando de editar (en realidad podría ser otra persona, en cuyo caso realmente no tendría sentido simplemente eliminar ciegamente el archivo de intercambio, o podría ser usted en otra ventana o pestaña de terminal), o (2) una vimsesión anterior se bloqueó (la mayoría de las veces esto ocurre cuando está editando de forma remota, y la sesión de red se corta) en la que caso de que la sesión vim no salga normalmente y el .swparchivo se quede atrás; otro ejemplo de este segundo escenario es que accidentalmente cerró la ventana o pestaña del terminal que tuvo una vimsesión activa o en segundo plano ).

Cuando encuentro este mensaje, primero pienso si estoy editando este archivo en otra ventana o pestaña de terminal, ya que normalmente opero con varias ventanas de terminal con varias pestañas cada una:

ingrese la descripción de la imagen aquí

Si me doy cuenta de que estoy editando en otro lugar y puedo volver a él , entonces presiono la qtecla para (Q)uitesta sesión adicional y vuelvo a editar a través de la vimsesión original .

A veces, si no estoy completamente seguro, (Q)uitcorro jobspara verificar si estoy corriendo vimexactamente en el mismo terminal; si no aparece nada, corro ps -ef | grep vimpara verificar si estoy ejecutando en vimotro lugar (es decir, en otra ventana o pestaña de terminal). El punto es que siempre trato de reanudar la edición a través de la vimsesión original .


Si estoy seguro de que no puedo volver a la sesión de edición original, y todavía se me presentan las siguientes opciones, entonces presiono rpara (R)ecover.

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

Al presionar r, verá un mensaje como este:

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, por otro lado, ya no me enfrento a esas opciones, porque estoy en el indicador de comandos de la shell, entonces ejecuto vimcon la -ropción, de la siguiente manera:

vim -r notes

El mensaje resultante será similar:

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

De cualquier manera, presione ENTERpara continuar y verá su archivo.

Nota: Si Vim tiene dudas sobre lo que encontró, mostrará un mensaje de error e insertará líneas con "???" en el texto. Si ve un mensaje de error mientras se recupera, busque en el archivo "???" para ver qué pasa Es posible que desee cortar y pegar para obtener el texto que necesita.

La observación más común es "??? LINES MISSING". Esto significa que Vim no puede leer el texto del archivo original. Esto puede suceder si el sistema se bloquea y no se guardan partes del archivo original.

Dicho esto, nunca he visto esas ???marcas, por lo que esto debe ser un hecho realmente raro .


A continuación, guarde (es decir, escriba) el contenido en otro archivo (generalmente solo agrego "2" al final del nombre del archivo original):

:w notes2

A continuación, cierre forzosamente esta vimsesión:

:q!

A continuación, compare los dos archivos:

diff notes notes2

Si diffno devuelve nada , eso significa que no hay diferencia, y es seguro eliminar tanto el archivo de intercambio como el segundo archivo:

rm .notes.swp notes2

En este punto, abra el archivo original y proceda como si nunca hubiera habido un problema:

vim notes

Si diffdevuelve algo , eso significa que el archivo original (a través del archivo de intercambio) tuvo cambios que, gracias a la recuperación, se guardaron en el segundo archivo.

Dado que esos cambios se capturan en el segundo archivo, puede eliminar el archivo de intercambio y sobrescribir el archivo original con el segundo:

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

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

En este punto, abra el archivo original y proceda como si nunca hubiera habido un problema:

vim notes

Esto parece mucho trabajo, pero una vez que te acostumbras al flujo de trabajo, toma como 20 segundos como máximo.

usuario664833
fuente
2
No puedo creer que esta no sea la respuesta aceptada. Es perfecto. +1
David
Mucho mejor que la respuesta aceptada. ¡Ojalá tuviéramos una manera de abordar esto!
Michael Durrant
1
No siempre es el caso que el mensaje sea útil. Si estoy editando un archivo, me importa si el archivo ha cambiado desde que comencé a editar , en este momento trato de guardarlo , no si también lo estoy editando en otra ventana vim. Está perfectamente bien para mí abrir un archivo en dos terminales, siempre y cuando los guardados en el archivo no se intercalen. Vim solo necesita regañarme cuando trato de guardar, no cuando lo abro.
Ken Simon
Lamentablemente, esto no responde a la pregunta, solo dice que no debería ignorar la pantalla de la queja. MI escenario es que ya tengo el archivo abierto en vim (para editar, tal vez), quiero ver diferentes partes del archivo al mismo tiempo una al lado de la otra, y no quiero búferes divididos porque clang_complete sigue cambiando el tamaño de los búferes . En este caso, realmente quiero saber cómo abrir un archivo de solo lectura en Vim y hacer que ignore el archivo de intercambio.
Lelanthran
@Lelanthranvim -n file_name
usuario664833
19

El mensaje pegado sugiere que todavía tiene abierto el archivo "notas" en otra sesión de Vim. Definitivamente no es una buena idea editar un archivo que se está editando en otro lugar.

Si ese mensaje es incorrecto, debe determinar cómo su sesión de Vim salió incorrectamente y evitarlo en el futuro.

En cuanto a la recuperación, puede ser un problema en este caso, ya que las "notas" son más nuevas que el archivo Vim .swp asociado, pero aún puede intentarlo. Solo asegúrese de copiar primero el archivo de "notas" en una ubicación de respaldo.

Sería una buena idea leer " :help recover.txt".

La lección aquí es que se supone que no debes estar viendo este mensaje, y que estás diciendo que algo salió mal en alguna parte. (Probablemente) no es culpa de Vim.

Si en este punto todavía está absolutamente decidido a no permitir que Vim cree archivos .swp para poder recuperarse de bloqueos y otros problemas relacionados, puede poner " set noswapfile" en ~/.vimrc.

Heptita
fuente
1
¡TEN CUIDADO! Casi pierdo todo mi trabajo jugando con VIM. Copie su código antes de intentar cualquier cosa.
Squirrl
Sugiero encarecidamente a los lectores que revisen la respuesta del usuario664833 ( Este mensaje es realmente bastante importante ... ), ya que creo que da mucha más información y consejos que esta respuesta en mi opinión
Michael Durrant
11

Puede usar -n para abrir vim sin usar un archivo de intercambio :

Para hacer esto todo el tiempo, solo pon

alias vim='vim -n' 

en su archivo .bashrc o .bash_aliases

si alguna vez necesita ejecutar vim sin la opción -n, simplemente ejecute

\vim
Brad Parks
fuente
3
No recomendaría ejecutar siempre sin un archivo de intercambio, pero "-n" es precisamente lo que necesitaba. Yo uso un archivo de intercambio, normalmente. Sin embargo, cuando uso Vim como herramienta de diferencias, me gustaría poder ver las diferencias de los archivos que estoy editando sin que esas diferencias me den este mensaje o interfieran con mi archivo de intercambio.
Agentlien
1
Me gusta esta respuesta: es breve, es precisa y responde la pregunta real.
Lelanthran
2

vim eliminará el archivo .swp generado cuando salga correctamente.

Ignacio Vazquez-Abrams
fuente
1

¿Cómo puedo deshacerme de las molestas advertencias cuando abro un archivo que tiene un archivo .swp?

Use la opción de mensaje corto en su ~/.vimrc:

set shortmess=A

Que también es el valor predeterminado cuando se ejecuta el modo POSIX.

Sin embargo, no haga esto : es como quitar las bolsas de aire de su automóvil para aumentar la eficiencia del combustible. A la larga, pasarás más tiempo recuperándote de lo que respondiste la pregunta.

obispo
fuente
1
Suponiendo un sistema de usuario único, no es una configuración tan horrible. Me gusta tener muchas pestañas de terminal abiertas, y a veces quiero editar un archivo que ya he enterrado en alguna otra pestaña. Si quiero hacer algunas ediciones rápidas, está bien. Si me encuentro de nuevo en la otra ventana vim, la belleza es que me va a advertir a continuación que el archivo ha cambiado antes de guardarlo, y puedo hacer una rápida :epara ver lo que ha pasado (incluyendo una rápida ua deshacer de nuevo a lo Tenía en el búfer.) Me gusta mucho más que ser molestado por tener un archivo abierto.
Ken Simon
1

Esto me sucedió cuando mi terminal cerró inesperadamente mi conexión con vi open.

Afortunadamente no tuve cambios perdidos.

Para eliminar esa advertencia y descartar el intercambio:

  1. Encuentra la identificación del proceso mirando process ID: 2251 (still running), en este caso es 2251
  2. Verifica que tienes la identificación correctaps 2251
  3. Mata el proceso usandokill 2251

Y eso es.

Recuerde que los archivos de intercambio están ahí para protegerlo, y no debe deshabilitarlos por completo.

kintsukuroi
fuente
Pero, ¿y si no hay vi(m)proceso?
Scott
-2

He resuelto este problema en tres simples pasos:

1 :) Ejecute "ls -la" donde existe el archivo para que pueda ver el archivo .swp para el mismo.

2 :) Ahora "rm -i * .swp", es decir, elimine el archivo ".swp" del directorio.

3 :) Ahora confirme si el archivo ".swp" se ha eliminado.

4 :) Ahora disfruta de esas advertencias.

Ankur Srivastava
fuente
3
¿Por qué en el mundo sugerirías rm -rfeliminar un archivo? Lo reemplacé -rfpor uno más sensato-i
Nifle