it-swarm-es.com

Recuperación de VIM más inteligente?

Cuando se estrelló una sesión de VIM anterior, se le recibió con el "Swap File ... ¡Ya existe!" Para todos y cada uno de los archivos que estaban abiertos en la sesión anterior.

¿Puedes hacer que este aviso de recuperación de VIM sea más inteligente? (¡Sin desconectar la recuperación!) Específicamente, estoy pensando en:

  • Si la versión intercambiable no contiene cambios no guardados y el proceso de edición ya no funciona, ¿puede hacer que VIM elimine automáticamente el archivo de intercambio?
  • ¿Puede automatizar el proceso sugerido de guardar el archivo recuperado en un nuevo nombre, fusionándolo con el archivo en el disco y luego eliminando el archivo de intercambio anterior, de modo que se requiera una interacción mínima? Especialmente cuando la versión de intercambio y la versión del disco son iguales, todo debe ser automático.

Descubrí el SwapExists autocommand pero no sé si puede ayudar con estas tareas.

47
Bruno De Fraine

Tengo VIM Store mis archivos de intercambio en un solo directorio local, teniendo esto en mi .vimrc:

set directory=~/.vim/swap,.

Entre otros beneficios, esto hace que los archivos de intercambio sean fáciles de encontrar de una vez. Ahora, cuando mi computadora portátil pierde energía o lo que sea y empiezo de nuevo con un montón de archivos de intercambio que ponen alrededor, acabo de ejecutar mi cleanswap script:

