¿Cómo puedo recuperar el archivo original de un archivo .swp?

57

Intenté abrir el archivo .swp usando viy catpero muestra basura.

zarna
fuente
¿Estás usando vi o vim?
frabjous
¿Funciona esto con emacs? (o sublime, nano, ed, etc.)
franco

Respuestas:

94
vim -r .swp

Esto entra en modo de recuperación y le brinda más información. Creo que esto es lo que quieres.

.swX-los archivos se quedan atrás si una sesión con un archivo no guardado se mata / se bloquea / sucede algo malo. También están presentes durante el tiempo que un búfer no guardado está abierto en una sesión de Vim. vim -rlee estos archivos temporales y recrea el contenido. Después de recuperarlo, solo guárdelo como de costumbre, por ejemplo :w newfilename.

Daniel Andersson
fuente
8
Precisamente lo que estaba buscando. Para cualquier otra persona, así es como se recuperan los archivos aún no guardados . Los métodos anteriores funcionan bien si ya existe un archivo, pero no puede abrir un archivo sin nombre.
Eric Hu
17

No necesita tener el archivo original para recuperar el .swp. Simplemente abra el archivo como si existiera. vim buscará el archivo con la extensión .swp y ofrecerá recuperarlo.

p.ej:

$ ls -a
. .. .test.txt.swp
$ vim test.txt
[...]
Swap file ".test.txt.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:

Simplemente presione R para recuperarlo y: wq el archivo

Editar: Tenga en cuenta que el archivo .swp solo contiene los cambios realizados en el archivo (ver comentario). Esto significa que deberá recuperar una copia reciente del archivo de la copia de seguridad y luego usar vim para recuperar los últimos cambios. Si no tiene una copia de seguridad del archivo, realmente no tiene suerte.

Vegar Westerlund
fuente
2
Definitivamente tiene que tener el archivo original, sin él los datos en el archivo .swp son inútiles. Consulte ": archivo de intercambio de ayuda". Hay situaciones en las que parece funcionar sin el archivo original, pero el archivo .swp solo almacena información de cambio y requiere algún punto de partida para aplicar esa información durante la recuperación.
Heptita
Estas en lo correcto, por su puesto. En realidad no sabía esto sobre vim. Pero es lógico ya que almacenar una copia completa del archivo original sería un gran desperdicio. Entonces la respuesta es: Recupere su archivo de la copia de seguridad, luego use vim para recuperar las últimas modificaciones.
Vegar Westerlund el
Almacenar todo el archivo en un solo swp sería un desperdicio, sí, pero veo un valor potencial en la acumulación de archivos swp (cuando está habilitado). Por la misma razón que edita mediante diff y parchea el original solo en el guardado explícito, tiene sentido para mí. si pudiera organizar una secuencia de diferencias, generar una suma parcial (fechas antes de hoy -> todas las noches; todas las noches + hoy = actual) etc. Encontré ': pre [serve] `en el manual, creo que funciona de esa manera. En cualquier caso, la línea más importante es:The original file is no longer needed for recovery.
John P
Parece que funciona, :preservey :set cpoptions=...&deja un archivo .swp y .swo en el directorio y ofrece recuperarse de cualquiera de ellos. Utilizando vim -r <file>puedes elegir entre .swp y .swo. Las ediciones posteriores generan .swn, .swm, etc., que parecen ser la suma parcial de swaps hasta ese punto. Puede volver a la versión de su gusto y editar (~ = fork) o guardar (~ = stash). Eventualmente, puede bloquear los archivos de intercambio, demonizar sus copias de seguridad, etc. Podría estar equivocado acerca de los detalles cuando se trata de archivos más grandes; tampoco estoy seguro de cómo eso afecta a los archivos de intercambio adicionales, vea a continuación.
John P
(Continuación): el búfer lleva los indicadores y es el búfer el que produce los archivos de intercambio, por lo que incluso si los indicadores no se configuran desde la configuración global o la carga automática, se heredan durante la recuperación. Para reemplazar una secuencia de recuperación con un solo archivo de recuperación, puede mover el intercambio que desea .swp y ocultar el resto. Me encantaría saber más sobre la superposición entre la recuperación de archivos y la administración de la sesión de Vim si alguien puede llenar los vacíos.
John P
7

Abra el archivo original con vim y elija la opción de recuperación.

Ignacio Vazquez-Abrams
fuente
No tengo el archivo original, solo tengo '.swp'
zarna
1
Eso es menos importante de lo que piensas. Ábrelo independientemente.
Ignacio Vazquez-Abrams
7

1 Abra el archivo de intercambio .file.swpenvim

2 :recoverrecuperará su archivo

Sathyam
fuente
7

Después de leer los comentarios de Vegar Westerlund y Heptite, quería saber en qué punto vim necesita el archivo original (o una copia de seguridad) para recuperarse de un archivo .swp. Esto es lo que hizo:

Abrí un archivo de 975 líneas, lo edité en la línea 949 (creando un .swparchivo) y eliminé el proceso, luego eliminé el original. $ vim Original_Fileme preguntó si quería recuperarme del .swp »> yes; solo se recuperaron las primeras 68 líneas y las últimas 34 líneas (comenzando 8 líneas sobre mi edición).

Luego repetí la prueba con archivos más pequeños: desde 20 hasta 200 líneas, el archivo .swp contenía el 100% del contenido original . Pero en 300 líneas, solo las primeras 68 y las 18 últimas líneas (comenzando 2 líneas por encima de mi edición) se incluyeron en el .swp.

Como conclusión, es bueno saber que vim siempre guarda el "encabezado" y la "parte inferior" del archivo en los archivos .swp. ¿Quizás haya una configuración para controlar la cantidad de líneas que debe contener un .swp?

tuk0z
fuente