Usr_11

Nvim 的 :help 页面,生成 使用 tree-sitter-vimdoc 解析器。


VIM 用户手册 - 作者 Bram Moolenaar
从崩溃中恢复
您的计算机崩溃了吗?您刚刚花了好几个小时编辑?不要惊慌!Vim 存储了足够的信息来恢复大部分工作。本章将向您展示如何恢复工作,并解释如何使用交换文件。
11.1 基本恢复 11.2 交换文件在哪里? 11.3 崩溃与否? 11.4 进一步阅读
下一章:usr_12.txt 巧妙技巧 前一章:usr_10.txt 进行大改动 目录:usr_toc.txt

基本恢复

在大多数情况下,恢复文件非常简单,假设您知道正在编辑哪个文件(并且硬盘仍在工作)。在该文件上启动 Vim,添加“-r”参数
vim -r help.txt
Vim 将读取交换文件(用于存储您正在编辑的文本)并可能读取原始文件的片段。如果 Vim 恢复了您的更改,您将看到这些消息(当然,文件名不同)
使用交换文件 ".help.txt.swp"
原始文件 "~/vim/runtime/doc/help.txt"
恢复完成。您应该检查一切是否正常。
(您可能想以其他名称写入此文件
并使用 diff 与原始文件运行比较以检查更改)
您现在可能希望删除 .swp 文件。
为了安全起见,请以其他名称写入此文件
:write help.txt.recovered
将文件与原始文件进行比较以检查您是否获得了预期结果。Diff 模式对于此非常有用 08.7。例如
:write help.txt.recovered
:edit #
:diffsp help.txt
注意原始文件包含更新版本(您在计算机崩溃之前保存了文件)。并检查是否没有丢失任何行(出现 Vim 无法恢复的错误)。如果 Vim 在恢复时产生警告消息,请仔细阅读它们。但这很少见。
如果恢复结果与文件内容完全相同,您将收到此消息
使用交换文件 ".help.txt.swp"
原始文件 "~/vim/runtime/doc/help.txt"
恢复完成。缓冲区内容等于文件内容。
您现在可能希望删除 .swp 文件。
这通常发生在您已经恢复更改或在进行更改后写入文件时。现在可以安全地删除交换文件。
最后几次更改无法恢复是正常的。当您大约四秒钟没有输入或输入约 200 个字符后,Vim 会将更改刷新到磁盘。这是由 'updatetime''updatecount' 选项设置的。因此,当 Vim 在系统崩溃时没有机会保存自己时,最后一次刷新后的更改将丢失。
如果您在没有文件名的情况下进行编辑,请给出一个空字符串作为参数
vim -r ""
您必须在正确的目录中,否则 Vim 无法找到交换文件。

11.2 交换文件在哪里?

Vim 可以将交换文件存储在多个位置。要找到它,请更改到文件的目录,并使用
vim -r
Vim 将列出它能找到的交换文件。它还将在当前目录中文件的交换文件可能位于的其他目录中查找。但它不会在任何其他目录中查找交换文件,它不会搜索目录树。输出可能如下所示
找到的交换文件
在当前目录中
1. .main.c.swp
所有者:mool 日期:2001 年 5 月 29 日 21:00:25
文件名:~mool/vim/vim6/src/main.c
已修改:是
用户名:mool 主机名:masaka.moolenaar.net
进程 ID:12525
在目录 ~/tmp 中
-- 无 --
在目录 /var/tmp 中
-- 无 --
在目录 /tmp 中
-- 无 --
如果有多个交换文件看起来像是您要使用的文件,则会列出这些交换文件,并要求您输入要使用的文件的编号。仔细查看日期以确定要使用哪个文件。如果您不知道要使用哪个文件,只需逐个尝试,并检查结果文件是否符合您的预期。
使用特定的交换文件
如果您知道要使用哪个交换文件,您可以通过提供交换文件名来恢复。然后,Vim 将从交换文件中找出原始文件的文件名。
示例
vim -r .help.txt.swo
这也方便了交换文件位于与预期不同的目录中的情况。Vim 识别具有模式 .s[uvw][a-z] 的文件作为交换文件。
如果这仍然不起作用,请查看 Vim 报告的文件名,并相应地重命名文件。检查 'directory' 选项以查看 Vim 可能将交换文件放在哪里。
注意:Vim 会尝试通过搜索 'dir' 选项中的目录来查找交换文件,查找与 "filename.sw?" 匹配的文件。如果通配符扩展不起作用(例如,当 'shell' 选项无效时),Vim 会拼命尝试找到文件 "filename.swp"。如果这也失败,您将必须提供交换文件本身的名称才能恢复文件。

11.3 崩溃与否? 注意 E325

