RECOVER

*recover.txt*   For Vim version 6.2.  原文最近更新: 2001年9月3日


                     Vim 参考手册    作者:Bram Moolenaar
            (翻译:iCrazy<[email protected]>  http://vimcdoc.sf.net)

从崩溃中恢复                                              *crash-recovery*

您经历过这样的事情么?您录入一个文档,录入了很长时间,眼看就要完成的时候,灾难
来了:您的电脑崩溃了!

                        别 担 心 !

在绝大部分情况下您可以恢复您的文档,因为Vim替您保存了它们。一般情况下,您可以
用这个命令来恢复您的文档:
        vim -r filename

1. 交换文件         |swap-file|
2. 恢复                       |recovery|


1. 交换文件                                         *swap-file*

Vim把您对文件的改动保存在一个交换文件中。多数情况下,用修改前的原文件加上Vim的
交换文件,您就可以恢复对文档所做的改动了。

您可以用以下的命令看到当前正在使用的交换文件的文件名:

        :sw[apname]                                     *:sw* *:swapname*

正常情况下,交换文件的文件名和您正在编辑的文件相同,只是扩展名换成了 ".swp".
- 在 Unix 系统下,交换文件名以 '.' 开始,这样它们就不会在列目录文件时被显示出
  来。
- 在 MS-DOS 系统下,如果 'shortname' 选项是打开的,原文件名中的 '.' 会被 '_'
  替代。
- 如果同名交换文件已经存在(例如:当您从一个崩溃中恢复时),Vim会显示一个警告
  信息,并且会使用其他诸如 ".swo", ".swn" ……这样的文件扩展名。
- 一个现存的文件不会被 Vim 所覆盖。
- 当 Vim 停止编辑文件的时候,交换文件会被迅速删除。

技巧:       用 '_' 替代 '.' 是为了避免在与 MS-DOS 兼容的文件系统中出现问题(例如
        :跨 DOS平台,多DOS平台)。如果 Vim 检测到您所编辑的文件存放在一个与
        MS-DOS 相似的文件系统上,Vim 会建立一个标志,实现和 'shortname' 选项
        相同的功能。当您开始编辑其他文件时,这个标志的值会被复原。
                                                        *E326*
        如果扩展名是 ".swp" 的文件已经存在,最后的字母会依次递减直到没有重名
        文件,或达到了 ".saa" 这个扩展名。在后面一种情况下,将不会建立交换文
        件。

通过设置 'directory' 这个选项,您可以把交换文件放到其他目录中去,而不是默认的
和您所编辑的文件放在同一目录中。
优点:
- 您不会因为 ".swp" 文件的存在弄乱您的目录。
- 当您把选项 'directory' 的值设置到另一个分区的时候,可以减少(在一次系统崩溃
  中)毁坏文件所在分区文件系统的危险。
缺点:
- 如果您在不同目录下面编辑同名文件,您会碰到文件重名问题(尽管Vim会比较文件路
  径而尽力避免此问题的发生)。这个会导致 Vim 给出虚假的警告信息。
- 如果您使用您的宿主(home)目录,而别人试图编辑同一个文件的时候,他不能访问
  您的交换文件,也就不会出现警告信息。
在 Amiga 系统上,您还可以使用一种可以恢复数据的 ram disk,但是不能保证它可以
100%工作正常。把交换文件放在普通的 ram disk(就像 Amiga 系统中的内存那样)或
者重启后所有内容都会被清除的地方(就像 Unix 中的 /tmp 目录)是没有意义的,在
一次计算机崩溃中您会丢失所有的交换文件。

如果您希望把交换文件放在一个固定的地方,把类似于下面这些的命令写到您的 .vimrc
文件中去:
        :set dir=dh2:tmp        (针对 Amiga)
        :set dir=~/tmp          (针对 Unix)
        :set dir=c:\\tmp        (针对 MS-DOS 和 Win32)
这个对于编辑软盘上的文件是十分便利的。当然您必须先自己建立这个 "tmp" 目录。

对于那些只读的文件,Vim不会产生交换文件,除非文件特别大,使得内存使用超出了
'maxmem' 或 'maxmemtot' 的设置值。当然,如果对只读的文件进行了修改,交换文件
文件会被自动建立。

可以复位 'swapfile' 这个选项的值以避免产生交换文件。


发现一个已经存在的交换文件 

您可以在用户手册中找到这些信息,参阅章节 |11.3|.


更新交换文件 

在您录入200个字符后或者4秒内没有录入任何字符时,交换文件会被更新。只有在缓冲
被修改的情况下,才会有这样的更新,仅仅移动光标是不会更新交换文件的。为什么不
进行实时的更新?原因在于这样频繁的更新会极大的拖慢其他正常工作的速度。您可以
在 'updatecount' 选项中修改200个字符的设置,还可以在 'updatetime' 选项中修改4
秒的设置(时间以毫秒为单位给出)。Vim更新交换文件后,会把文件同步到磁盘上去。
这个会消耗一定的时间,尤其是在忙碌的 Unix 系统上。如果不希望这样,您可以把
'swapsync' 选项置成空串。不过,这样会使文件丢失的几率增大。在一些非 Unix 系统
(MS-DOS, Amiga)上,交换文件根本不会被写到磁盘上。

如果不希望把修改写到交换文件中,可以通过把 'updatecount' 选项设成0而避免这一
点。用 "-n" 选项启动 Vim 时也可以达到相同的效果。把 'updatecount' 选项设成非0
值可以恢复对交换文件的写入。这种情况下,交换文件只用来缓冲。但是当把
'updatecount' 选项设成0时,已经存在的交换文件不会被删除,这个选项值仅仅影响在
设置它之后打开的文件。

如果您想确定您对文件所作的修改被写到交换文件中了,使用这个命令:

                                        *:pre* *:preserve* *E313* *E314*
:pre[serve]             把缓冲区中的所有文本写入交换文件中。这样在文件恢复时
                        就不再需要原文件了  {Vi: 紧急出口}

Vim 会通过文件开始的6个字符 "b0VIM " 来识别它的交换文件。Vim的版本号(如:3.0
)会紧跟在那些字符之后。


2. 恢复                                               *recovery* *E308* *E311*

基本的文件恢复已经在用户手册中解释了:|usr_11.txt|.

另一种恢复方式就是在启动 Vim 后使用 ":recover" 命令。当您用 Vim 编辑一个文件
并且得到一个“注意:已找到一个交换文件 ...”这样的提示时,这样做是比较方便的
。这种情况下,一个简单的 ":recover" 命令就可以完成所有的工作。您也可以在使用
":recover" 命令时指定文件名或者交换文件名:
                                        *:rec* *:recover* *E305* *E306* *E307*
:rec[over] [file]       试图从交换文件中恢复 [file]。如果没有指定 [file],使
                        用当前缓冲的文件名。当前缓冲中的内容会丢失。如果缓冲
                        没有被修改,此命令失效。

:rec[over]! [file]      类似于 ":recover",不过当前缓冲中的任何改变都会丢失。

                                                        *E312* *E309* *E310*
在交换文件被损坏时,Vim 仿佛有些智能,知道接下来该怎么做。如果 Vim 对于找到的
文件有所怀疑,它会给出一个出错信息,并且在文本中插入含有 "???" 的行。如果您在
恢复的时候看到了出错信息,请在文件中查找 "???" 并确定到底哪里出了问题。或许您
需要通过剪切和粘贴来得到您所需要的信息。

在覆盖原文件并删除交换文件的时候,请务必确定您所作的恢复是成功的。把恢复出来
的文件存到别的地方,然后运行 'diff' 来确定您所需要的内容是否在其中是个好习惯。

当您确定恢复成功后,请删除交换文件。否则,您会继续得到 ".swp" 文件已经存在的
警告信息。

{Vi: 在有可以恢复的内容时,用另一种方式恢复并且发送邮件}

 vim:tw=78:ts=8:ft=help:norl:

Generated by vim2html on Tue Jul 27 00:35:24 CST 2004