2015-08-27 38 views
0

我想了解vim中的多級撤銷。 我打開vim和類型:vim中的「更改」在撤消方面的定義是什麼?

1 
2 
3 
4 
5 
6 
7 

,然後我輸入:

:u 1 

我得到消息:

0 changes; before #1 22:53:11 

,當我輸入:

:u 2 

我看到:

E830: Undo number 2 not found 

我的理解是在編輯模式下鍵入的每個vi命令或字符都被視爲「更改」,但顯然並非如此。

難道經驗豐富的vim專家會澄清嗎?

+1

每個Vi(或Ex)命令,肯定但不是每個鍵入的字符;這將是非常乏味的。就插入而言,它的處理方式與任何其他Vi命令一樣:您進入插入模式插入某些內容並返回正常模式,整個插入操作被視爲一個撤消步驟。 (也就是說,我並不是真的想回答,因爲我不確定這是否結束,我敢肯定有很多複雜的情況,例如,當使用插件用'feedkeys'注入按鍵時,以及我不知道會發生什麼。) – icktoofay

+0

感謝您的信息。你的解釋很有幫助。 – AlexL

+0

這是一個很好的實用近似。除此之外,這非常複雜,並且瞭解您是否不是Vim開發人員並不是特別有用。 [gundo](https://github.com/sjl/gundo.vim)可以給你一個關於確切區別的感覺,它本身就是一個很好的工具。 –

回答

2

一般而言,單個更改是每個正常模式命令都會更改緩衝區。

對於插入模式,輸入的所有內容都被視爲單個更改,直到您離開插入模式。但也有例外。使用光標鍵中斷撤消序列。另一個例外是,如果您按Ctrl + gu這將故意破壞撤銷序列。同樣當使用例如臨時離開插入模式時Ctrl + o這將打破一個變化。

+0

感謝您的信息。但是,你提到的3個例外中沒有一個似乎打破了這些變化。在執行了3個操作之後,我仍然可以像以前那樣撤消和重做。 – AlexL

+0

請準確。什麼不起作用,你期望什麼?在[wiki](http://vim.wikia.com/wiki/Using_undo_branches)中,我還寫了如何改變被破壞。 –

0

您可以修改這樣的撤銷行爲(在~/.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