在大多数情况下,恢复一个文件相当简单。假设你知道正在编辑的是哪个文件 (并且硬盘
没坏的话)。可以用 "-r" 选项启动 Vim:
vim -r help.txt
Vim 会读取交换文件 (用于保存你的编辑数据的文件) 并且提取原文的编辑碎片。如果
Vim 恢复了你的改变,你会看到如下文字 (当然了,文件名会不一样):
Using swap file ".help.txt.swp" Original file "~/vim/runtime/doc/help.txt" Recovery completed. You should check if everything is OK. (You might want to write out this file under another name and run diff with the original file to check for changes) You may want to delete the .swp file now.
(译者注: 中文情况下是:
使用交换文件 ".help.txt.swp" 原文件 "~/vim/runtime/doc/help.txt" 恢复完成。请确定一切正常。 (你可能想要把这个文件另存为别的文件名, 再执行 diff 与原文件比较以检查是否有改变) 现在可以删除 .swp 文件。
)
为了安全起见,可以用另一个文件名保存这个文件:
:write help.txt.recovered
可以把这个文件与原文件作一下比较,看看恢复的效果如何。这方面 Vimdiff 可以帮很
大的忙 (参见 |08.7|)。例如:
:write help.txt.recovered :edit # :diffsp help.txt注意用一个比较新的原文件来比较 (你在计算机崩溃前最后保存过的文件),并且检查有
没有东西丢失了 (由于某些问题导致 Vim 无法恢复)。
如果在恢复的过程中 Vim 显示出一些警告信息,注意小心阅读。这应该是很少见
的。
如果恢复产生的文件和文件内容完全一致,你会看到以下消息:
Using swap file ".help.txt.swp" Original file "~/vim/runtime/doc/help.txt" Recovery completed. Buffer contents equals file contents. You may want to delete the .swp file now.
通常这是因为你已经恢复过改变,或者修改后写入了文件。此时删除交换文件应该安全。
最后所做的一些修改不能恢复是正常的。Vim 在你停止大约 4 秒不输入的时候或者输入
大约两百个字符以后才会更新交换文件。这间可以通过 'updatetime' 和 'updatecount'
两个选项来调整。这样,如果系统崩溃前 Vim 没有更新交换文件,最后一次更新后编辑
的内容就会丢失。
如果你编辑的时候没有给定文件名,可以用一个空的字符串来表示文件名:
vim -r ""
你需要进入原来的目录执行这个命令,否则 Vim 是找不到这个交换文件的。
Vim 尽可能保护你不要做傻事。有时你打开一个文件,天真地以为文件的内容会显示出
来。可是,Vim 却给出一段很长的信息:
E325: ATTENTION Found a swap file by the name ".main.c.swp" owned by: mool dated: Tue May 29 21:09:28 2001 file name: ~mool/vim/vim6/src/main.c modified: no user name: mool host name: masaka.moolenaar.net process ID: 12559 (still running) While opening file "main.c" dated: Tue May 29 19:46:12 2001 (1) Another program may be editing the same file. If this is the case, be careful not to end up with two different instances of the same file when making changes. Quit, or continue with caution. (2) An edit session for this file crashed. If this is the case, use ":recover" or "vim -r main.c" to recover the changes (see ":help recovery"). If you did this already, delete the swap file ".main.c.swp" to avoid this message.
(译者注: 翻译成中文如下:
E325: 注意 发现交换文件 "main.c.swp" 所有者: mool 日期: 2001年5月29日 星期二 21:09:28 文件名: ~mool/vim/vim6/src/main.c 修改过: 否 用户名: mool 主机名: masaka.moolenaar.net 进程号: 12559 (仍在运行) 正在打开文件 "main.c" 日期: 2001年5月29日 星期二 19:46:12 (1) 另一个程序可能也在编辑同一个文件。 如果是这种情况,修改时请注意避免同一个文件产生两个不同的版本。 退出,或小心地继续。 (2) 上次编辑此文件时崩溃。 如果是这样,请用 ":recover" 或 "vim -r main.c" 恢复修改的内容 (请见 ":help recovery")。 如果你已经进行了恢复,请删除交换文件 ".main.c.swp" 以避免再看到此消息。
)
你遇到这个信息是因为 Vim 发现你编辑的文件的交换文件已经存在。这一定是有什么地
方出问题了。可能的原因有两个:
1. 这个文件正在被另一个进程编辑。注意有 "process ID" 那行。它看起来是这样的:
process ID: 12559 (still running)
"still running" 表示同一台计算机上有一个进程正在编辑这个文件。在非 Unix 的
系统上你不会得到这个信息。而如果你通过网络编辑这个文件,可能也得不到这个信
息,因为那个进程不在你的机器上。在这两种情况下,你要自己找到原因。
如果另一个 Vim 正在编辑这个文件,继续编辑会导致同一个文件有两个版本。最
后存盘的文件会覆盖前一个版本。这样的结果是一些编辑数据丢失了。这种情况下,
你最好退出这个 Vim。
2. 交换文件可能是由于前一次 Vim 或者计算机崩溃导致的。检查提示信息中的日期。如
果交换文件比你正在编辑的文件新,而且出现这个信息:
modified: YES
这就表明你很可能需要恢复了。
如果文件的日期比交换文件新,可能是在崩溃后被修改过了 (也许你已经恢复
过,只是没有删除交换文件?),也可能文件在崩溃前保存过,但这发生在在最后一次
写入该交换文件之后 (那你运气了,你根本不需要这个旧的交换文件)。Vim 会用如下
语句提醒你:
NEWER than swap file!
(译者注: 意为 "文件比交换文件新")
无 法 读 取 的 交 换 文 件
有时下面这样的信息
[cannot be read] 或 [无法读取] (中文信息,译者)
会出现在交换文件的文件名之下。这可好可坏,依情况而定。
如果上次编辑在作出任何修改前就崩溃了的话,是好事。这样交换文件的长度为 0。你只
要删除之然后继续即可。
如果情况是你对交换文件没有读权限,就比较糟糕。你可能得以只读方式浏览该文件。或
者退出。在多用户系统中,如果你以别人的身份登录并做了上一次修改,先退出登录然后
以那个身份重新登录可能会 "治愈" 该读取错误。不然的话,你得找出是谁做的上一次修
改 (或正在修改),然后和那个人聊聊。
如果情况是交换文件所在的磁盘物理性地损坏了,就非常糟糕了。幸运的是,这种情况几
乎不会发生。
你可能需要以只读方式查看文件 (如果允许的话),看看到底有多少改动被 "忘记" 了。
如果你是改动文件的那个人,准备好重做你的改动。
怎 么 办? *swap-exists-choices*
如果 Vim 版本支持对话框,你可以从对话框的五个选择中 (译者注: 原文如此) 挑一
个:
Swap file ".main.c.swp" already exists! [O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort, (D)elete it:
(译者: 含义是:
交换文件 ".main.c.swp" 已经存在! 以只读方式打开([O]),直接编辑((E)),恢复((R)),退出((Q)),中止((A)),删除 交换文件((D)):
)
O 用只读方式打开文件。当你只是想看看文件的内容,而不打算恢复它的时候用这个选
项。你可能知道有人在编辑它,但你想看看它的内容,而不会修改它。
E 直接编辑。小心使用这个选择!如果这个文件已经被另一个文件打开,你编辑它会导
致它有两个版本。Vim 已经警告过你了,安全比事后说对不起要好。
R 从交换文件中恢复文件。如果你知道交换文件中有新的东西,而你想恢复它,选择这
一项。
Q 退出。不再编辑该文件。在有另一个 Vim 编辑该文件的时候选这一项。
如果你刚打开 Vim,这会退出 Vim。当你用多个窗口打开几个文件,Vim 只会在
第一个文件遇到交换文件的时候退出。如果你是通过编辑命令打开文件,该文件不会
被载入,Vim 会回到原来的文件中。
A 中止。类似 (Q) 退出,但同时中止更多的命令。这在试图加载一个编辑多个文件的脚
本 (例如一个多窗口的会话) 时很有用。
D 删除交换文件。当你能确定你不再需要它的时候选这一项。例如,它不包括修改的数
据,或者你的文件比交换文件新。
在 Unix 系统上,只有建立这个交换文件的进程不再运行,这个选择才会出现。
如果没有出现对话框 (你使用的 Vim 不支持对话框),你只能手工处理。要恢复一个文
件,使用如下命令:
:recover
Vim 不是总能检测到一个文件有交换文件的。当另一个会话把交换文件放到别的位置或者
在编辑另一台机器的文件的时候,双方使用的交换文件路径不一样都会发生这个问题。所
以,不要老是等 Vim 来提醒你。
如果你确实不想看到这个信息,你可以在 'shortmess' 选项中加上 'A' 标志位。不过一
般你不需要这样做。
关于加密和交换文件关系的注释,见 |:recover-crypt|。