就撤消而言,VIM 中"change"的定义是什么?



我试图理解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

相关内容

最新更新