¿Cómo detectar si los archivos swp contienen cambios no guardados?

11

Al editar el código fuente usando gvim (v.7.4.488), quiero confirmar algunos cambios en los vcs (estoy usando git 2.1.4 desde la línea de comandos en Ubuntu Linux).

git --status

muestra qué archivos cambié. Sin embargo, también muestra el vim .*.swpde los búferes visibles actualmente (tanto si el archivo contiene cambios no guardados como cuando el archivo editado es el mismo que el .*.swparchivo). Por supuesto, git puede ignorar estos archivos o vim puede almacenar los archivos de intercambio en una ubicación diferente (vea vim.wikia o esta pregunta en stackoverflow ). Pero me gustan los .*.swparchivos que aparecen git --statuscuando contienen cambios no guardados, ya que me indica que estoy confirmando archivos en un estado diferente al que creo que están.

¿Cómo puedo evitar los falsos positivos de los .*.swparchivos que aparecen git --statuscuando el archivo guardado es el mismo que el .*.swparchivo, mientras puedo ver que el archivo para confirmar está en un estado diferente al que estoy editando con vim?

  • ¿Es posible tener solo .*.swparchivos, cuando el archivo en el disco y el archivo en vim son diferentes?
  • ¿Hay alguna otra forma de detectar archivos no guardados?

La combinación de los comentarios de @elyashiv y @VanLaser resulta en un método más simple que detectar si los archivos de intercambio implican archivos no guardados:

  1. no dejes que git ignore los archivos. *. sw [po];
  2. cuando se compromete, si git --statusrevela cualquier .*.sw[po]archivo, haga un :waen vi; y,
  3. agregar y comprometer.
Kasper van den Berg
fuente
1
puede usar :wapara asegurarse de que no haya archivos no guardados.
elyashiv
2
Realmente, es mucho "más sano" para asegurarse de que todos los archivos se guardan antes de git commit...
VanLaser

Respuestas:

8

vim -ren la línea de comando enumerará todos los archivos de intercambio en el directorio actual y los directorios temporales, y si contienen cambios no guardados. Busque la línea que dice modified: no/YES.

No sé cómo decirle a Vim que busque en un directorio diferente, por lo que deberá cambiar a cada directorio que contenga un archivo de intercambio y ejecutarlo vim -r. Puede crear un script que analice la salida de git status, o se use find -name '.*.sw[po]', y luego se ejecute vim -ren cada directorio, para mostrar todos los archivos de intercambio con cambios no guardados.

(Yo uso en .*.sw[po]lugar de .*.swp, porque a veces .swose crean archivos además de .swparchivos, cuando editas un archivo que ya tiene un archivo de intercambio. Los .swnarchivos también se pueden crear si editas un archivo con dos archivos de intercambio existentes, pero no creo Alguna vez he visto uno en la naturaleza. Si eres realmente paranoico, puedes usarlo .*.sw[a-p]o simplemente .*.sw?.)

Consulte :help -r(un poco) más información sobre la -ropción, o :help recover.txtpara obtener más información sobre recuperación e intercambio de nombres de archivo.

Lithis
fuente
1
Bueno, los archivos de intercambio de Vim son archivos ocultos (que llevan .el nombre del archivo), por lo que el patrón correcto sería .*.sw[a-p](aunque en casos patológicos, en realidad podría llegar hasta el final .foo.saa). Eso también debería impedir la coincidencia de archivos Flash, ya que dudo que normalmente sean un archivo oculto.
jamessan
@jamessan El encabezado .es obligatorio en un shell glob, pero *.swpfunciona como argumento para find. Pero el liderazgo .hace las cosas más simples. ¡Gracias!
Lithis
8
  • ¿Es posible tener solo .*.swparchivos, cuando el archivo en el disco y el archivo en vim son diferentes?

Si. El fragmento a continuación (adaptado de vimrc de tpope ) deshabilitará el archivo de intercambio para un búfer cuando no se modifica, por lo que los archivos de intercambio solo existen para archivos modificados.

autocmd CursorHold,BufWritePost,BufReadPost,BufLeave *
  \ if isdirectory(expand("<amatch>:h")) | let &swapfile = &modified | endif

Advertencia : dado que el archivo de intercambio solo existe cuando se modifica el búfer, pierde el uso del archivo de intercambio como bloqueo de aviso. Si el búfer no se modifica, otro Vim puede comenzar a editarlo sin previo aviso de que ya está abierto. Si el segundo Vim se guarda antes de que el primero realice más cambios, no se notarán hasta que el usuario intente guardar o algo active a Vim para verificar si el archivo está modificado.

jamessan
fuente