¿Cuál es la forma más fácil de eliminar archivos swap Vim de los que ya me he recuperado?


67

A veces Vim se estrella y me deja un archivo de intercambio. Eso es genial. Luego abro el archivo que estaba editando y Vim me pregunta si quiero recuperar. Yo sí, gracias. Cuando está hecho, Vim me dice:

You may want to delete the .swp file now.

Pues sí, lo hago. ¿Cómo puedo hacer eso? Pensé que simplemente comenzaría a usar el antiguo archivo de intercambio como un archivo de intercambio y lo limpiaría cuando lo dejara, pero eso no es cierto. Hace uno nuevo, lo limpia, y cuando vuelvo a abrir el archivo, nuevamente me pide que me recupere del primero.

Seguro que me estoy perdiendo algo.

Respuestas:


69

Una forma un poco más simple:

Desde el emulador de terminal:

vim filename

Entonces escoge recuperar , y si quieres borrar el swap te escribir (guardar) y luego hacer esto desde dentro de vim:

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

...y elige borrar esta vez.

Acabo de enterarme de esto y creo que lo haré de ahora en adelante. Entonces tampoco sobrescribiré accidentalmente un archivo de trabajo, si la recuperación resultó corrupta (aunque nunca antes lo había intentado).

También hay consejos relevantes. en esta pregunta en Stack Overflow (donde encontré este consejo).


13
Yo no un delete opción, solo hay: [O] pluma (E) dit (R) ecover (Q) uit (A) bort, ¿qué debo hacer?
Arne

3
@Arne: Desde mi experiencia, eso generalmente significa que el archivo está actualmente abierto en otra instancia de vim?
miyalys

1
La opción [D] elete solo apareció después de actualizar a Vim 7.4
jmlarson

@Arne tuve el mismo problema. Pero después de un tiempo, aproximadamente una hora, reinicié vim y la opción estaba disponible. PC no se reinició en ese momento. vim puede pensar que se está ejecutando otro proceso vim. Por eso no muestra la opción.
ka3ak

4
Para aquellos que dicen que no ven una (D)elete opción, ver :help swap-exists; citar On Unix this choice is only offered when the process that created the swap file does not appear to be running. Es decir. quizás tenga otro proceso vim en ejecución que está haciendo que esta opción esté oculta. También podría explicar por qué tienes una swp ¡Archivo en primer lugar!
Lqueryvg

32

Para limpiar TODOS los archivos de intercambio de vim en un directorio:

Si está seguro de que no necesita ningún archivo de intercambio vim en un árbol de directorios y desea deshacerse de ellos, puede usar el siguiente comando en el directorio mientras vim está no corriendo (ni siquiera en otra ventana o incluso una sesión de inicio de sesión diferente):

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

Un poco de inspiración y pensamientos vinieron de Eliminando archivos basura .swp en Grupos de Google. Esto borrará todos los archivos cuyos nombres terminan con .swk, .swl, .swm, .swn, .swoo .swp en el árbol de directorio actual.

Esto podría no ser lo que quieres, por varias razones:

  • Como se indica, busca en el directorio actual. árbol ; es decir, el directorio actual y todos los subdirectorios, recursivamente. Eso va más allá de lo que pide la pregunta, y puede ser considerado como una exageración.
  • Como se ha indicado, se borrarán todos los archivos. cuyos nombres terminan con .swk, .swl, .swm, .swn, .swoo .swp, y no solo .swp. Gary Johnson dice ,

    Además, no todos los archivos de intercambio terminan en .swp. Si Vim necesita crear un swap. archivo y uno que termina en .swp ya existe, Vim usará el extensión .swo para el nuevo y .swn después de eso. Creo que solo Continúa hacia atrás a través del alfabeto. Así que usando algo como
      \*.sw[nop] 
    

    o incluso

      \*.sw? 
    

    Sería más minucioso.

    El autor original de esta post dice

    'klmnop' puede ser una exageración, pero eso generalmente asegura que los reciba todos.

  • Por otro lado, podría ser inflexible. rublo sugiere

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

    que coincide con todas las extensiones de tres letras (minúsculas) que van desde .saa a .swp. Añade: "Tenga cuidado, aunque esta es una solución más completa, eliminará todos los archivos de imagen .svg y .swf adobe flash. Es posible que desee modificar la expresión regular si trabaja con esos archivos ". Tambien coincide .sav, .snd (datos de sonido), .sql, .src, .srt (Formato de subtítulos de video SubRip), y muchas otras extensiones comunes.

  • Podría ser una exageración. Como se ha indicado, se borrarán todos los archivos. cuyos nombres terminan con .swk, .swl, .swm, .swn, .swoo .swp. Pero, al parecer, los archivos de intercambio vim son comúnmente archivos de "punto". Si editas hello.cpp, el archivo de intercambio podría ser . hola.cpp.swp . Como se muestra (pero no se explica) en la respuesta de Rouble , es más seguro eliminar solo los archivos cuyos nombres comienzan con un punto; por ejemplo, con

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

