Ручное нарушение последовательности отмены
Вы можете вручную прервать последовательность отмен в режиме вставки с помощью <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
вызовы в конце.
:help
файлах об этом ... См .: Как мне отладить мой файл vimrc? ... Кроме того, использование<C-c>
для выхода из режима вставки может иметь побочные эффекты ( см. Это ) и может быть частью проблемы ... Я бы предложил использоватьEsc
или<C-[>
( см. Это )