이미 복구 한 Vim 스왑 파일을 삭제하는 가장 쉬운 방법은 무엇입니까?


84

때로는 Vim이 충돌하여 스왑 파일을 남겨 둡니다. 대단해. 그런 다음 편집중인 파일을 열고 Vim에서 복구 여부를 묻습니다. 고마워 그것이 끝나면 Vim이 말해줍니다.

You may want to delete the .swp file now.

왜 그래요? 어떻게합니까? 이전 스왑 파일을 스왑 파일로 다시 사용하기 시작하고 종료 할 때 정리할 것이라고 생각했지만 사실이 아닙니다. 새 파일을 만들고 정리하고 파일을 다시 열면 첫 번째 파일에서 다시 복구하라는 메시지가 표시됩니다.

분명히 뭔가 빠졌습니다.


여기를 참조하십시오. vi.stackexchange.com/questions/13518/… "Vim 프로세스가 여전히 실행 중이면"삭제 "옵션이 표시되지 않습니다."TMUX 세션에 대한 주석을 참고하십시오. Vim이 아직 실행되고 있지 않은지 확인하십시오. (또한 GNU 화면) 어딘가 백그라운드에서 vi.stackexchange.com/questions/13518/…
zenaan

답변:


81

약간 더 간단한 방법 :

터미널 에뮬레이터에서 :

vim filename

그런 다음 recover를 선택 하고 스왑을 삭제하려면 쓰기 (저장) 한 다음 vim 내에서 수행하십시오.

:e          // no argument needed. It assumes the current buffer.

... 이번에는 delete를 선택하십시오 .

방금 이것에 대해 알게되었고 앞으로도 그렇게 할 것이라고 생각합니다. 그런 다음 복구가 손상된 것으로 판명되면 실수로 작업 파일을 덮어 쓰지 않습니다 (이전에 시도한 적이 없지만).

Stack Overflow (이 팁을 찾은 곳)에 대한이 질문대한 관련 팁도 있습니다 .


16
delete옵션 이 없습니다 . [O] pen (E) dit (R) ecover (Q) uit (A) bort, 어떻게해야합니까?
Arne

4
@ Arne : 내 경험상 일반적으로 파일이 현재 vim의 다른 인스턴스에서 열린다는 것을 의미합니까?
miyalys

1
[D] elete 옵션은 Vim 7.4
jmlarson으로

@ Arne 나는 같은 문제가 있었다. 그러나 한 시간 정도 지나면 vim을 다시 시작하고 옵션을 사용할 수있었습니다. 그때 PC가 다시 시작되지 않았습니다. vim은 다른 vim 프로세스가 실행되고 있다고 생각할 수 있습니다. 그것이 옵션을 표시하지 않는 이유입니다.
ka3ak

6
(D)elete옵션 이 보이지 않는다고 말하는 사람들 은 :help swap-exists; 따옴표 On Unix this choice is only offered when the process that created the swap file does not appear to be running.즉, 다른 vim 프로세스가 실행 중이므로이 옵션이 숨겨져 있습니다. 또한 왜 swp파일이 처음에 있는지 설명 할 수도 있습니다 !
Lqueryvg

39

디렉토리에서 모든 vim 스왑 파일을 정리하려면

디렉토리 트리에 vim 스왑 파일이 필요없고 제거하려는 경우 vim이 실행 중이 아닌 동안 디렉토리에서 다음 명령을 사용할 수 있습니다 (다른 창이나 다른 로그인에서도). 세션):

find . -type f -name "*.sw[klmnop]" -delete

Google 그룹스에서 정크 .swp 파일 제거 에서 영감과 생각을 얻었습니다 . 이 이름이로 끝나는 모든 파일을 삭제합니다 .swk, .swl, .swm, .swn, .swo, 또는 .swp 현재 디렉토리 트리입니다.

