恢复

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


崩溃后的恢复
你已经花了几个小时输入了明天早上必须完成的文本,然后灾难发生了:你的电脑崩溃了。
不要惊慌!
你可以从 Vim 用于存储文件内容的文件中恢复大部分更改。大多数情况下,你可以用一个命令恢复你的工作:vim -r filename

1. 交换文件 swap-file

Vim 将你所做的更改存储在一个交换文件中。使用你开始使用的原始文件加上交换文件,你就可以大部分恢复你的工作。
你可以使用以下命令查看当前使用的交换文件的名称
:sw[apname] :sw :swapname
或者你可以使用 swapname() 函数,它也允许查看其他缓冲区的交换文件名。
交换文件的名称通常与你正在编辑的文件相同,只是扩展名为 ".swp"。
在 Unix 上,在与编辑文件相同的目录中,交换文件名之前会加上一个 "."。这样可以避免交换文件出现在目录列表中。
如果此文件已存在(例如,当你从崩溃中恢复时),则会发出警告并使用另一个扩展名,".swo"、".swn" 等。
现有文件永远不会被覆盖。
一旦 Vim 停止编辑文件,交换文件就会被删除。
E326
技术说明:如果 ".swp" 文件名已存在,则最后一个字符会递减,直到没有该名称的文件或 ".saa" 被达到。在最后一种情况下,不会创建交换文件。
通过设置 'directory' 选项,你可以将交换文件放在与编辑文件不同的位置。优势
你将不会用 ".swp" 文件污染目录。
'directory' 位于另一个分区时,可以降低损坏文件所在文件系统(在崩溃时)的风险。缺点
你可能会从具有相同名称但在不同目录中的文件中获得名称冲突(尽管 Vim 会尝试通过比较路径名来避免这种情况)。这会导致错误的 ATTENTION 警告消息。
当使用你的主目录时,如果其他人尝试编辑同一个文件,该用户将看不到你的交换文件,也不会收到 ATTENTION 警告消息。
如果你想将交换文件放在一个固定位置,请在你的 vimrc 中添加类似以下命令::set dir=~/tmp(对于 Unix):set dir=c:\\tmp(对于 Win32)这在编辑软盘上的文件时也很方便。当然,你必须为此创建一个 "tmp" 目录才能使其正常工作!
对于只读文件,不会立即使用交换文件。交换文件只有在进行更改时才会被创建。
可以重置 'swapfile' 选项以避免创建交换文件。此外,可以使用 :noswapfile 修饰符,以避免为新的缓冲区创建交换文件。
:nos[wapfile] {command} :nos :noswapfile 执行 {command}。如果它包含加载新缓冲区的命令,则该命令将被加载,但不会创建交换文件,并且 'swapfile' 选项将被重置。如果缓冲区已经有交换文件,则不会删除它,并且 'swapfile' 不会被重置。
检测现有交换文件
你可以在用户手册的 11.3 部分找到这一点。
W325
默认的 SwapExists 处理程序 (default-autocmds) 跳过 E325 提示(并自动选择 "(E)dit"),如果交换文件所有者进程仍在运行并且由当前用户拥有。这假定你通常不想因为碰巧从多个 Nvim 实例编辑同一个文件而被 ATTENTION 消息困扰。在最坏的情况下(系统崩溃),同一个文件会存在多个交换文件;使用 :recover 检查所有交换文件。
更新交换文件
在输入 200 个字符或在 4 秒内没有输入任何内容后,交换文件就会被更新。这只有在缓冲区被更改时才会发生,而不会在仅移动时发生。之所以没有一直保持更新,是因为这样会大大降低正常工作速度。你可以使用 'updatecount' 选项更改 200 个字符的计数。你可以使用 'updatetime' 选项设置时间。时间以毫秒为单位。在写入交换文件后,Vim 会将文件同步到磁盘。
如果不想将更改写入交换文件,可以通过将 'updatecount' 选项设置为 0 来关闭写入。在使用 "-n" 选项启动 Vim 时也会执行相同的操作。可以通过将 'updatecount' 选项设置为非零值来重新打开写入。这将为所有缓冲区创建交换文件。但是,当将 'updatecount' 设置为零时,不会删除现有的交换文件,它只会影响此后打开的文件。
如果你想确保你的更改已包含在交换文件中,请使用以下命令
:pre :preserve E313 E314 :pre[serve] 将当前缓冲区的所有文本写入其交换文件。原始文件不再需要用于恢复。
Vim 交换文件可以通过前六个字符识别:"b0VIM "。之后是版本号,例如 "3.0"。
链接和符号链接
在 Unix 上,同一个文件可以使用两个名称。这可以通过硬链接和符号链接(软链接)来实现。
对于硬链接,Vim 不会知道文件的另一个名称。因此,交换文件的名称将基于你用来编辑文件的名称。不会检查是否使用另一个名称编辑了同一个文件,因为 Vim 找不到另一个交换文件(除非搜索整个硬盘,这会非常慢)。
对于符号链接,Vim 会解析链接以找到实际文件的名称。交换文件的名称基于该名称。因此,无论你使用什么名称编辑文件,交换文件的名称通常都是相同的。但是,也有一些例外情况
当实际文件的目录不可写时,交换文件将被放在其他位置。
当符号链接以某种方式创建循环时,你会收到一条 E773 错误消息,并且将使用未修改的文件名。你将无法正常保存文件。

2. 恢复 recovery E308 E311

基本文件恢复在用户手册中进行了说明:usr_11.txt.
另一种恢复方法是启动 Vim 并使用 ":recover" 命令。当你启动 Vim 编辑文件时,如果收到 "ATTENTION: Found a swap file ..." 消息,这将非常容易。在这种情况下,单个命令 ":recover" 就可以完成工作。你还可以将文件或交换文件的名称提供给 recover 命令::rec :recover E305 E306 E307 :rec[over] [file] 尝试从交换文件中恢复 [file]。如果没有提供 [file],则使用当前缓冲区的文件名。当前缓冲区的内容将丢失。如果缓冲区已被修改,则此命令会失败。
:rec[over]! [file] 与 ":recover" 相似,但任何对当前缓冲区的更改都会丢失。
E312 E309 E310 E1364 Vim 对如何处理以某种方式损坏的交换文件具有一定的智能。如果 Vim 对找到的内容存在疑问,它将发出错误消息并在文本中插入包含 "???" 的行。如果你在恢复时看到错误消息,请在文件中搜索 "???" 以查看问题所在。你可能需要剪切和粘贴才能获得所需的文本。
最常见的提示是 "???LINES MISSING"。这意味着 Vim 无法从原始文件中读取文本。如果系统崩溃并且原始文件的某些部分未写入磁盘,则可能会发生这种情况。
在覆盖原始文件或删除交换文件之前,请确保恢复成功。最好将恢复后的文件写入其他位置,并运行 'diff' 以找出你想要的更改是否包含在恢复后的文件中。或者使用 :DiffOrig.
一旦你确定恢复正常,请删除交换文件。否则,你将继续收到有关 ".swp" 文件已存在的警告消息。
主要
命令索引
快速参考