TMPDIR=$(mktemp -d) || exit 1
RECTXT="$TMPDIR/vim.recovery.$USER.txt"
RECFN="$TMPDIR/vim.recovery.$USER.fn"
trap 'rm -f "$RECTXT" "$RECFN"; rmdir "$TMPDIR"' 0 1 2 3 15
for q in ~/.vim/swap/.*sw? ~/.vim/swap/*; do
  [[ -f $q ]] || continue
  rm -f "$RECTXT" "$RECFN"
  vim -X -r "$q" \
      -c "w! $RECTXT" \
      -c "let fn=expand('%')" \
      -c "new $RECFN" \
      -c "exec setline( 1, fn )" \
      -c w\! \
      -c "qa"
  if [[ ! -f $RECFN ]]; then
    echo "nothing to recover from $q"
    rm -f "$q"
    continue
  fi
  CRNT="$(cat $RECFN)"
  if diff --strip-trailing-cr --brief "$CRNT" "$RECTXT"; then
      echo "removing redundant $q"
      echo "  for $CRNT"
      rm -f "$q"
  else
      echo $q contains changes
      vim -n -d "$CRNT" "$RECTXT"
      rm -i "$q" || exit
  fi
done

Esto eliminará cualquier archivo SWAP que esté actualizado con los archivos reales. Cualquiera que no coincida se sienta en una ventana de Vimdiff para que pueda fusionarme en mis cambios no guardados.

Campanario

37
Chouser

Gran consejo Difforig es perfecto. Aquí hay un script de bash que utilizo para ejecutarlo en cada archivo de swap debajo del directorio actual:

#!/bin/bash

swap_files=`find . -name "*.swp"`

for s in $swap_files ; do
        orig_file=`echo $s | Perl -pe 's!/\.([^/]*).swp$!/$1!' `
        echo "Editing $orig_file"
        sleep 1
        vim -r $orig_file -c "DiffOrig"
        echo -n "  Ok to delete swap file? [y/n] "
        read resp
        if [ "$resp" == "y" ] ; then
                echo "  Deleting $s"
                rm $s
        fi
done

Probablemente podría usar un poco más de la verificación y citación de errores, pero ha funcionado hasta ahora.

4
Mark Grimes

Prefiero no establecer mi VIM en el .vimrc. Aquí hay una modificación del script del reino que copia los archivos de intercambio a la ruta de intercambio en la verificación de demanda de duplicados y luego los reconcilia. Esto fue Escrito apresurado, asegúrese de evaluarlo antes de ponerlo en uso práctico.

#!/bin/bash

if [[ "$1" == "-h" ]] || [[ "$1" == "--help" ]]; then
   echo "Moves VIM swap files under <base-path> to ~/.vim/swap and reconciles differences"
   echo "usage: $0 <base-path>"
   exit 0
fi

if [ -z "$1" ] || [ ! -d "$1" ]; then
   echo "directory path not provided or invalid, see $0 -h"
   exit 1
fi

echo looking for duplicate file names in hierarchy
swaps="$(find $1 -name '.*.swp' | while read file; do echo $(basename $file); done | sort | uniq -c | egrep -v "^[[:space:]]*1")"
if [ -z "$swaps" ]; then
   echo no duplicates found
   files=$(find $1 -name '.*.swp')
   if [ ! -d ~/.vim/swap ]; then mkdir ~/.vim/swap; fi
   echo "moving files to swap space ~./vim/swap"
   mv $files ~/.vim/swap
   echo "executing reconciliation"
   TMPDIR=$(mktemp -d) || exit 1
   RECTXT="$TMPDIR/vim.recovery.$USER.txt"
   RECFN="$TMPDIR/vim.recovery.$USER.fn"
   trap 'rm -f "$RECTXT" "$RECFN"; rmdir "$TMPDIR"' 0 1 2 3 15
   for q in ~/.vim/swap/.*sw? ~/.vim/swap/*; do
     [[ -f $q ]] || continue
     rm -f "$RECTXT" "$RECFN"
     vim -X -r "$q" \
         -c "w! $RECTXT" \
         -c "let fn=expand('%')" \
         -c "new $RECFN" \
         -c "exec setline( 1, fn )" \
         -c w\! \
         -c "qa"
     if [[ ! -f $RECFN ]]; then
       echo "nothing to recover from $q"
       rm -f "$q"
       continue
     fi
     CRNT="$(cat $RECFN)"
     if diff --strip-trailing-cr --brief "$CRNT" "$RECTXT"; then
         echo "removing redundant $q"
         echo "  for $CRNT"
         rm -f "$q"
     else
         echo $q contains changes
         vim -n -d "$CRNT" "$RECTXT"
         rm -i "$q" || exit
     fi
   done
else
   echo duplicates found, please address their swap reconciliation manually:
   find $1 -name '.*.swp' | while read file; do echo $(basename $file); done | sort | uniq -c | egrep '^[[:space:]]*[2-9][0-9]*.*'
fi
0
Mario Aguilera

Tengo esto en mi archivo .bashrc. Me gustaría dar crédito apropiado a parte de este código, pero olvidé de dónde lo obtuve.

mswpclean(){

for i in `find -L -name '*swp'`
do
    swpf=$i
    aux=${swpf//"/."/"/"}
    orif=${aux//.swp/}
    bakf=${aux//.swp/.sbak}

    vim -r $swpf -c ":wq! $bakf" && rm $swpf
    if cmp "$bakf" "$orif" -s
    then rm $bakf && echo "Swap file was not different: Deleted" $swpf
    else vimdiff $bakf $orif
    fi
done

for i in `find -L -name '*sbak'`
do
    bakf=$i
    orif=${bakf//.sbak/}
    if test $orif -nt $bakf
    then rm $bakf && echo "Backup file deleted:" $bakf
    else echo "Backup file kept as:" $bakf
    fi
done }

Acabo de correr esto en la raíz de mi proyecto y, si el archivo es diferente, se abre a Vim Diff. Luego, se guardará el último archivo a guardar. Para que sea perfecto, solo necesitaría reemplazar lo último:

else echo "Backup file kept as:" $bakf

por algo como

else vim $bakf -c ":wq! $orif" && echo "Backup file kept and saved as:" $orif

pero no tuve tiempo para probarlo correctamente.

Espero eso ayude.

0
Miguel

encontrar ./ ​​-Tipo F -Name ". * SW [Klmnop]" -Delete

Crédito: @shwaydogg https://superuser.com/questions/480367/400367/400.s.thats-the-easiesiest-way-to-delex-vim-swapfiles-ive-already-recovered-from

Navegue a directorio primero

0
user3386050