여러 가지 이유로 이것은 원하는 것이 아닐 수도 있습니다.

  • 언급 한대로 현재 디렉토리 트리를 검색합니다  . 즉, 현재 디렉토리와 모든 서브 디렉토리를 재귀 적으로. 그것은 질문이 요구하는 것 이상으로, 과잉으로 간주 될 수 있습니다.
  • 언급 한 바와 같이,이 이름이로 끝나는 모든 파일을 삭제합니다 .swk, .swl, .swm, .swn, .swo, 또는 .swp,뿐 아니라 .swp게리 존슨은 말합니다 .

    또한 모든 스왑 파일이 .swp로 끝나는 것은 아닙니다. Vim이 스왑 파일을 만들어야하고 .swp로 끝나는 파일이 이미 존재하면 Vim은 새 파일에 .swo 확장자를 사용하고 그 뒤에 .swn을 사용합니다. 나는 알파벳을 거꾸로 계속 거꾸로 생각합니다. 그래서 같은 것을 사용하여

      \*.sw[nop] 
    

    또는

      \*.sw? 
    

    더 철저 할 것입니다.

    게시물 의 원래 작성자는 다음같이 말합니다.

    'klmnop'은 과도 할 수 있지만 일반적으로 모든 것을 얻을 수 있습니다.

  • 반면에, 그것은 부족할 수 있습니다.  루블 제안

    find . -type f \( -name ".*.s[a-v][a-z]" -o -name ".*.sw[a-p]" \) -delete
    

    이는 이르기까지 모든 (소문자) 세 글자의 확장자를 일치 .saa로를 .swp. 그는“하지만이 솔루션은 더 완벽한 솔루션이지만 .svg 이미지 파일과 .swf adobe 플래시 파일을 모두 제거합니다. 당신은 당신이 그 파일을 작업 할 경우 정규식을 수정할 수 있습니다. "또한 일치 .sav, .snd(음성 데이터), .sql, .src, .srt(SubRip의 비디오 자막 형식), 그리고 많은 다른 일반적인 확장.

  • 과잉 일 수 있습니다. 언급 한 바와 같이, 누구의 이름으로 끝나는 모든 파일을 삭제합니다 .swk, .swl, .swm, .swn,을 .swo, 또는 .swp. 그러나 vim 스왑 파일은 일반적으로 "도트"파일입니다. 편집 hello.cpp하면 스왑 파일이 될 수 있습니다 .hello.cpp.swp. rouble 's answer 에 표시된 것처럼 (설명되지는 않았지만) 이름이 점으로 시작하는 파일 만 삭제하는 것이 더 안전합니다. 예를 들어

    find . -type f -name ".*.sw[klmnop]" -delete
    

14

ls -a디렉토리의 모든 파일을 나열하는 유형

입력 rm .whatever.your.swp하고 누르십시오enter

간단합니다.

.앞에 표시되는 모든 파일 은 숨겨진 파일이며 일반적으로 보이지 않습니다.

변경 사항은 즉각적이고 영구적이므로주의하십시오.


4
하지만 그렇게 간단하지는 않습니다. 나는 빔을 떠나 스왑 디렉토리를 탐색, 파일의 이름을 기억하고 가능성이 있는지 여부를 결정해야 file.swp하거나 file.swo. 그런 다음 내가 있던 곳으로 돌아 가야합니다. 타격 :e은 훨씬 간단한 솔루션입니다.
Peeja

1
ls: cannot access +A: No such file or directory
Jonathan

이것이 내가 필요로하는 것
user5510975

7

Btw. 일부 플러그인은 자동으로 수행합니다 : autoswap.vim

설명에서 :

  1. 다른 창에서 다른 Vim 세션에서 파일이 이미 열려 있습니까?
  2. 그렇다면 해당 파일을 편집하는 창으로 바꾸십시오.
  3. 그렇지 않으면 swapfile이 파일 자체보다 오래된 경우 제거하십시오.
  4. 그렇지 않으면 파일을 읽기 전용으로 열어서 살펴보고 저장할 수 있습니다.

6
왜 vim이 플러그인없이 vim이 기본적으로 합리적인 행동을 할 수 없는지 말해 줄 수 있습니까?
Pavel Šimerda

