Vim에서 실행 취소 세분성을 변경하는 방법은 무엇입니까?


11

어떤 시점에서 내 Vim은 내가 맞을 때 전체 단어를 취소합니다 u.

[i]typing some words[C-c][u]

결과

typing some

그러나 실행 취소 세분성은 한 번에 하나의 문자를 삭제하는 것으로 변경되었습니다.

[i]typing some words[C-c][u]

결과

typing some word

Practical Vim에서 실행 취소 세분성을 사용자 정의하는 것에 대해 읽은 것을 기억하지만 제어 방법을 기억할 수는 없습니다. 어떤 도움을 주셔서 감사합니다!


2
vimrc에 이것을 수행하는 것이있을 수 있습니다. 복제 할 수없고 :help파일 에서 아무것도 찾을 수 없습니다 ... 참조 : vimrc 파일을 어떻게 디버깅합니까? ... 또한, 사용하여 <C-c>부작용이있을 수 있습니다 종료 삽입 모드로 ( 이 참조 )와 문제의 일부가 될 ... 내가 사용 제안 Esc이나 <C-[>( 이 참조 )
마틴 Tournoij

답변:


11

실행 취소 시퀀스를 수동으로 끊기

을 사용하여 삽입 모드에서 실행 취소 시퀀스를 수동으로 해제 할 수 있습니다 <C-G>u. 에서 도움 :

CTRL-G u        break undo sequence, start new change

iHello<C-G>u world!<Esc>u

이것은 당신에게 텍스트를 남길 것입니다

Hello

명령 분석

i                           " Enter Insert mode
 Hello                      " Type 'Hello'
      <C-G>u                " Break the undo sequence
             world!         " Type ' world!'
                   <Esc>    " Return to Normal mode
                        u   " Undo

자동 솔루션

세밀한 실행 취소 레벨 제어

다음은 텍스트 삭제를 시작할 때와 삭제 후 다시 텍스트를 입력 할 때 실행 취소 나누기를 만드는 데 사용 되는 VimScript 의 작은 조각입니다<C-G>u .

function! s:start_delete(key)
    let l:result = a:key
    if !s:deleting
        let l:result = "\<C-G>u".l:result
    endif
    let s:deleting = 1
    return l:result
endfunction

function! s:check_undo_break(char)
    if s:deleting
        let s:deleting = 0
        call feedkeys("\<BS>\<C-G>u".a:char, 'n')
    endif
endfunction

augroup smartundo
    autocmd!
    autocmd InsertEnter * let s:deleting = 0
    autocmd InsertCharPre * call s:check_undo_break(v:char)
augroup END

inoremap <expr> <BS> <SID>start_delete("\<BS>")
inoremap <expr> <C-W> <SID>start_delete("\<C-W>")
inoremap <expr> <C-U> <SID>start_delete("\<C-U>")

노트

이것은 작동합니다 <BS>, <C-W>(단어를 삭제)하고, <C-U>(라인의 시작으로 삭제). 삽입 모드에서 삭제하는 방법이 더 있으면 inoremap끝에 통화를 추가하여 지원할 수 있습니다 .


4
단지 문제는, 당신은 당신이 나중에 취소 할 것이라고 예상하지 않는다는 것입니다 (그렇지 않으면 처음에는 그것을하지 않을 것입니다). 따라서 일반적으로 이미 사용 하고 싶은 상황 <C-G>u이 너무 늦습니다.
Shahbaz

4
예. 실제로 내가 놓친 것은 이것입니다. 때로는 필자 i가 작성한 내용의 일부를 제거하기 위해 긴 문장 다음에 백 스페이스가옵니다 (모두 삽입 모드). 그런 다음 백 스페이스를 사용해서는 안되며 작성한 내용이 양호하다는 것을 알았습니다. 실행 취소하지만 삽입 된 전체 텍스트가 취소됩니다. 그래서 긴 문장이나 백 스페이스가없는 부분이 남지 않았습니다. 백 스페이스 부분을 되 돌리는 것은 불가능합니다. 백 스페이스에서 실행 취소 시퀀스를 중단하도록 vim에 지시하는 방법이 있습니까? (이제 말하면 map백 스페이스는 옵션입니다.)
Shahbaz

2
또한 향후 방문자를 위해 inoremap <CR> <C-G>u<CR>각 실행 취소가 한 줄에 포함되도록 추가했습니다 (논스톱으로 입력 한 전체 단락을 더 이상 실행 취소하지 않음).
Shahbaz

1
@Shahbaz, 절대적으로 :)
tommcdo 12

1
@Shahbaz "복사 할 수 있습니까?" 페이지 하단에있는 링크를 참조하십시오 : "
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.