如何安全撤消可能已做或可能未做的更改?


12

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

有时,我可以跟踪自己的步骤,并记起我键入的内容,以修复任何更改或恢复我早日发现的调整设置。不幸的是,并非总是如此。

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


1
您是否正在寻找“还原”动作?:e!会做到这一点
贾斯珀

1
我认为:e!,如果自上次正确状态以来没有保存过数据,那会很糟糕;如果u键入很多东西,可能会不够用。(date month例如,如果您键入,则将删除一个标签,设置一个标记并执行搜索,这会导致通过撤消操作而造成很大的混乱u。)
wchargin 2015年

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

Answers:


14

调用

:undolist

查看您何时进行了最后一组更改。如果它说有一些更改,例如“ 3秒前”,并且您知道自己只是有意地更改了,例如一分钟前,则执行

:earlier 10s

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


进一步参考: :help undo-tree


4

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

您可以结合使用现有的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


0

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

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

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

5
该命令是:earlier 1f。该1f手段“1个先前保存的状态”,所以它会回到上一次保存的文件。如果缓冲区被修改,则撤消所有修改。如果未修改缓冲区(即缓冲区当前处于保存状态),则它将转到您上一次保存文件的时间。
jamessan 2015年
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.