vim에서 실행 취소 기록을 어떻게 버릴 수 있습니까?


23

Vim에는 Undo가 있습니다. 그러나 때로는 알려진 좋은 시점에서 실행 취소 기록을 지우고 싶습니다. u개별 변경 사항을 취소하는 데 사용할 수는 있지만 특정 시점으로 만 되돌릴 수 있습니다. (예를 들어, 이것은 내가 마지막으로 커밋했을 때입니다.)

이를 수행하는 한 가지 방법은 파일을 닫았다가 다시 여는 것입니다. 실행 취소 기록은 그 시점에서 깨끗하게 시작됩니다. 그러나 그것은 번거 롭다.

과거에는으로이 작업을 수행했습니다 :edit!. 그러나 Vim 7.3에서는 실행 취소 기록을 버리지 않습니다.

파일을 닫는 것 외에 다른 방법이 있습니까?


실제로 마지막 커밋에서와 같이 파일의 상태를 복원하고 싶습니까? 본질적으로 'u'키를 git checkout -f file또는 hg rollback file?
akira

@ akira-아니요, u개인 변경 사항을 취소하는 데 사용할 수 있기를 원 하지만 마지막으로 커밋 한 시점을 지나지 않았습니다. 정확히 커밋 할 때마다 파일을 닫았다가 다시 열었습니다. 어떤 무엇을 :edit!할하는 데 사용 -이 파일을 닫고이를 재개 같았다. 이것은 커밋 포인트와 관련이 없으며, 가장 자주 원할 때입니다.
Nathan Long

아, 그것은 문제를 훨씬 더 분명하게 만듭니다. 질문을 조금 바꿔야합니다.
akira

답변:


11
:set undoreload=0 | edit

당신이 원하는 것을해야합니다.


1
하아! 그 기능을 끄세요? :) 왜 이렇게 오래 걸 렸는지 잘 모르겠습니다.
Nathan Long

7

오래된 : 편집하다! 한 줄짜리 행동 :

:exe "set ul=-1 | e! | set ul=" . &ul

작동합니다. 설명해 주시겠습니까?
Nathan Long

명령 문자열 끝에 실행 취소 레벨 설정 값을 연결하여 (복원 할 수 있도록) 실행합니다. 더 많은 정보 설명서를 참조하십시오 : :h :exe, :h :bar, :h :set-args,:h 'ul':h :edit!.
Aldrik

6

Benoit의 기능이 저에게는 효과가 없었지만 vim 매뉴얼에서 비슷한 것을 발견했습니다.

http://www.polarhome.com/vim/manual/v73/undo.html#undo-remarks

나는 그것을 vimrc에 추가 한 함수로 가져 갔고 vim 7.3에서 잘 작동하는 것 같습니다.

" A function to clear the undo history
function! <SID>ForgetUndo()
    let old_undolevels = &undolevels
    set undolevels=-1
    exe "normal a \<BS>\<Esc>"
    let &undolevels = old_undolevels
    unlet old_undolevels
endfunction
command -nargs=0 ClearUndo call <SID>ForgetUndo()

와 함께 사용할 수 있습니다 :ClearUndo.


1
Gundo 플러그인 및 실행 취소 파일 다시로드로 정상적으로 작업하면이 것이 정말 유용합니다. 그러나 두 가지 사항을 변경했습니다. 일반 편집 명령 (7.4 자체에 일부 편집 기록이 남는 것) 대신 편집을 사용합니다! (그리고 항상 실행 취소 기록을 지우기 전에 작성하십시오). 일부 내부 목록이 제대로 업데이트되지 않은 것 같으므로 Gundo 플러그인과 함께 사용하려면 추가 편집을 수행하십시오! 함수 끝에서 나중에 오류가 발생하지 않도록합니다.
PlasmaHH

@PlasmaHH 변경 내역을 이해하지 못했기 때문에 실행 취소 기록 지우기 기능을 게시 할 수 있습니까? 감사합니다
Ben

5

아마:

:let old_ul=&ul
:set ul=-1
:let &ul=old_ul
:unlet old_ul

(의 'ul'별칭입니다 'undolevels').


작동합니다! 이제는 단일 명령으로 수행하는 것이 좋습니다 :edit!. 시작으로, 나는 당신이 나열한 명령으로 ClearUndos ()라는 함수를 만들었지 만, 호출하는 것은 아무것도하지 않는 것처럼 보이지만 명령은 개별적으로 수행하는 것처럼 보입니다 ...
Nathan Long

3
:command -nargs=0 Reset let old_ul=&ul | set ul=-1 | e! | let &ul = old_ul | unlet old_ul
Benoit

그것이 함수의 내용을 의미합니까? 그것은 나를 위해 작동하지 않지만 어쩌면 나는 오해했을 것입니다. 또한-아마도 자신의 대답으로 옮기겠습니까?
Nathan Long

|명령 내용 에 raw 를 넣을 수 없습니다 . 그런 다음 대답에서 말한 것을 수행하는 함수를 만들고 명령을로 설정하십시오 call thefunction().
Benoit

3

"실행 취소 기록 지우기 (: w : 실행 취소 파일이 있으면 삭제)
command! -bar UndoClear exe "set ul=-1 | m-1 | let &ul=" . &ul

  • '취소 수준'을 -1로 설정하면 실행 취소 정보가 즉시 지워지지 않습니다. 이는 다음 변경에서 발생합니다. 즉 m-1, 실제로 텍스트가 변경되지 않습니다.
  • 경우 'undofile'에이다, :w같은 실행 취소 파일 또는 체인을 취소합니다 UndoClear|w.

1

스크립트에서 :

function! <SID>ForgetUndo
     let old_ul = &ul
     set ul=-1
     let &ul = old_ul
     unlet old_ul
endfunction
command -nargs=0 Reset call <SID>ForgetUndo()

그런 다음 :Reset전화를 사용 하십시오.


함수 정의 줄 끝에는 ()가 필요합니다.
Nathan Long

이것은 이상합니다-해당 명령을 개별적으로 실행하면 제대로 작동하며 함수 전체에서 값을 에코하면 명령이 적절하게 설정 및 설정 해제되었음을 나타냅니다. 그러나 기능을 실행해도 실행 취소 기록이 재설정되지 않습니다. 나중에 여러 번 실행 취소 할 수 있습니다. 어쩌면 set ul=명령은 스크립트가 종료 될 때까지 로컬 변수에만 영향을 미치며 스크립트가 종료되기 전에 다시 변경하기 때문에 환경에 영향을 미치지 않습니까? 이 기능을 테스트하고 작동 시켰습니까? 내 설정에 이상한 점이 있습니까?
Nathan Long
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.