Vim documentation: recover

VIM 参考手册 by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar 译者: iCrazy<icrazy@ustc.edu> http://vimcdoc.sf.net 更新: tocer 从崩溃中恢复 *crash-recovery* 您经历过这样的事情么?您录入一个文档,录入了很长时间,眼看就要完成的时候,灾难 来了: 您的电脑崩溃了! 别 担 心 ! 您可以从 Vim 提供的文件里恢复大部分的改动,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 兼容的文件系统中 (crossdos、 multidos 等) 出现问题。如果 Vim 检测到您所编辑的文件存放在一个与 MS-DOS 兼容的文件系统上,Vim 会建立一个标志位,实现和 'shortname' 选项 相同的功能。当您开始编辑其他文件时,这个标志位会被重置。 *E326* 如果扩展名是 ".swp" 的文件已经存在,逐次递减最后的字母,直到找到没有现 存文件的名字为止。如果过了 ".saa" 还找不到,不建立交换文件。 通过设置 'directory' 这个选项,您可以把交换文件放到其他目录中去,而不是默认地 和您所编辑的文件放在同一目录中。 优点: - 您不会因为 ".swp" 文件的存在弄乱您的目录。 - 当您把选项 'directory' 的值设置到另一个分区的时候,可以减少 (在一次系统崩溃 中) 文件所在分区文件系统毁坏的危险。 缺点: - 如果您在不同目录下面编辑同名文件,您会碰到文件重名问题 (尽管 Vim 会比较文件 路径而尽力避免此问题的发生)。这会导致 Vim 给出虚假的 ATTENTION 警告信息。 - 如果您使用您的宿主 (home) 目录,而别人试图编辑同一个文件的时候,他不能访问您 的交换文件,也就不会出现 ATTENTION 警告信息。 在 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' 这个选项的值以避免产生交换文件。:noswapfile 修饰符可用来 使新缓冲区不建立交换文件。 :nos[wapfile] {command} *:nos* *:noswapfile* 执行 {command}。如果包含载入新缓冲区的命令,缓冲区载入时不建立 交换文件,并复位 'swapfile' 选项。如果缓冲区已经有了交换文件则 不删除之,也不复位 '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] 把缓冲区中的所有文本写入交换文件中。这样在文件恢复时就 不再需要原文件了。 本命令设置了当前缓冲区的一个标志位。如果 'cpoptions' 里有 '&' 标志位而且 Vim 退出时如果此缓冲区还处于载入状 态,不删除此缓冲区的交换文件 |cpo-&|{Vi: 也可能退出} Vim 会通过文件开始的 6 个字符 "b0VIM " 来识别它的交换文件。Vim 的版本号 (如: 3.0) 会紧跟在那些字符之后。 链接和符号链接 ~ Unix 上同一文件可以有两个名字。这可以通过硬链接和符号链接 (symlink) 完成。 对于硬链接,Vim 不知道文件另外的名字。所以,交换文件名基于你用来编辑的文件名。 也不会检查是否编辑了使用别的名字的相同文件,因为 Vim 无法找到另外那个交换文件 (除非在你整个硬盘上搜索,这太慢了)。 对于符号链接,Vim 解析链接以找到实际文件的名字。交换文件名基于那个实际的名字。 所以不管你用哪个名字编辑,交换文件名通常总是相同的。但有若干例外: - 如果实际文件所在的目录不可写,交换文件会放在别处。 - 如果符号链接因为某些原因形成了循环,你会得到 *E773* 错误消息,而使用未经修改 的文件名。你不能在以后正常地保存文件。 ============================================================================== 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 对于找到的 文件有所怀疑,它会给出一个出错信息,并且在文本中插入含有 "???" 的行。如果您在 恢复的时候看到了出错信息,请在文件中查找 "???" 并确定到底哪里出了问题。或许您 仍然可以通过剪切和粘贴来取回可用的信息。 最常见的信息是 "???LINES MISSING"。这表示 Vim 无法从原文件中读取文本。通常在系 统崩溃而导致部分原文件无法及时写入磁盘时会出现这样的情况。 在覆盖原文件并删除交换文件之前,请务必确定您所作的恢复是成功的。先把恢复出来的 文件存到别的地方,然后运行 'diff' 来确定是否已经所需要的改动,是个好习惯。也可 使用 |:DiffOrig|。 当您确定恢复成功后,请删除交换文件。否则,您会继续得到 ".swp" 文件已经存在的警 告信息。 {Vi: 在有可以恢复的内容时,用另一种方式恢复并且发送邮件} 加 密 和 交 换 文 件 *:recover-crypt* 如果文本文件经过加密,交换文件也同样要加密。这使得恢复稍微复杂一些。从交换文件 恢复而又用到加密时,你需要输入一到两次加密密钥。 如果文本文件不再存在,只需要输入加密密钥一次来解密交换文件。 如果文本文件存在,其加密方式可能与交换文件不同。你需要输入加密密钥两次: Need encryption key for "/tmp/tt" ~ Enter encryption key: ****** ~ "/tmp/tt" [crypted] 23200L, 522129C ~ Using swap file "/tmp/.tt.swp" ~ Original file "/tmp/tt" ~ Swap file is encrypted: "/tmp/.tt.swp" ~ If you entered a new crypt key but did not write the text file, ~ enter the new crypt key. ~ If you wrote the text file after changing the crypt key press enter ~ to use the same key for text file and swap file ~ Enter encryption key: ~ 有两种可能的情况: 1. 加密密钥没有改变,或者在改变后才写入文本文件。你需要输入加密密钥两次。第二 次,按回车即可。这样就会应用相同的密钥来解密文本文件和交换文件。 2. 输入了新加密密钥,但之后没有保存文本文件。Vim 会使用新密钥来加密交换文件, 但文本文件仍然会使用旧密钥来加密。第二次提示时要输入新密钥。 注意 恢复后,交换文件的密钥会用于文本文件。写入文本文件时,需要使用新密钥。