在vim中撤销从交换文件中恢复的操作

13

在进行重大更改之前,我在vim中意外地从一个过时的交换文件中“恢复”了该文件。我的更改似乎已经消失了。我尝试查看撤销树,但是还是有很多更改丢失了。是否有任何方式可以撤消恢复操作,还是我注定要失败?


现在尝试打开文件会发生什么?它是否显示仍有交换文件? - Explosion Pills
在我的系统上,每次打开一个交换文件时,我只会得到一个波浪号。你有检查过吗?我的意思是应该有一个名为myfile.txt的文件,如果打开它,则会创建myfile.txt~~。 - matcheek
是的,交换文件还在;只有一个交换文件。 - Zach Conn
我也遇到了同样的问题。你是如何解决的? - Jasmitha Meka
3个回答

13
以下是我用于恢复文件以及它的撤销历史和未保存更改的步骤:
  1. 假设您有 my_file 文件,其中包含一些持久的撤销历史记录 + 在 .my_file.swp 中的未保存更改
  2. 使用 vim 打开文件,并按 r 键获取恢复版本
  3. 将恢复版本保存到临时位置,例如::w /tmp/%
  4. 不保存关闭(:q!)。再次打开文件并按 d 键删除交换文件
  5. 可选:比较 /tmp/my_file 和 my_file ,以确保您想要的是已恢复的版本
  6. 手动添加 /tmp/my_file 中的更改(例如,ggdG 和 :r /tmp/%)
这可能可以简化,但对我有效。
PS:这不会为磁盘上和恢复版本之间的更改提供撤消历史记录,它将出现在一个大的编辑历史记录中。

2
比被接受的答案更有用。只要您没有将恢复的文件保存在原始文件上,那么绝对不会太晚! - J.M. Janzen
在第四步中完全退出 vim 是不必要的。我可以使用 :e! 强制重新加载。 - Chaim Leib Halbert

7

如果您意外地恢复了文件,您可以简单地输入:q!以退出vim而不保存已恢复的更改 - 这将保留您的原始文件和交换文件。

下次打开文件时,您将看到相同的提示 - 按D删除交换文件,或者手动查找并删除同一位置的任何其他交换文件。


3

我刚刚尝试了这个功能(启用了持久撤销;Vim版本为7.3.823)。旧的更改仍然显示在:undolist中,但是当尝试恢复时,出现了问题。

E438: u_undo: line numbers wrong

看起来Vim无法处理这种情况。请注意,你已经被警告了;恢复明确警告:

Recovery completed. You should check if everything is OK.
E308: Warning: Original file may have been changed

我刚刚尝试使用最新的Vim 7.4.140进行复制; 在那里,我得到了 E310,并且旧的交换文件没有应用于更新的文件(这将防止您的问题)。 - Ingo Karkat
我使用了启用持久撤销的Undotree,并且有部分历史记录可用,但像您一样,我遇到了“行号错误”的错误;应用历史编辑会导致源文件有些混乱。 - Zach Conn
使用Undotree,您至少可以获取更改之间的差异(显示在底部窗口中),然后手动应用它们。虽然不是理想的解决方案,但这是您所能期望的最好的结果。 - Ingo Karkat
1
是的——你已经被警告了,但现在为时已晚,什么也做不了。 - JESii

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接