VIM 기록을 일시 중지하는 방법은 무엇입니까?

VIM 기록을 일시 중지하는 방법은 무엇입니까?

파일을 편집할 때 일반적으로 UNDO를 연속해서 여러 번(예: 20번) 실행합니다. VIM에서는 일반적으로 u20번을 눌러 수행되며, 이로 인해 VIM이 기록 스택에서 20단계 위로 "이동"합니다. 이후에 하나를 실행하면 change마지막 20개의 기록 명령이 모두 손실되고 교체됩니다 change. change그 20자리를 잃지 않고 끝내고 싶습니다 . 그래서 이 작업을 수행하기 전에 VIM에게 기록 기록을 중지하고 기록을 다시 시작하라고 말하고 싶습니다 change(기록에 포함되고 싶지 않음 change).

편집하다 좀 더 명확하게 설명하자면, FF버퍼에 쓰는 동안 파일의 마지막 몇 줄을 업데이트하는 기능이 있습니다. 따라서 를 실행하면 20 undos + write마지막 실행에서 write새로운 실행 취소 분기가 열립니다. undojoin내부적으로 추가하려고 시도했지만 FF(아래 jlmg의 조언에 따라 시도) 쓰기-실행 취소-쓰기 시퀀스에서 오류가 발생했습니다.실행 취소 후에는 Union 실행을 취소할 수 없습니다.. sed ....그것을 떠난 후에 뭔가를 할 수 있지만 vim그것을 사용하고 있기 때문에 SSHvim 전용 솔루션을 선호합니다(버퍼를 언로드한 후 명령을 실행하면 파일이 작성되지 않습니다).

편집 2VIM에서 이 작업을 수행해 보세요. 빈 파일을 열고 다음을 수행하세요.

i1<ESC>:wa2<ESC>:wa3<ESC>:wa4<ESC>uu:w

now 를 실행하면 <CTRL>RVIM은 '3'을 다시 쓰고 다음과 같은 결과를 <CTRL>R얻게 됩니다 .4심지어그러나 a가 실행될 때마다 실행 함수를 전달 :w하면 다시 기록 되지 않습니다 . 그게 내가 하고 싶은 일이고, 그래서 "기록 일시 중지"라고 썼는데, 어쩌면 그것이 전체 .<CTRL>R:wBufWritePre<CTRL>R3undotree()

답변1

Vim 기록을 일시 중지할 필요는 없습니다. 실제 데이터는 undotree()이 함수를 사용하여 검색할 수 있는 트리를 형성합니다. 물론 이를 보다 사용자 친화적인 것으로 바꾸는 많은 플러그인이 있습니다.많은 군대,몬도, 그리고실행 취소 트리. 실행 취소 지속성도 활성화하면( 참조 :h undo-persistence) 파일의 전체 변경 기록을 쉽게 찾아볼 수 있습니다.

답변2

내가 올바르게 이해했다면, 당신이 원하는 것은 나중에 실행 취소 작업을 수행하면 해당 실행 취소 작업 change뿐만 아니라 20번의 실행 취소 작업도 취소되어야 한다는 것입니다.

vim이 함수나 명령을 실행하면 수행된 모든 작업이 함께 취소됩니다. 이러한 작업에 실행 취소가 포함될 수 있는지 확실하지 않습니다. 아마도 문서의 이 부분이 도움이 될 수 있습니다.

3. Undo blocks                      *undo-blocks*

One undo command normally undoes a typed command, no matter how many changes
that command makes.  This sequence of undo-able changes forms an undo block.
Thus if the typed key(s) call a function, all the commands in the function are
undone together.

If you want to write a function or script that doesn't create a new undoable
change but joins in with the previous change use this command:

                        *:undoj* *:undojoin* *E790*
:undoj[oin]     Join further changes with the previous undo block.
            Warning: Use with care, it may prevent the user from
            properly undoing changes.  Don't use this after undo
            or redo.
            {not in Vi}

This is most useful when you need to prompt the user halfway through a change.
For example in a function that calls |getchar()|.  Do make sure that there was
a related change before this that you must join with.

This doesn't work by itself, because the next key press will start a new
change again.  But you can do something like this: >

    :undojoin | delete

After this an "u" command will undo the delete command and the previous
change.

To do the opposite, break a change into two undo blocks, in Insert mode use
CTRL-G u.  This is useful if you want an insert command to be undoable in
parts.  E.g., for each sentence.  |i_CTRL-G_u|
Setting the value of 'undolevels' also breaks undo.  Even when the new value
is equal to the old value.

아쉽게도 을(를) 사용해 보았 :undo 2 | undojoin | normal ohi으나 오류 메시지가 나타났습니다 E790: undojoin is not allowed after undo.

그러나 다음과 같은 함수에서 작업이 수행되는 경우:

function F()
  undo 2
  normal ohi
endfunction

그런 다음 호출하면 해당 작업과 실행 취소 블록의 :call F()다른 작업이 수행 됩니다. undo실행 취소를 사용하고 있으므로 새 실행 취소 분기를 생성한다는 점에 유의하세요. 완료되면 일반 모드 명령을 사용하여 처음에 했던 것처럼 실행 g-취소 할 수 있습니다.F()u:undo 3

관련 정보