我试图理解vim中的多级撤消。我打开vim,输入:
1
2
3
4
5
6
7
然后我输入:
:u 1
I got message:
0 changes; before #1 22:53:11
,当我输入:
:u 2
我看见:
E830: Undo number 2 not found
我的理解是在编辑模式下输入的每个vi命令或字符都被视为"更改",但显然情况并非如此。
经验丰富的vim专家能解释一下吗?
一般来说,单个更改是每个更改缓冲区的正常模式命令。
对于插入模式,键入的所有内容都被视为单个更改,直到您离开插入模式。然而也有例外。使用光标键会破坏撤消顺序。另一个例外是,如果您按Ctrl+gu,这将故意破坏撤消顺序。此外,当使用Ctrl+o暂时离开插入模式时,这将打破更改。
您可以这样修改撤消行为(在您的~/.vimrc
中):
inoremap <BS> <c-g>u<BS>
inoremap <CR> <c-g>u<CR>
inoremap <del> <c-g>u<del>
inoremap <c-w> <c-g>u<c-w>
有关更多信息,请参阅::h i_Ctrl-g_u
并阅读vim wiki上的链接。
如果你像我一样使用一些补全插件,你必须做更多。我正在使用deoplete,在这个例子中,我必须这样做:
" <CR>: close popup and save indent.
" Now each Enter creates a undo point ":h i_Ctrl-g_u"
inoremap <silent> <CR> <C-r>=<SID>my_cr_function()<CR>
function! s:my_cr_function()
return deoplete#mappings#smart_close_popup() . "<C-g>u<CR>"
endfunction