recover

recover.txt 适用于 Vim 9.0 版本。 最近更新: 2020年9月 VIM 参考手册 by Bram Moolenaar 译者: iCrazy<icrazy@ustc.edu>、tocer 从崩溃中恢复 crash-recovery 您经历过这样的事情么?您录入一个文档,录入了很长时间,眼看就要完成的时候,灾难 来了: 您的电脑崩溃了! 别 担 心 ! 您可以从 Vim 提供的文件里恢复大部分的改动,Vim 用这些文件保存文件的内容。一般 情况下,用单个命令就可以恢复您的文档: vim -r filename 1. 交换文件 swap-file 2. 恢复 recovery

1. 交换文件 swap-file

Vim 把您对文件的改动保存在一个交换文件中。多数情况下,用修改前的原文件加上 Vim 的交换文件,您就可以恢复对文档所做的改动了。 您可以用以下的命令看到当前正在使用的交换文件的文件名: :sw[apname] :sw :swapname 也可使用 swapname() 函数,也可以看到其它缓冲区的交换文件名。 正常情况下,交换文件的文件名和您正在编辑的文件相同,只是扩展名换成了 ".swp"。 - 在 Unix 系统上,交换文件名以 '.' 开始,这样它们就不会在列目录文件时被显示出 来。 - 在 MS-Windows 系统上,如果 '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 (针对 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-Windows、Amiga) 上,交换文件根本不会被写到磁盘上。 如果不希望把修改写到交换文件中,可以通过把 'updatecount' 选项设成 0 来避免这一 点,用 "-n" 选项启动 Vim 时也可以达到相同的效果。而把 'updatecount' 选项设成非 0 值可以恢复对交换文件的写入。这种情况下,所有缓冲区的交换文件都会被建立。但是 当把 'updatecount' 选项设成 0 时,已经存在的交换文件不会被删除,只有设置之后打 开的文件才受到影响。 如果您想确定您对文件所作的修改已经被写到交换文件中了,使用这个命令: :pre :preserve E313 E314 :pre[serve] 把当前缓冲区中的所有文本写入交换文件。这样在文件恢 复时就不再需要原文件了。本命令设置了当前缓冲区的一个标 志位。如果 'cpoptions' 里有 '&' 标志位而且 Vim 退出时 如果此缓冲区还处于载入状态,不删除此缓冲区的交换文件 cpo-& 。 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" 文件已经存在的警 告信息。 加 密 和 交 换 文 件 :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 会使用新密钥来加密交换文件, 但文本文件仍然会使用旧密钥来加密。第二次提示时要输入新密钥。 注意 恢复后,交换文件的密钥会用于文本文件。写入文本文件时,需要使用新密钥。 vim:tw=78:ts=8:noet:ft=help:norl: