문제

을 때 이전 Vim 세션으로 추락한,당신은"스왑 파일의...이미 존재합니다!"각하고 모든 파일에서 열린 이전 세션이 있습니다.

수 Vim 복구 프롬프트가 있습니다.(끄지 않고 복!) 특히,나는 생각:

  • 는 경우 교환로 버전을 포함하지 않는 저장되지 않은 변경 사항 및 편집하는 프로세스가 더 이상 실을 만들 수 있습니 Vim 자동으로 삭제 스왑요?
  • 을 자동화할 수 있는 제안 프로세스를 저장하는 파일을 복구에서는 새로운 이름,병합하에 그것을 디스크에 있는 파일과 삭제한 다음의 이전 스왑 파일에는 최소한의 상호작용이 필요합니까?특히 스왑 버전과 디스크 버전은 같은,모든 것이 자동적입니다.

내가 발견 SwapExists autocommand 그러나 내가 알지 못하는 경우와 함께 도움이 될 수 있습니다 이러한 작업을 수행합니다.

도움이 되었습니까?

해결책

가 vim 저장소 내 교환 파일에서 하나의 로컬 디렉토리함으로써,이에.vimrc:

set directory=~/.vim/swap,.

이 밖에도 다음과 같은 장점이 이 스왑 파일을 쉽게 찾을 수 있다.면 노트북을 잃는 힘든 시작했어요 다시의 무리와 함께 스왑 파일을 놓고 주위에,나는 그냥 실행 cleanswap 스크립트:

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

이 제거됩니다 어떤 스왑 있는 파일을 그대로--날짜와 실제 파일이 있습니다.어떤 일치하지 않는 것들에 vimdiff 창할 수 있도록 병합에 변경이 저장되지 않았습니다.

--Chouser

다른 팁

저는 이 문제를 발견:

http://vimdoc.sourceforge.net/htmldoc/diff.html#:DiffOrig

복사 및 붙여넣 DiffOrig 명령으로.vimrc 파일과 그것은 마치 마법처럼 작동합니다.이것은 크게 용이하게 회복의 스왑 파일이 있습니다.나는 아이디어가 있지 않은 왜 그렇지 않은 기본적으로 포함되 VIM.

여기에서의 명령은 사람들을 위한 급:

 command DiffOrig vert new | set bt=nofile | r # | 0d_ | diffthis
    \ | wincmd p | diffthis

용 대답은 체포한 매우 중요한 사용 사례입니다.말하자를 만드는 새로운 완충기와 형식에 대한 2 시간도 없이 저장한 다음,노트북의 충돌합니다.실행하는 경우 제안된 스크립트 그것은 삭제됩니다 당신의 하나에만 기록,니다.swp 스왑 파일.나는 확실하지 않은 무엇이 올바른 해결이지만,그것은 다음과 같 diff 명령이 끝나는 비교 같은 파일을 자체에서 이 경우입니다.편집 버전을 확인에 대한 이 경우는 경우에는 사용자가 파일을 저장하는 곳이다.

#!/bin/bash

SWAP_FILE_DIR=~/temp/vim_swp
IFS=$'\n'

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 $SWAP_FILE_DIR/.*sw? $SWAP_FILE_DIR/*; do
  echo $q
  [[ -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 [ "$CRNT" = "$RECTXT" ]; then
      echo "Can't find original file. Press enter to open vim so you can save the file. The swap file will be deleted afterward!"
      read
      vim "$CRNT"
      rm -f "$q"
  else if diff --strip-trailing-cr --brief "$CRNT" "$RECTXT"; then
      echo "Removing redundant $q"
      echo "  for $CRNT"
      rm -f "$q"
  else
      echo $q contains changes, or there may be no original saved file
      vim -n -d "$CRNT" "$RECTXT"
      rm -i "$q" || exit
  fi
  fi
done

좋은 팁 DiffOrig 는 완벽합니다.여기에 bash 스크립트를 사용하에서 실행하는 각 스왑 파일에 현재 디렉토리:

#!/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

아마도 사용할 수 있습 몇 가지 이상의 오류를 검사하고 인용하지만 일했다.

내가 선호하는 설정되지 않 내 VIM 작업 디렉토리에서.vimrc.여기에의 수정의 chouser 의 복사하는 스크립트 스왑 파일을 교환 경로에 수요가 확인에 대한 중복되고 다음을 조정합니다.이 작성되었으로 돌진,확인을 평가하기 전에 그것을 실질적으로 사용할.

#!/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

나는 이에.bashrc 파일입니다.의 마음을 전하고 싶 적절한 크레딧의 일부 이 코드를 잊었는 곳에 나가서 그것을 가지고.

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 }

나이에 뿌리 내 프로젝트의 경우 파일이 다른 열 vim diff.그런 다음 마지막에 파일을 저장할 것이다.을 완벽하게하는 것입을 대체하는 필요는 마지막 다른 사람:

else echo "Backup file kept as:" $bakf

에 의해 뭔가

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

그러나지 않았을 얻을 시간이 제대로 그것을 테스트합니다.

도움이 되기를 바랍니다.

찾을 수 있습니다./ -유형 f-name".*sw[klmnop]"삭제

신용:@Shwaydogg https://superuser.com/questions/480367/whats-the-easiest-way-to-delete-vim-swapfiles-ive-already-recovered-from

탐색하는 첫 번째 디렉토리

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top