VIM의 실행 취소 트리는 어떻게 사용됩니까?


132

이 답변 은 말합니다 :

Vim의 실행 취소 / 재실행 시스템은 무적입니다. 무언가를 입력하고, 취소하고, 다른 것을 입력하면, Vim은 스택 대신 실행 취소 트리를 사용하기 때문에 가장 먼저 입력 한 것을 되돌릴 수 있습니다. 거의 모든 다른 프로그램에서 가장 먼저 입력 한 내용이이 상황에서 손실됩니다.

이것이 내가 처음 듣는 것입니다. 나무를 따라 어떻게 역 추적 할 수 있습니까?


1
Jealous Emacs 사용자는 실행 취소 트리 모드에 대해 알고 싶어 할 수 있습니다 .
Aaron Miller

답변:


142

:h undo-redo모든 명령과 사용법을 나열하는 도 참조하십시오 .

실행 취소 트리를 탐색하는 방법에는 두 가지가 있습니다. 하나는 "시간을 거슬러 올라가는 것"입니다. g+그리고 g-트리의 모든 노드를 시간순 또는 역 시간순으로 순회합니다 (실행 취소 분기 사이에서 임의로 g-건너 뛸 수 있기 때문에 약간 혼란 스러울 수 있지만 충분히 길면 항상 필요한 곳으로 갈 수 있습니다) 결국). :earlier그리고 :later같은 시간 기술자 걸릴 7m또는 1h; 다시 이것은 취소 분기 사이에서 임의로 이동할 수 있습니다.

다른 방법은 :undo nwhere nis a action of a action을 사용하여 트리의 특정 노드로 이동하는 것입니다 . (텍스트 추가, 삭제, 교체 등 모든 작업은 순차적으로 번호가 매겨집니다.)를 통해 실행 취소 트리의 잎에서 작업 수를 조회 할 수 있습니다 :undolist. 이렇게하면 가지 사이를 쉽게 이동할 수 있습니다. 그런 다음 사용할 수 있습니다 uCtrl-R이동 및 해당 분기 아래에.

Vim 도움말에 좋은 예가 있습니다. 이것이 어떻게 작동하는지 알아내는 가장 좋은 방법은 약간 가지고 노는 것입니다.


43
지점을 합칠 수 있습니까? (농담이야)
he_the_great

40
킨다. 조회 : h undojoin
포드

23
Vim은 너무 멋져서 얼마나 멋진 지 농담하는 방법을 구현합니다!
andyortlieb

4
이 실행 취소 트리를 사용하는 방법을 몰랐지만 언젠가는 생명을 구할 수 있다는 것을 알았습니다. 글쎄, 오늘이왔다. 감사!!
ndvo

1
@Pod undojoin브랜치 와 는 아무런 관련이없는 것 같습니다 . 실제로 다음 도움말 섹션은 "우리는 한 줄의 실행 취소 / 다시 실행에 대해서만 논의했지만 분기 할 수도 있습니다." undojoin내가 보지 못하는 가지와 함께 사용할 수 있는 방법이 있습니까?
Kyle Strand

70

파티에 조금 늦었지만 Vim 용 실행 취소 트리 시각화 플러그인을 작성했다고 언급했습니다 .http : //bitbucket.org/sjl/gundo.vim/

개인적으로 나는 이런 식으로 나무를 그리는 것이 내가 이해할 수있는 유일한 방법이라는 것을 알았습니다.


github.com/sjl/gundo.vim에 최신 git 저장소가 있습니다 . vim-plug를 사용하면 플러그인을 설치 Plug 'sjl/gundo.vim'한 다음 바인딩 할 키 시퀀스로 nnoremap <F5> :GundoToggle<CR>대체 <F5>할 수 있음
ewen-lbh


16

vim을 사용하는 경우 다음을 사용하여 실행 취소 트리를 탐색 할 수 있습니다.

  • u: (실행 취소) 실행 취소 트리에서 뒤로 이동
  • Ctrl+R: (다시 실행) 실행 취소 트리에서 앞으로 이동

문서를 제 시간에 가져 오거나 앞으로 가져 오는 다른 방법 :

  • :earlier 15m: 15 분 뒤로 이동
  • :later 15m: 15 분 안에 앞쪽으로 이동

2
이 답변은 한 지점에서 앞뒤로 이동하는 방법에 대해서만 설명합니다. 가지 사이를 이동하는 방법이 아닙니다.
Jonathan Hartley

그러면 모든 지점에서 시간순으로 모든 지점을 정렬하여 이동합니다. @BrianCarper의 답변을 참조하십시오.
Holloway

@JonathanHartley, 당신이 사용하는 경우 earlierlater그 가지에 걸쳐 이동되지 않습니다. 나는 대부분의 사람들이 그들이 만든 다양한 가지를 실제로 돌 보거나 기억하지 않을 것으로 기대합니다. 그러나 시간을 거슬러 돌아가고 싶을뿐입니다. 브랜치를 만들고 이름을 정 git하거나 버전 제어 시스템이 더 나은 옵션입니다.
alpha_989

@ alpha_989 버전 관리에 대한 의견이 이해가되지 않습니다. 버전 관리는 디스크의 명명 된 파일 상태에 대한 것입니다. 우리는 Vim의 실행 취소 트리에 대해 이야기하고 있습니다. 이것은 메모리의 데이터 구조 일뿐입니다. 둘 다 '분기'라는 단어를 사용하지만 같은 의미는 아닙니다.
Jonathan Hartley

이전 / 이후 DO를 지적하는 모든 사람들에게 감사합니다.
Jonathan Hartley

9

이 질문에 대한 답변을 받았지만 예를 추가 할 것이라고 생각했습니다.

새 파일을 작성하고 다음을 입력하십시오.

this is a line

undol실행 취소 트리가 표시됩니다. 이 시점에서 당신은 아무것도 취소하지 않았습니다

:undol

number changes  when               saved
     1       1  14:50:36

이제 ESC를 누르고 행을 다음과 같이 수정하십시오.

this is a old line

일반 모드로 전환하고 u (실행 취소)를 누르면 "이전"이 제거됩니다. 를 체크 undol하면이 시점에서 여전히 하나의 브랜치가 있습니다.

이제 줄을 수정하여 다음과 같이 말합니다.

this is a new line

이제 :undol보여줍니다 :

number changes  when               saved
     2       2  87 seconds ago
     3       2  3 seconds ago

다음을 입력하여 첫 번째 지점으로 전환 할 수 있습니다

:u 2

이 번호와 연결된 지점의 끝을 이동합니다 2. 당신이이 분기를 따라 이동할 수 g+g-. 이 시점 g+에서 아무것도하지 않을 것입니다 (당신은 잎에 있습니다). g-"이전" 을 누르면 제거됩니다 (첫 번째 실행 취소 트리를 통과하고 있음). "이전"을 제거 g-하고 g+다시 누르면 다시 "이전"이 다시 실행됩니다.

입력하면

:u 3

두 번째 실행 취소 분기의 리프로 이동하면 다음과 같이 표시됩니다.

this is a new line


3

gundo.vim을 사용하는 것 외에도 언급 g+하고 싶습니다.g-


3

undotree 패키지 는 순수한 vimscript 로 작성되므로 요구 사항이 없습니다.

그리고 너무 늦기 전에 이것을 vimrc에 추가하십시오 :

  set nobackup
  set noswapfile
  set nowritebackup
  set undolevels=10000         " use many levels of undo
  set history=10000    " After nocompatible

  if has('persistent_undo')
    set undodir=$HOME/.vim/undo
    set undofile 
  endif 

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.