如何在Vim中更改撤消粒度?


11

在某些时候,当我点击时,Vim会撤消整个单词u

[i]typing some words[C-c][u]

会导致

typing some

但是,撤消粒度似乎已更改为一次删除一个字母。

[i]typing some words[C-c][u]

结果是

typing some word

我记得读过一些有关在实用Vim中自定义撤消粒度的信息,但是我不记得如何控制它。任何帮助表示赞赏!


2
您的vimrc中可能有某些功能可以做到这一点。我无法复制它,也无法在:help与其有关的文件中找到任何东西。请参阅:如何调试vimrc文件?...另外,使用<C-c>退出插入模式可能会有副作用(请参阅此),并且可能是问题的一部分...我建议您使用Escor <C-[>请参阅此
Martin Tournoij 2015年

Answers:


11

手动中断撤消顺序

您可以使用手动在插入模式下中断撤消顺序<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在末尾添加其他呼叫来支持它们。


4
唯一的问题是,您不会预见到以后将要撤消操作(否则,您一开始就不会这样做)。因此,您通常会遇到希望使用的情况<C-G>u,这已经为时已晚。
Shahbaz 2015年

4
是。其实我一直想念自己的是这个。有时,我会先执行此操作,i然后再执行长句子,后跟退格键,以删除我写的部分内容(全部处于插入模式)。然后我意识到我不应该退格,并且我写的东西还不错。我撤消操作,但是整个插入的文本都被撤消。因此,要么我没有长句子,要么是没有后退空格的部分。不可能将退回的部分找回来。有没有办法告诉vim在退格符上打破撤消序列?(现在我这样说,map退格当然是一种选择)。
Shahbaz 2015年

2
对于将来的访问者,我还添加inoremap <CR> <C-G>u<CR>了一个选项,使每个撤消操作都包含在一行中(不再撤消您不停输入的整个段落)。
Shahbaz 2015年

1
@Shahbaz,绝对是:)
tommcdo

1
@Shahbaz“我可以复制吗?” 请参阅页面底部的链接:“根据cc by-sa 3.0许可需要授权的用户贡献,并且需要
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.