Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Smarter Vim recovery?

Tags:

vim

recovery

When a previous Vim session crashed, you are greeted with the "Swap file ... already exists!" for each and every file that was open in the previous session.

Can you make this Vim recovery prompt smarter? (Without switching off recovery!) Specifically, I'm thinking of:

  • If the swapped version does not contain unsaved changes and the editing process is no longer running, can you make Vim automatically delete the swap file?
  • Can you automate the suggested process of saving the recovered file under a new name, merging it with file on disk and then deleting the old swap file, so that minimal interaction is required? Especially when the swap version and the disk version are the same, everything should be automatic.

I discovered the SwapExists autocommand but I don't know if it can help with these tasks.

like image 420
Bruno De Fraine Avatar asked Sep 15 '08 13:09

Bruno De Fraine


1 Answers

I have vim store my swap files in a single local directory, by having this in my .vimrc:

set directory=~/.vim/swap,. 

Among other benefits, this makes the swap files easy to find all at once. Now when my laptop loses power or whatever and I start back up with a bunch of swap files laying around, I just run my 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 

This will remove any swap files that are up-to-date with the real files. Any that don't match are brought up in a vimdiff window so I can merge in my unsaved changes.

--Chouser

like image 105
Chouser Avatar answered Sep 17 '22 13:09

Chouser