u
时,我的Vim会撤消整个单词。[i]typing some words[C-c][u]
会导致
typing some
但是,撤消粒度似乎已更改为一次删除一个字母。
[i]typing some words[C-c][u]
结果在
typing some word
我记得读过一些有关在实用Vim中定制撤消粒度的信息,忘记了如何控制它。任何帮助表示赞赏!
#1 楼
手动中断撤消序列您可以使用
<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
调用来支持它们。评论
唯一的问题是,您不会预见到以后将要撤消操作(否则您一开始就不会这样做)。因此,您通常会遇到希望使用
– Shahbaz
2015年3月5日15:40
是。其实我一直想念自己的是这个。有时我会这样做,然后是长句子,后跟退格键,以删除我写的部分内容(全部以插入方式)。然后我意识到我不应该退格,并且我写的东西还不错。我撤消操作,但是整个插入的文本都被撤消。因此,要么我没有长句子,要么是没有后退空格的部分。不可能将退回的部分找回来。有没有办法告诉vim在退格符处打破撤消序列? (现在,我说了,映射退格键当然是一种选择)。
– Shahbaz
2015年5月5日15:46
对于将来的访问者,我还添加了inoremap
– Shahbaz
15年3月6日在11:06
@Shahbaz,绝对:)
–tommcdo
2015年3月9日,12:14
@Shahbaz“我可以复制吗?”请参阅页面底部的链接:“根据CC BY-SA 3.0许可的用户贡献,需要提供出处”
–user859
17年2月14日在17:00
评论
您的vimrc中可能有某些功能可以做到这一点。我无法复制该文件,也无法在:help文件中找到有关它的任何内容……请参阅:如何调试vimrc文件?效果(请参阅此),并且可能是问题的一部分...我建议使用Esc或