我经常会错误地在错误的窗口焦点上输入错误(并且使用USB身份验证器已经这样做了几次)。在启用了许多热键的程序(Gmail,VLC,Vim)中,这常常会带来意想不到的后果,即进行了不必要的修改。

我有时可以跟踪我的步骤并记住为修复任何更改而键入的内容或恢复我早日调整过的所有设置。不幸的是,情况并非总是如此。

在Vim中,我可以像改变一行容易撤消的文本一样无害且显而易见。或者,我可能在不知不觉中修改了一些不易识别的内容。如果我不小心在Vim中键入了一系列不需要的命令,该如何检查并撤消对设置的任何编辑或更改?

评论

您是否正在寻找“还原”动作? :e!会做到的

我认为:e!如果您自从上次正确状态以来没有保存过数据,那将是很糟糕的;如果您键入一堆东西,您可能会不够用。 (例如,如果您键入日期月份,那么您将删除一个标签,设置一个标签并执行搜索,通过u撤消操作会非常混乱。)

@WChargin不说u是序列的一部分,在中间执行一些撤消操作。

#1 楼

调用

:undolist


以查看何时进行了最后一组更改。
如果说已进行了一些更改,例如“ 3秒前”,并且您知道您只是有意地对其进行了更改,例如,在一分钟前,然后执行

:earlier 10s


以恢复到所需的状态。
否则,如果最近没有更改,则无需执行任何操作。


进一步的参考::help undo-tree

#2 楼

为了改写这个问题,您正在寻找一种方法来查看或以其他方式通知您对文件所做的更改,然后使用撤消功能。也许有其他方式甚至插件都支持此功能。但是,我将解释为达到相同目的而一直使用的功能。

您可以结合使用现有的vim功能来完成此操作。例如,您可以定义一个函数,例如:

" Function: View changes after the last save
function! s:DiffSinceSave()
  let filetype=&ft
  diffthis
  vnew | r # | normal! 1Gdd
  diffthis
  exe "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype
  exe "normal! ]c"
endfunction
com! DiffSaved call s:DiffSinceSave()


您以后可以调用它甚至映射快捷键。

" Map key to function: View changes after the last save
nnoremap <leader>? :DiffSaved<CR>


这将打开一个基于拆分窗口的差异视图,该视图将显示自上次保存以来所做的更改。确定所做的更改后,您可以退出该视图并使用其他vim功能(例如undo和undo tree等),甚至使用插件恢复到以前的状态。

我意识到之所以不理想,是因为您必须具有某种工作流程才能有用。但这工作得很好。从好的方面来说,我们没有改变vim的工作方式或依赖外部的任何东西。

我希望你觉得这有用。不久前,我根据包括vim Wikia在内的Internet上的摘要改编了此解决方案。这就是应得的信用额。

#3 楼

在我看来,这的简单答案是按u直到取消要保留的更改,然后按Ctrl-R

#4 楼

像@superjer一样,我一直按住u直到状态栏中的红色[+]标记消失。

set statusline=%f\ %#Error#%m%##


评论


拥有一个自动撤消到最后一个未修改状态的键可能会很好。但是:e!这也是一个不错的解决方案;最近,Vim甚至会将您的“已丢弃”更改保留在撤消历史记录中。

– joeytwiddle
15年8月11日在6:52

该命令是:早期1f。 1f表示“ 1个以前的保存状态”,因此它将返回到上一次保存文件的时间。如果缓冲区被修改,则撤消所有修改。如果缓冲区未修改(即当前处于保存状态),则它将转到您上一次保存文件的时间。

–詹姆斯
15年8月11日在14:34