Answers:
您可以使用手动在插入模式下中断撤消顺序<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
在末尾添加其他呼叫来支持它们。
<C-G>u
,这已经为时已晚。
i
然后再执行长句子,后跟退格键,以删除我写的部分内容(全部处于插入模式)。然后我意识到我不应该退格,并且我写的东西还不错。我撤消操作,但是整个插入的文本都被撤消。因此,要么我没有长句子,要么是没有后退空格的部分。不可能将退回的部分找回来。有没有办法告诉vim在退格符上打破撤消序列?(现在我这样说,map
退格当然是一种选择)。
inoremap <CR> <C-G>u<CR>
了一个选项,使每个撤消操作都包含在一行中(不再撤消您不停输入的整个段落)。
:help
与其有关的文件中找到任何东西。请参阅:如何调试vimrc文件?...另外,使用<C-c>
退出插入模式可能会有副作用(请参阅此),并且可能是问题的一部分...我建议您使用Esc
or<C-[>
(请参阅此)