13

Tipo ls -a que enumera TODOS los archivos en el directorio

tipo rm .whatever.your.swp es y pulsa entrar

Es así de simple.

Cualquier archivo que se muestre con . en frente es un archivo oculto y normalmente no se ve.

Recuerda que los cambios son inmediatos y permanentes, así que ten cuidado.


2
Sin embargo, eso no es muy simple. Tengo que dejar Vim, navegar por el directorio de intercambio, recordar el nombre del archivo y, posiblemente, decidir si es file.swp o file.swo. Entonces tengo que volver a donde estaba. Golpeando :e Es una solución mucho más simple.
Peeja

1
ls: cannot access +A: No such file or directory
Jonathan

esto es lo que necesito
user5510975

6

No, AFAIK no te estás perdiendo nada. Vim continúa guardando el archivo de intercambio como una copia de seguridad hasta que lo elimines explícitamente.

Simplemente guarde, salga y vuelva a abrir el mismo archivo nuevamente. Se le pedirá (de nuevo) con

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

Ahora solo presiona d :)


11
De Verdad? Quiero decir, lo sabía. Pero eso es una estupidez. Ciertamente no es "simple".
Peeja

1
Por cierto, ¿cuál es la diferencia entre dejar de fumar y abortar?
trusktr

5
No hay opción de Eliminar en mi caso. ¿Qué tengo que hacer? (Salvé, renuncié, y reabrí)
Paschalis

No necesita salir de vim primero, simplemente escriba: e & lt; return & gt; una vez que haya elegido "editar de todos modos" o "recuperar" en el archivo, y tendrá la opción de eliminarlo
00prometheus

6

Por cierto Algunos complementos lo hacen automáticamente por ti: autoswap.vim

de la descripción:

  1. ¿El archivo ya está abierto en otra sesión de Vim en alguna otra ventana?
  2. Si es así, cambie a la ventana donde estamos editando ese archivo.
  3. De lo contrario, si swapfile es más antiguo que el archivo en sí mismo, simplemente deshágase de él.
  4. De lo contrario, abra el archivo de solo lectura para que podamos verlo y guardarlo.

3
¿Alguien puede decirme por qué vim no puede tener un comportamiento sensible por defecto, sin complementos?
Pavel Šimerda

2

Vim, como la mayoría de los comandos de Unix, es simple y explícito, en lugar de suponer e implícito.

Te recuperas con (r). Si no te gusta la recuperación o la recuperación está dañada, puedes descartarla. Si te gusta, puedes guardar el archivo. El archivo de recuperación no se elimina porque no es explícito y no será correcto en el 100% de las situaciones.

Así que (r) cambia, (w) rito y (q) uit, luego edita de nuevo y elige (d) borrar o "rm .myfile.js.swp" y edita de nuevo. Esto es rápido y siempre es, desde el punto de vista de Vim, un comportamiento 100% correcto.


Bien, entonces, ¿hay alguna manera de que vim me dé la ruta al archivo de intercambio? Estoy feliz de ejecutar un segundo comando para eliminar el archivo de intercambio (de hecho, me gusta la explicación explícita de eso), pero me gustaría un comando para eliminar el archivo de intercambio en cualquier lugar. Por ejemplo, tengo un directorio de swapfile separado. Si dos archivos abiertos tienen el mismo nombre base, no puedo decidir cuál es el archivo de intercambio correcto para el búfer actual.
Peeja

