usr_11

usr_11.txt 适用于 Vim 9.2 版本。 最近更新: 2025年6月 VIM 用户手册 by Bram Moolenaar 译者: Nek_in 从崩溃中恢复 你的计算机崩溃过吗?是不是还正好在你编辑了几个小时以后?不要惊慌!Vim 已经保存 了大部分的信息使你可以恢复你的大多数数据。本章告诉你怎样恢复这些数据并向你介绍 Vim 是如何处理交换文件的。 11.1 基本恢复 11.2 交换文件在哪 11.3 是不是崩溃了? 11.4 深入阅读 下一章: usr_12.txt 实用技巧 前一章: usr_10.txt 大规模文本修改 目录: usr_toc.txt

11.1 基本恢复

在大多数情况下,恢复一个文件相当简单。假设你知道正在编辑的是哪个文件 (并且硬盘 没坏的话)。可以用 "-r" 选项启动 Vim: vim -r help.txt Vim 会读取交换文件 (用于保存你的编辑数据的文件) 并且提取原文的编辑碎片。如果 Vim 恢复了你的改变,你会看到如下文字 (当然了,文件名会不一样): 使用交换文件 ".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 显示出一些警告信息,注意小心阅读。这应该是很少见 的。 如果恢复产生的文件和文件内容完全一致,你会看到以下消息: 使用交换文件 ".help.txt.swp" 原始文件 "~/vim/runtime/doc/help.txt" 恢复已完成。缓冲区内容与文件内容一致。 你现在可以删除 .swp 文件了。 通常这是因为你已经恢复过改变,或者修改后写入了文件。此时删除交换文件应该安全。 最后所做的一些修改不能恢复是正常的。Vim 在你停止大约 4 秒不输入的时候或者输入 大约两百个字符以后才会更新交换文件。这间可以通过 'updatetime''updatecount' 两个选项来调整。这样,如果系统崩溃前 Vim 没有更新交换文件,最后一次更新后编辑 的内容就会丢失。 如果你编辑的时候没有给定文件名,可以用一个空的字符串来表示文件名: vim -r "" 你需要进入原来的目录执行这个命令,否则 Vim 是找不到这个交换文件的。

11.2 交换文件在哪

Vim 可以把交换文件保存在几个不同的地方。通常是原文件所在的目录。要知道这一点, 进入该目录,然后输入: vim -r Vim 会列出所有它能找到的交换文件。它还会从其它目录寻找本目录文件的交换文件,但 它不会寻找其它目录里的交换文件,更不会遍及整个目录树。 这个命令的输出如下: 找到交换文件: 位于当前目录: 1. .main.c.swp 所有者: mool 日期: Tue May 29 21:00:25 2001 文件名: ~mool/vim/vim6/src/main.c 修改过: 是 用户名: mool 主机名: masaka.moolenaar.net 进程 ID: 12525 位于目录 ~/tmp: -- 无 -- 位于目录 /var/tmp: -- 无 -- 位于目录 /tmp: -- 无 -- 如果有几个交换文件,其中一个可能是你要的,Vim 会给出一个文件列表,你需要输入一 个表示这个文件的数字。小心检查那几个文件的时间,并确定哪一个才是你需要的。 万一你不知道是哪个的话,一个一个试一试。 使 用 指 定 的 交 换 文 件 如果你知道要用哪个文件,你可以指定交换文件的名字。Vim 会找出交换文件所对应的原 始文件的名字。 例如: Vim -r .help.txt.swo 这个方法在交换文件在一个非预期的目录中时很有用。Vim 知道 "*.s[uvw][a-z]" 模式 的文件是交换文件。 如果这还不行,看看 Vim 报告的文件名是什么,然后根据需要给文件换名。根据 'directory' 选项的值你可以知道 Vim 会把交换文件放到什么地方。 备注: Vim 在 'dir' 选项指定的目录中寻找名为 "filename.sw?" 的交换文件。如果 通配符不能正常工作 (例如 'shell' 选项不正确),Vim 转而尝试文件 "filename.swp"。如果仍失败,你就只能通过给定交换文件的名称来恢复原来的 文件了。

11.3 是不是崩溃了? ATTENTION E325

Vim 尽可能保护你不要做傻事。有时你打开一个文件,天真地以为文件的内容会显示出 来。可是,Vim 却给出一段很长的信息: E325: 注意 发现交换文件 ".main.c.swp" 所有者: mool 日期: Tue May 29 21:09:28 2001 文件名: ~mool/vim/vim6/src/main.c 修改过: 否 用户名: mool 主机名: masaka.moolenaar.net 进程 ID: 12559 (还!在!运!行!) 正在打开文件 "main.c" 日期: Tue May 29 19:46:12 2001 (1) 另一个程序可能也在编辑同一个文件。 如果是这样,修改时请注意避免同一个文件产生两个不同的版本。 退出,或小心地继续。 (2) 上次编辑此文件时崩溃。 如果是这样,请用 ":recover" 或 "vim -r main.c" 恢复修改的内容 (请见 ":help recovery")。 如果你已经进行了恢复,请删除交换文件 ".main.c.swp" 以避免再看到此消息。 你遇到这个信息是因为 Vim 发现你编辑的文件的交换文件已经存在。这一定是有什么地 方出问题了。可能的原因有两个: 1. 这个文件正在被另一个进程编辑。注意有 "process ID" 那行。它看起来是这样的: 进程 ID: 12559 (还!在!运!行!) "still running" 表示同一台计算机上有一个进程正在编辑这个文件。在非 Unix 的 系统上你不会得到这个信息。而如果你通过网络编辑这个文件,可能也得不到这个信 息,因为那个进程不在你的机器上。在这两种情况下,你要自己找到原因。 如果另一个 Vim 正在编辑这个文件,继续编辑会导致同一个文件有两个版本。最 后存盘的文件会覆盖前一个版本。这样的结果是一些编辑数据丢失了。这种情况下, 你最好退出这个 Vim。 2. 交换文件可能是由于前一次 Vim 或者计算机崩溃导致的。检查提示信息中的日期。如 果交换文件比你正在编辑的文件新,而且出现这个信息: 修改过: 是 这就表明你很可能需要恢复了。 如果文件的日期比交换文件新,可能是在崩溃后被修改过了 (也许你已经恢复 过,只是没有删除交换文件?),也可能文件在崩溃前保存过,但这发生在最后一次写 入该交换文件之后 (那你运气了,你根本不需要这个旧的交换文件)。Vim 会用如下语 句提醒你: 比交换文件新! 备注 在下面情形下,Vim 知道交换文件没有用了,会自动删除它: - 文件是合法的交换文件 (魔术数正确)。 - 文件修改过的标志位未置位。 - 进程不在运行。 可以用 FileChangedShell 自动命令事件来编程处理这种情况。 无 法 读 取 的 交 换 文 件 有时下面这样的信息 [无法读取] 会出现在交换文件的文件名之下。这可好可坏,依情况而定。 如果上次编辑在作出任何修改前就崩溃了的话,是好事。这样交换文件的长度为 0。你只 要删除之然后继续即可。 如果情况是你对交换文件没有读权限,就比较糟糕。你可能得以只读方式浏览该文件。或 者退出。在多用户系统中,如果你以别人的身份登录并做了上一次修改,先退出登录然后 以那个身份重新登录可能会 "治愈" 该读取错误。不然的话,你得找出是谁做的上一次修 改 (或正在修改),然后和那个人聊聊。 如果情况是交换文件所在的磁盘物理性地损坏了,就非常糟糕了。幸运的是,这种情况几 乎不会发生。 你可能需要以只读方式查看文件 (如果允许的话),看看到底有多少改动被 "忘记" 了。 如果你是改动文件的那个人,准备好重做你的改动。 怎 么 办 ? swap-exists-choices 如果 Vim 版本支持对话框,你可以从对话框的六个选择中挑一个: 交换文件 ".main.c.swp" 已存在! 以只读方式打开(O),直接编辑(E),恢复(R),删除交换文件(D),退出(Q),中止(A): O 用只读方式打开文件。当你只是想看看文件的内容,而不打算恢复它的时候用这个选 项。你可能知道有人在编辑它,但你想看看它的内容,而不会修改它。 E 直接编辑。小心使用这个选择!如果这个文件已经被另一个文件打开,你编辑它会导 致它有两个版本。Vim 已经警告过你了,安全比事后说对不起要好。 R 从交换文件中恢复文件。如果你知道交换文件中有新的东西,而你想恢复它,选择这 一项。 Q 退出。不再编辑该文件。在有另一个 Vim 编辑该文件的时候选这一项。 如果你刚打开 Vim,这会退出 Vim。当你用多个窗口打开几个文件,Vim 只会在 第一个文件遇到交换文件的时候退出。如果你是通过编辑命令打开文件,该文件不会 被载入,Vim 会回到原来的文件中。 A 中止。类似 (Q) 退出,但同时中止更多的命令。这在试图加载一个编辑多个文件的脚 本 (例如一个多窗口的会话) 时很有用。 D 删除交换文件。当你能确定你不再需要它的时候选这一项。例如,它不包括修改的数 据,或者你的文件比交换文件新。 在 Unix 系统上,只有建立这个交换文件的进程不再运行,这个选择才会出现。 如果没有出现对话框 (你使用的 Vim 不支持对话框),你只能手工处理。要恢复一个文 件,使用如下命令: :recover Vim 不是总能检测到一个文件有交换文件的。当另一个会话把交换文件放到别的位置或者 在编辑另一台机器的文件的时候,双方使用的交换文件路径不一样都会发生这个问题。所 以,不要老是等 Vim 来提醒你。 如果你确实不想看到这个信息,你可以在 'shortmess' 选项中加上 'A' 标志位。不过一 般你不需要这样做。 关于加密和交换文件关系的注释,见 :recover-crypt 。 要通过程序访问交换文件,见 swapinfo()

11.4 深入阅读

swap-file 解释交换文件在什么地方创建以及名字是什么。 :preserve 手工刷新交换文件 :swapname 查看当前文件的交换文件 'updatecount' 多少个键被敲下后执行一次交换文件刷新 'updatetime' 交换文件刷新后的超时时间 'swapsync' 交换文件刷新后是否执行磁盘同步 'directory' 列出用于保存交换文件的目录 'maxmem' 写入交换文件前的内存使用限制 'maxmemtot' 同上,当用于所有文件

下一章: usr_12.txt 小窍门 版权: 参见 manual-copyright vim:tw=78:ts=8:noet:ft=help:norl: