Mejores prácticas de archivos de intercambio VIM?

14

Cada vez que salgo de una sesión en vim al perder mi conexión, estoy bastante lleno de dred (y aún así sigo usando vim ... qué masoquista debo ser) porque cuando abro mis archivos de nuevo, un montón de intercambio- los archivos están esperando para intentar destruir mi trabajo. ¿Cuáles son las mejores prácticas para trabajar con archivos de intercambio vim? ¿Simplemente eliges el más nuevo? Si el archivo funciona de la manera esperada, ¿simplemente elimina los archivos de intercambio? ¿Cómo te deshaces de ellos?

leeand00
fuente
55
Los archivos de intercambio están ahí para proteger su trabajo. Considera usar la pantalla gnu.
1
No quiero desactivar la funcionalidad; es molesto pero como dices útil.
leeand00
1
Solo quiero saber cómo usarlo correctamente.
leeand00
2
@DrEval Yo uso tmux
leeand00
2
Si usa tmux, no debería preocuparse por perder su conexión: solo vuelva a conectarlo a su sesión cuando vuelva a conectarse. También te puede interesar mosh y el complemento de recuperación de @ ChristianBrabandt .
Rico

Respuestas:

22

¡No entres en pánico!

La recuperación de archivos siempre es segura, porque vim nunca escribe ningún cambio hasta que los escribe usted mismo. Por lo tanto, recuperarse de un archivo de intercambio y luego cerrar sin guardar no cambiará nada.

Organiza tus archivos de intercambio:

Obtenga vim para colocar todos sus archivos de intercambio en el mismo lugar, para que siempre sepa dónde están:

set directory^=$HOME/.vim/swap//

o donde prefieras El uso //al final del nombre de archivo hace que vim use rutas de archivo absolutas para los nombres de los archivos de intercambio para que no tenga colisiones de nombres. Asegúrese de que el directorio exista, o vim no lo usará (no lo creará para usted).

Nota: Esto solo funciona en variables de entorno, si desea usar una variable vimscript, entonces necesitamos usar algo de :executemagia:

execute "set directory^=".my_vim_home_var."/swap//"

Diferencia las diferencias:

La ayuda de Vim sugiere un comando muy útil para usar en esta situación: :DiffOrig. No es un comando vim predeterminado , así que copie la implementación desde :h :DiffOrigsu vimrc. (también está en $VIMRUNTIME/defaults.vimsi tienes vim8). Ahora, puede recuperar el archivo y simplemente ejecutar DiffOrig para obtener un vimdiff de lo que ha cambiado desde la versión no modificada.

Si desea comparar el contenido de varios archivos de intercambio, recupere su archivo con cada archivo de intercambio diferente y luego escriba el resultado en archivos temporales. Ahora cargue los archivos y ejecútelos :diffthisen cada archivo, realice los cambios que desee, vuelva a escribir en el archivo original y elimine los archivos temporales e intercambiables.

Comandos útiles:

:swapname: obtiene el nombre que vim está usando para el archivo de intercambio para el búfer actual ( :h :swapname) :recover: recupera el archivo seleccionado, igual que cuando inicia vim y presiona R( :h :recover)

Mira la ayuda:

Vim tiene una sección entera del manual de usuario en la recuperación: :usr_11.txt
ayuda de referencia de Vim en los archivos de intercambio: :h swap-file, h recovery
Ayuda en la opción de directorio (para establecer la ubicación del archivo de intercambio)::h 'directory'

Editar: ejemplo modificado para configurar el directorio, como se señala en los comentarios de @B Layer

flemingfleming
fuente
¿Qué pasa cuando terminas con múltiples archivos de intercambio? ¿Debido a muchas conexiones caídas?
leeand00
1
Mencioné eso en el segundo párrafo de "Diferenciar las diferencias". Una vez que haya usado diffs para determinar qué cambios desea mantener, elimine todos los archivos temporales y los archivos de intercambio antiguos que realizó (ahora ya sabe dónde están todos los archivos de intercambio).
flemingfleming
1
Para su información, no necesita usar exec... set directory^=$HOME/.vim/swap//funciona bien siempre que $HOMEsea ​​una variable de entorno inicializada. Ver :h expand-env. También funciona con dictionary, undodiry backupdirpor nombrar algunos.
Capa B
¡Gracias por recordarme eso! En su lugar, uso una variable vimscript en mi configuración, de ahí que las variables de entorno ejecutar y olvidado no necesiten eso. Pensando en ello, probablemente debería usar vim para establecer una variable de entorno en su lugar.
flemingfleming
2

Personalmente, he desactivado los archivos de intercambio y copia de seguridad, ya que tiende a crear archivos de intercambio y archivos de copia de seguridad en todas partes y con frecuencia crea conflictos. El deshacer persistente de Vim ha sido mucho más confiable y libre de errores.

Vim actualmente tiene deshacer persistente, es un método de copia de seguridad mucho más fino. Cada vez que presiona Esc, se captura el estado actual del archivo.

Puede usar :undolist, o complementos como gundo , o deshacer-árbol para explorar su historial de deshacer.

Para usar vim de esta manera:

  • crear un directorio donde se capturará el historial de edición de cada archivo
  • dile a vim que use ese directorio
  • habilitar deshacer persistente

En la cáscara:

mkdir ~/.vim/undodir

En vim

set undodir=~/.vim/undodir
set undofile

Para desactivar los archivos de intercambio: :set noswapfile

alpha_989
fuente
1
Hay un par de problemas bastante grandes con esta respuesta. 1. Deshacer persistente resuelve un problema diferente para intercambiar archivos (y 'writebackup'aborda otro problema). Tener habilitado el deshacer persistente no ayudará si su computadora falla. Usted puede argumentar que los archivos de intercambio no son necesarias por otras razones (la estabilidad del sistema operativo moderno, la existencia de UPSes), pero que no lo han hecho en esta respuesta. 2. ¡la configuración 'undodir' no permite deshacer persistente! Tienes que configurar 'undofile'para esto
Rich