6

아니요, AFAIK에는 빠진 것이 없습니다. Vim스왑 파일을 명시 적으로 삭제할 때까지 스왑 파일을 백업으로 계속 유지합니다.

동일한 파일을 저장하고 종료 한 후 다시 열기 만하면됩니다. 메시지가 다시 표시됩니다

[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort, (D)elete it

이제 그냥 누르십시오 d:)


11
정말? 나는 그것을 알고 있었다. 그러나 그것은 바보입니다. 확실히 "간단한"것은 아닙니다.
Peeja

1
그런데 quit과 abort의 차이점은 무엇입니까?
trusktr

5
내 경우에는 삭제 옵션이 없습니다. 어떻게해야합니까? (저는 저장하고 종료 한 후 다시 열었습니다)
Paschalis

vim을 먼저 종료 할 필요는 없습니다. 파일에서 "어쨌든 편집"또는 "복구"를 선택한 후 : e <return>을 입력하면 파일을 삭제할 수 있습니다.
00prometheus

2

Vim은 대부분의 유닉스 명령과 마찬가지로 가정하고 암시 적이기보다는 단순하고 명시 적입니다.

당신은 (r)로 회복합니다. 복구가 마음에 들지 않거나 복구가 손상되어 버릴 수 있습니다. 당신이 그것을 좋아한다면, 당신은 파일을 저장할 수 있습니다. 복구 파일은 명시 적이 지 않으며 100 % 상황에 맞지 않기 때문에 삭제되지 않습니다.

따라서 (r) ecover, (w) rite 및 (q) uit 다음에 다시 편집하고 (d) elete 또는 "rm .myfile.js.swp"를 선택하고 다시 편집하십시오. 이것은 Vim의 관점에서 볼 때 빠르며 항상 100 % 올바른 행동입니다.


그렇다면 스왑 파일의 경로를 알려주는 vim을 얻는 방법이 있습니까? 스왑 파일을 삭제하기 위해 두 번째 명령을 실행하게되어 기쁘지만 (실제로는 그 명시 성이 마음에 듭니다) 스왑 파일을 삭제하는 명령을 원합니다. 예를 들어 별도의 스왑 파일 디렉토리가 있습니다. 두 개의 열린 파일의 기본 이름이 동일한 경우 현재 버퍼에 대한 올바른 스왑 파일을 프로그래밍 방식으로 결정할 수 없습니다.
Peeja

1
사실이지만 간단한 "복구 및 삭제"옵션을 제공하는 것이 좋습니다. 아마도 쉬운 톰 구현입니다. 아직 학교에 다니지 않았다면 언젠가 할 것입니다.
trusktr

1
대부분의 유닉스 명령은 단순하고 명시 적이며 합리적인 기본 동작을 가지고 있습니다. Vim 복구는 간단하지 않으며, UX는 LibreOffice에서와 같이 나쁘고, 동작이 잘못되어 많은 경우 데이터 손실이 발생합니다.
Pavel Šimerda

1

이 파일들도 나에게 성가신 것이었지만 set noswapfile vim 에서 옵션을 설정 하여 vim이 파일을 생성하지 못하게하고 대신 파일을 메모리에 보관합니다.


OP에 따르면 스왑 파일이 유용하므로이를 끄는 것이 최선의 방법이 아닐 수도 있습니다.
Kusalananda

스왑 파일을 끄지 마십시오. 기계가 고장 나면 작업을 잃게됩니다.
Lqueryvg

물론이 옵션은 위험을 의미하며 충돌 스왑이 매우 자주 발생할 때 vi * 편집이 등장했을 때이 스왑 파일이 만들어졌습니다. 이제 나는 vim이 안정적으로 작동한다고 말할 수 있으며 그것들은 레거시 것으로 존재합니다.
Dmitrii

1

여기에 대한 Github에서 자신의 gitignore 파일을 기반으로 모든 정력 스왑 파일을 청소하는보다 완전한 정규식 빔은

$ find ./ -type f \( -name "\.*\.s[a-v][a-z]" -o -name "\.*\.sw[a-p]" \) -delete