Vim 会尽力保护您免受愚蠢的操作。假设您天真地开始编辑一个文件,希望文件内容出现。相反,Vim 生成了一个很长的消息
E325:注意
找到名为 ".main.c.swp" 的交换文件
所有者:mool 日期:2001 年 5 月 29 日 21:09:28
文件名:~mool/vim/vim6/src/main.c
已修改:否
用户名:mool 主机名:masaka.moolenaar.net
进程 ID:12559(仍在运行)
打开文件 "main.c" 时
日期:2001 年 5 月 29 日 19:46:12
~
(1)另一个程序可能正在编辑同一个文件。
如果是这种情况,请小心,不要在进行更改时最终得到同一个文件的两个
不同的实例。
退出,或继续操作,但要小心。
~
(2)此文件的编辑会话崩溃了。
如果是这种情况,请使用 ":recover" 或 "vim -r main.c"
恢复更改(见 ":help recovery")。
如果您已经完成了此操作,请删除交换文件 ".main.c.swp"
以避免此消息。
您收到此消息是因为,在开始编辑文件时,Vim 会检查该文件是否存在交换文件。如果存在,则可能存在问题。它可能是以下两种情况之一。
1. 另一个编辑会话在此文件上处于活动状态。在消息中查找包含“进程 ID”的行。它可能看起来像这样
进程 ID:12559(仍在运行)
文本 "(仍在运行)" 表示编辑此文件的进程在同一台计算机上运行。在非 Unix 系统上工作时,您将不会获得此额外的提示。在网络上编辑文件时,您可能看不到提示,因为进程可能在另一台计算机上运行。在这两种情况下,您必须自己找出情况是什么。如果另一个 Vim 正在编辑同一个文件,继续编辑将导致同一个文件的两个版本。最后写入的那个将覆盖另一个,导致更改丢失。您最好退出此 Vim。
2. 交换文件可能是 Vim 或计算机之前崩溃的结果。检查消息中提到的日期。如果交换文件的日期比您正在编辑的文件的日期更新,并且出现以下行
已修改:是
那么您很有可能有一个值得恢复的崩溃的编辑会话。如果文件的日期比交换文件的日期更新,则要么是在崩溃后更改了文件(也许您之前已经恢复了它,但没有删除交换文件?),要么是在崩溃之前但最后一次写入交换文件之后保存了文件(那么您很幸运:您甚至不需要那个旧的交换文件)。Vim 会用以下额外的行警告您
比交换文件更新!
请注意,在以下情况下,Vim 知道交换文件没有用,会自动删除它
该文件是一个有效的交换文件(魔数正确)。
文件被修改的标志未设置。
进程没有运行。
您可以使用 FileChangedShell 自动命令事件以编程方式处理这种情况。
不可读的交换文件
有时会出现以下行
[无法读取]
将出现在交换文件名下。这可能是好是坏,具体取决于情况。
如果之前的编辑会话在未对文件进行任何更改的情况下崩溃,这是好事。然后,交换文件的目录列表将显示它有零个字节。您可以删除它并继续。
如果您对交换文件没有读取权限,这有点不好。您可能希望以只读方式查看文件,或退出。在多用户系统上,如果您自己以不同的登录名进行了最后更改,则注销后以其他登录名登录可能会解决“读取错误”。或者您可能想找出谁最后编辑了(或正在编辑)该文件,并与他们谈谈。
如果这意味着包含交换文件的磁盘上存在物理读取错误,则非常不好。幸运的是,这种情况几乎不会发生。您可能想先以只读方式查看文件(如果可以),以查看“遗忘”的更改的范围。如果您是该文件的负责人,请准备好重新执行最后更改。
该怎么做? swap-exists-choices
如果支持对话框,您将被要求选择六个选项之一
交换文件 ".main.c.swp" 已经存在!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort, (D)elete it
O 以只读方式打开文件。如果您只是想查看文件而不必恢复它,请使用此选项。如果您知道其他人正在编辑该文件,但您只是想查看它而不进行更改,您可能希望使用此选项。
E 无论如何编辑文件。谨慎使用此选项!如果该文件在另一个 Vim 中被编辑,您最终可能会得到两个版本的该文件。Vim 会尝试在发生这种情况时警告您,但小心驶得万年船。
R 从交换文件中恢复文件。如果您知道交换文件包含要恢复的更改,请使用此选项。
Q 退出。这将避免开始编辑文件。如果另一个 Vim 正在编辑同一个文件,请使用此选项。当您刚启动 Vim 时,这将退出 Vim。在多个窗口中启动 Vim 时,如果第一个窗口有交换文件,则 Vim 仅退出。使用编辑命令时,该文件将不会被加载,您将返回到之前编辑的文件。
A 中断。与 Quit 类似,但还会中断进一步的命令。当加载编辑多个文件的脚本时,这很有用,例如包含多个窗口的会话。
D 删除交换文件。如果您确定不再需要它,请使用此选项。例如,当它不包含更改或当文件本身比交换文件更新时。在 Unix 上,此选项仅在创建交换文件的进程似乎没有运行时提供。
如果您没有得到对话框(您正在运行不支持它的 Vim 版本),您将不得不手动进行。要恢复文件,请使用以下命令
:recover
Vim 并不总是能检测到一个文件是否已经存在交换文件。 当另一个编辑会话将交换文件放在另一个目录中,或者当在不同的机器上编辑文件时,文件的路径名称不同时,就会出现这种情况。 因此,不要依赖 Vim 始终提醒你。
如果你真的不想看到这条消息,你可以将 'A' 标志添加到 'shortmess' 选项中。 但这种情况非常罕见。
要以编程方式访问交换文件,请参阅 swapinfo()

11.4 进一步阅读

swap-file 关于交换文件将在哪里创建以及它的名称是什么的说明。 :preserve 手动将交换文件刷新到磁盘。 :swapname 查看当前文件的交换文件的名称。 'updatecount' 刷新交换文件到磁盘的按键次数。 'updatetime' 刷新交换文件到磁盘的时间间隔。 'directory' 用于存储交换文件的目录名称列表。
下一章: usr_12.txt 巧妙的技巧
版权:参见 manual-copyright vim:tw=78:ts=8:noet:ft=help:norl
命令索引
快速参考