Quebrando manualmente a sequência de desfazer
Você pode interromper manualmente a sequência de desfazer no modo Inserir com <C-G>u
. Da ajuda :
CTRL-G u break undo sequence, start new change
Exemplo
iHello<C-G>u world!<Esc>u
Isso deixará você com o texto
Hello
Divisão de comandos
i " Enter Insert mode
Hello " Type 'Hello'
<C-G>u " Break the undo sequence
world! " Type ' world!'
<Esc> " Return to Normal mode
u " Undo
Solução automática
Controle de nível inferior de granulação mais fina
Aqui está um pequeno trecho do VimScript usado <C-G>u
para criar quebras de desfazer quando você começa a excluir texto e também quando você começa a inserir texto novamente após uma exclusão.
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>")
Notas
Isto irá funcionar para <BS>
, <C-W>
(excluir uma palavra), e <C-U>
(excluir para o início da linha). Se houver mais maneiras de excluir no modo Inserir, elas poderão ser suportadas adicionando inoremap
chamadas adicionais no final.
:help
arquivos sobre ele ... Consulte: Como depuro meu arquivo vimrc? ... Além disso, usando<C-c>
para sair do modo de inserção pode ter efeitos colaterais ( ver este ) e pode ser parte do problema ... Eu sugiro usarEsc
ou<C-[>
( ver este )