1
Cierto, pero proporcionar una opción simple de "Recuperar y eliminar" sería bueno. También es probable que sea fácil de implementar. Lo haré algún día cuando termine de ir a la escuela si aún no se ha hecho.
trusktr

1
La mayoría de los comandos de Unix son simples, explícitos y tienen un comportamiento predeterminado sensible. La recuperación de Vim no es simple, el UX es tan malo como en LibreOffice, el comportamiento es simplemente incorrecto y el resultado, en muchos casos, es la pérdida de datos.
Pavel Šimerda

1

Aquí hay una expresión regular más completa para limpiar todos los archivos de intercambio vim basados ​​en el propio archivo gitignore de Github para Empuje

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

Sin embargo, tenga cuidado, si bien esta es una solución más completa, eliminará los archivos de imagen .svg y los archivos flash adobe .swf. Es posible que desee modificar la expresión regular si trabaja con esos archivos.


1

Aquí hay un fragmento para agregar .vimrc. Borra todos los archivos de intercambio que están asociado al búfer de archivos actual y restablecer la extensión de intercambio.

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()

Una vez encontrada la situación, uno puede ejecutar. :DeleteFileSwaps Esto es genial si se combina con :windo o :tabdo comandos

:tabdo DeleteFileSwaps 

Más detalles : Un archivo puede tener más de 1 archivo de intercambio. La razon porque El archivo de intercambio, con extensión de .swp, todavía existen y vim seguirá creando nuevos por eso. Para saber si .swp existe:

  • Con el archivo de destino abierto en vim, ejecute :sw para obtener el archivo de intercambio actual.
  • Compruebe el directorio en el que se encuentra el archivo de intercambio actual.
  • A continuación, compruebe si el directorio contiene un archivo de intercambio con el nombre del archivo abierto y tiene una extensión de .swp.

El fragmento de código anterior sigue el mismo proceso, pero elimina todos los archivos de intercambio.

Espero que esto ayude.


0

Del manual :h swap:

Puede ver el nombre del archivo de intercambio actual que se usa con el comando: :sw[apname]


Advertencia ... que probablemente no sea el nombre del archivo que necesita eliminar. Hasta que hayas eliminado el .swp archivo, el :sw comando probablemente le dará el nombre de la .swo archivo - que es no Lo que quieres borrar.
Lqueryvg

0

si te preguntan entonces presiona re para borrar el archivo de intercambio del archivo actual.

Si no lo eres, entonces tienes que hacerlo manualmente.

Una forma alternativa de hacer esto es:

para localizar / buscar el archivo:

find | grep ".searchRefineVertTabs.jsp.swp"

y luego borre este archivo:

rm ./.searchRefineVertTabs.jsp.swp

1
yo a.m pregunté, pero mi elección es recuperar . La pregunta es cómo borrarlo solo después Me he recuperado, ya que ya no es necesario. Parece un fracaso de vim no hacer eso por mí. Pero la respuesta aceptada es el flujo de trabajo más limpio que he encontrado hasta ahora.
Peeja

0

Estos archivos también eran molestos para mí, pero configuré la opción en .vimrc - set noswapfile para evitar que vim lo cree y, en cambio, mantenga los archivos en la memoria.


De acuerdo con el OP, los archivos de intercambio son útiles, por lo que desactivarlos podría no ser la mejor opción.
Kusalananda

No apague los archivos de intercambio. Si su máquina falla, perderá su trabajo.
Lqueryvg

Por supuesto, esta opción implica riesgos, y como sé, estos archivos de intercambio se hicieron en el momento de la aparición de vi * editiors cuando ocurrían fallos con mucha frecuencia. Ahora puedo decir que vim funciona de manera estable y existen como algo legado, imho.
Dmitrii

-1

Puedes usar,

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

Ejemplo:

rm -f .rc.local.swp

Esto funciona técnicamente, pero no es tan fácil en la respuesta actual aceptada.
Peeja

Más <ext> es redundante aquí ya que un nombre de archivo al menos en Linux incluye cero o más extensiones.
Pavel Šimerda
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.