恢复 Vim 备份

13

Vim的文件备份系统刚刚拯救了我,但我有一个问题。

我让vim将备份保存到~/.vim/backups

为了恢复它们,我进入该目录并(按日期排序)将所需文件复制回我的项目文件夹中的必要目录。很容易,只有5个文件。 但是,我惊讶地发现没有明显的方法可以找出每个文件来自哪个目录。 我尝试使用vim -r path/to/file,但似乎使用的是交换文件而不是备份文件。由于在我的情况下vim没有崩溃(我只是错误地覆盖了文件),因此这些文件没有交换文件。

因此,主要问题是:还原vim的备份文件的最佳方法是什么?

附加问题:当我从不同路径(例如/path/one/file.html/path/two/file.html)拥有两个同名文件时,会发生什么在.vim/backup/目录中呢?


实际上,看起来这个旁边的问题又回来咬我了。其中一个备份确实覆盖了另一个备份,我没有任何记录 /path/two/file.html ... 唉。 - Tron
你可以通过阅读文件~/.viminfo来查看一些编辑历史,从而找到某些东西。 - taro
2个回答

11
为了回答关于恢复的问题,Vim 对备份一无所知。它的备份系统非常简单——写入一个文件。要恢复,你必须手动操作。
但是,你可以添加更多信息到你的备份中,以便更容易地进行恢复。
理想情况下,`backupdir` 应该支持末尾的 `//` 以强制扩展文件路径并将 `/` 替换为 `%`。例如,`/tmp/foo.rb` 将变成备份文件 `tmp%foo.rb`。
请参见 `:help undodir` 和 `:help directory`,了解 `undo` 和 `*.swp` 目录设置的详细信息,其中确实包括了 `//`。
但是我们可以伪造出这个功能!
" Prevent backups from overwriting each other. The naming is weird,
" since I'm using the 'backupext' variable to append the path.
" So the file '/home/docwhat/.vimrc' becomes '.vimrc%home%docwhat~'
au BufWritePre * let &backupext ='@'.substitute(substitute(substitute(expand('%:p:h'), '/', '%', 'g'), '\', '%', 'g'),  ':', '', 'g').'~'

备份文件读取的是文件名-然后目录,但它可以工作并且应该足够唯一。

例如:.vimrc%home%docwhat〜/home/docwhat/.vimrc 的备份。

如果您想要每分钟备份,以便您减少工作量,则可以在文件名后附加时间戳:

au BufWritePre * let &backupext = substitute(expand('%:p:h'), '/', '%', 'g') . '%' . strftime('%FT%T') .  '~'

但我建议您设置一个定期清理此目录的cron作业。如果您编辑了我的许多文件,这个文件会很快变得非常大。

或者,您可以聪明地在写入之前更改backupdir(使用BufWritePre钩子),但是那种水平的聪明才智对我来说还有待提高(目前)。

Ciao!


4
据我所知,Vim并不保存有关文件原始位置的任何信息。
保存两个同名文件的备份可能会覆盖现有备份或使用不同的名称,这取决于您在.vimrc中设置了什么。选项“backup”将覆盖现有的备份文件,但“writebackup”将重新命名新备份以避免覆盖。
请查看Vim的文档以获取更多信息-:help backup

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