이 방법은보다 완벽한 솔루션이지만 .svg 이미지 파일과 .swf adobe 플래시 파일을 모두 제거합니다. 해당 파일로 작업하는 경우 정규식을 수정하려고 할 수 있습니다.


1

추가 할 스 니펫은 다음과 같습니다 .vimrc. 현재 파일 버퍼와 관련된 모든 스왑 파일을 삭제하고 스왑 확장을 재설정합니다.

function! DeleteFileSwaps()
    write
    let l:output = ''
    redir => l:output 
    silent exec ':sw' 
    redir END 
    let l:current_swap_file = substitute(l:output, '\n', '', '')
    let l:base = substitute(l:current_swap_file, '\v\.\w+$', '', '')
    let l:swap_files = split(glob(l:base.'\.s*'))
    " delete all except the current swap file
    for l:swap_file in l:swap_files
        if !empty(glob(l:swap_file)) && l:swap_file != l:current_swap_file 
            call delete(l:swap_file)
            echo "swap file removed: ".l:swap_file
        endif
    endfor
    " Reset swap file extension to `.swp`.
    set swf! | set swf!
    echo "Reset swap file extension for file: ".expand('%')
endfunction
command! DeleteFileSwaps :call DeleteFileSwaps()

곤경에 발생하면, 하나는 실행할 수 :DeleteFileSwaps 와 결합하면이 대단한 :windo또는 :tabdo명령.

:tabdo DeleteFileSwaps 

추가 세부 사항 : 파일은 둘 이상의 스왑 파일을 가질 수 있습니다. 확장자가 .swp인 스왑 파일이 여전히 존재하고 vim그 때문에 새 파일 을 계속 생성하기 때문입니다. .swp존재 하는지 확인하려면 다음을 수행하십시오.

  • 대상 파일을 vim에서 연 상태에서 실행 :sw하여 현재 스왑 파일을 가져옵니다.
  • 현재 스왑 파일이 포함 된 디렉토리를 확인하십시오.
  • 그런 다음 디렉토리에 열린 파일 이름의 스왑 파일이 있고 확장자가 확장자인지 확인하십시오 .swp.

위의 스 니펫은 동일한 프로세스를 따르지만 모든 스왑 파일을 제거하십시오.

도움이 되었기를 바랍니다.


0

매뉴얼에서 :h swap:

다음 명령으로 사용중인 현재 스왑 파일의 이름을 볼 수 있습니다. :sw[apname]


경고 ... 삭제해야 할 파일 이름이 아닐 수 있습니다. .swp파일을 삭제할 때까지 :sw명령은 .swo파일 이름을 제공 할 것입니다 . 삭제하려는 파일이 아닙니다 .
Lqueryvg

0

메시지가 표시되면를 눌러 D현재 파일의 스왑 파일을 삭제하십시오.

그렇지 않은 경우 수동으로 수행해야합니다.

이를 수행하는 한 가지 대안은 다음과 같습니다.

파일 찾기 / 검색 :

find | grep ".searchRefineVertTabs.jsp.swp"

이 파일을 삭제하십시오.

rm ./.searchRefineVertTabs.jsp.swp

1
내가 하고 물어,하지만 내 선택하는 것입니다 복구 . 문제는 더 이상 필요하지 않기 때문에 복구 한 직후 삭제하는 방법 입니다. 그것은 나를 위해 그것을하지 않는 vim의 실패처럼 보입니다. 그러나 허용되는 답변은 지금까지 찾은 가장 깨끗한 워크 플로입니다.
Peeja

-1

당신이 사용할 수있는,

rm -f .<filename>.<ext>.swp

예:

rm -f .rc.local.swp

이것은 기술적으로 효과가 있지만 현재 허용되는 답변에서 쉽게 찾을 수있는 곳은 없습니다.
Peeja

또한 <ext>적어도 Linux에서는 파일 이름이 중복되어 0 개 이상의 확장자가 포함됩니다.
Pavel Šimerda
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.