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:
Descubrí el SwapExists
autocommand pero no sé si puede ayudar con estas tareas.
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
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.
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
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.
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