如何在vim中丢弃撤消历史记录?


23

撤消在Vim中很不错。但是有时候,在某个已知的好点上,我想擦除撤消历史记录,以便能够u撤消单个更改,但只能恢复到某个特定点。(例如,这可能是我上次提交的时间。)

完成此操作的一种方法是关闭并重新打开文件-撤消历史记录在此时开始清除。但这很麻烦。

过去,我是通过完成此操作的:edit!。但是在Vim 7.3中,这不会放弃撤消历史记录。

除了关闭文件,还有另一种方法吗?


所以您实际上只想恢复文件的状态,就像上次提交时一样?您基本上只想将'u'键重新映射为git checkout -f filehg rollback file
akira

@akira-不,我希望能够u撤消个人更改,但不能超过我上次提交的时间。就像我每次提交时一样,我关闭了文件并重新打开了它。这是:edit!过去要做的-就像关闭文件然后重新打开一样。这不必与提交点相关联,这只是我最需要的时间。
内森·朗

啊,这使问题更加清楚了。您应该稍微改变一下问题。
akira

Answers:


11
:set undoreload=0 | edit

应该按照您的要求做。


1
哈!只需关闭该功能,对吗?:)不知道为什么我花了这么长时间才注意到这一点。
内森·朗


6

Benoit的功能对我不起作用,但是我在vim手册中找到了类似的地方:

http://www.polarhome.com/vim/manual/v73/undo.html#undo-remarks

我将它拍打成一个函数,添加到我的vimrc中,在vim 7.3上似乎运行良好:

" A function to clear the undo history
function! <SID>ForgetUndo()
    let old_undolevels = &undolevels
    set undolevels=-1
    exe "normal a \<BS>\<Esc>"
    let &undolevels = old_undolevels
    unlet old_undolevels
endfunction
command -nargs=0 ClearUndo call <SID>ForgetUndo()

可以与结合使用:ClearUndo


1
使用Gundo插件正常工作并重新加载undo文件,这件事对我来说真的很方便。但是,我更改了两件事:而不是普通的编辑命令(它本身似乎在7.4上保留了一些编辑历史记录),我只是使用了一个编辑!(并且始终在擦除撤消历史记录之前写)。似乎某些内部列表未正确更新,因此,如果要与Gundo插件一起使用,请进行额外的编辑!在功能端可以防止以后出错。
PlasmaHH 2013年

@PlasmaHH您能否发布清除撤消历史记录的功能,因为我不了解您所做的更改...(您可以将其发布为对使用gundu的我们的解答)。谢谢
2014年

5

大概:

:let old_ul=&ul
:set ul=-1
:let &ul=old_ul
:unlet old_ul

'ul'是的别名'undolevels')。


这可行!现在,我正在尝试使单个命令执行此操作-最好是:edit!。首先,我使用您列出的命令制作了一个名为ClearUndos()的函数,但是调用它似乎没有任何作用,而单独执行这些命令却可以……
Nathan Long 2010年

3
:command -nargs=0 Reset let old_ul=&ul | set ul=-1 | e! | let &ul = old_ul | unlet old_ul
Benoit

那是功能的内容吗?它对我不起作用,但也许我误会了。另外-也许将其移至自己的答案?
内森·朗

也许您不能|在命令内容中放入原始内容。然后创建一个执行我在答案中告诉我的功能的函数,并将命令设置为call thefunction()
Benoit 2010年

3

“清除撤消历史记录(:w清除撤消文件(如果显示)
command! -bar UndoClear exe "set ul=-1 | m-1 | let &ul=" . &ul

  • 当您将“撤消级别”设置为-1时,撤消信息不会立即清除,这会在下一个更改(即m-1,实际上不会更改您的文本)时发生。
  • 如果'undofile'是,:w清除撤销文件,或链状UndoClear|w

1

在脚本中:

function! <SID>ForgetUndo
     let old_ul = &ul
     set ul=-1
     let &ul = old_ul
     unlet old_ul
endfunction
command -nargs=0 Reset call <SID>ForgetUndo()

然后使用:Reset来调用它。


您的函数定义行最后需要()。
内森·朗

这很奇怪-单独运行这些命令可以正常工作,并且在整个函数中回显值表明它们已正确设置和未设置。但是运行该功能不会重置撤消历史记录-之后,我仍然可以撤消多次。也许该set ul=命令仅在脚本退出之前影响局部变量,并且由于我们在脚本退出之前将其更改回原来的位置,因此它从不影响环境?您是否测试了此功能并使其正常工作-意思是说,我的设置是否有些奇怪?
内森·朗
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.