在某些时候,当我按下u时,我的Vim会撤消整个单词。

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

会导致

typing some

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

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

结果在

typing some word

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

评论

您的vimrc中可能有某些功能可以做到这一点。我无法复制该文件,也无法在:help文件中找到有关它的任何内容……请参阅:如何调试vimrc文件?效果(请参阅此),并且可能是问题的一部分...我建议使用Esc或(请参阅此)

#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调用来支持它们。

评论


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

– Shahbaz
2015年3月5日15:40

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

– Shahbaz
2015年5月5日15:46

对于将来的访问者,我还添加了inoremap u ,这样每个撤消操作都包含在一行中(不再撤消您不停地键入的整个段落)。

– 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