恢复
Nvim :help
页面,生成 于 源代码,使用 tree-sitter-vimdoc 解析器。
崩溃后的恢复
你已经花了几个小时输入了明天早上必须完成的文本,然后灾难发生了:你的电脑崩溃了。
不要惊慌!
你可以从 Vim 用于存储文件内容的文件中恢复大部分更改。大多数情况下,你可以用一个命令恢复你的工作:vim -r filename
Vim 将你所做的更改存储在一个交换文件中。使用你开始使用的原始文件加上交换文件,你就可以大部分恢复你的工作。
你可以使用以下命令查看当前使用的交换文件的名称
交换文件的名称通常与你正在编辑的文件相同,只是扩展名为 ".swp"。
在 Unix 上,在与编辑文件相同的目录中,交换文件名之前会加上一个 "."。这样可以避免交换文件出现在目录列表中。
如果此文件已存在(例如,当你从崩溃中恢复时),则会发出警告并使用另一个扩展名,".swo"、".swn" 等。
现有文件永远不会被覆盖。
一旦 Vim 停止编辑文件,交换文件就会被删除。
E326 技术说明:如果 ".swp" 文件名已存在,则最后一个字符会递减,直到没有该名称的文件或 ".saa" 被达到。在最后一种情况下,不会创建交换文件。
通过设置
'directory' 选项,你可以将交换文件放在与编辑文件不同的位置。优势
你将不会用 ".swp" 文件污染目录。
你可能会从具有相同名称但在不同目录中的文件中获得名称冲突(尽管 Vim 会尝试通过比较路径名来避免这种情况)。这会导致错误的 ATTENTION 警告消息。
当使用你的主目录时,如果其他人尝试编辑同一个文件,该用户将看不到你的交换文件,也不会收到 ATTENTION 警告消息。
如果你想将交换文件放在一个固定位置,请在你的 vimrc 中添加类似以下命令::set dir=~/tmp(对于 Unix):set dir=c:\\tmp(对于 Win32)这在编辑软盘上的文件时也很方便。当然,你必须为此创建一个 "tmp" 目录才能使其正常工作!
对于只读文件,不会立即使用交换文件。交换文件只有在进行更改时才会被创建。
在输入 200 个字符或在 4 秒内没有输入任何内容后,交换文件就会被更新。这只有在缓冲区被更改时才会发生,而不会在仅移动时发生。之所以没有一直保持更新,是因为这样会大大降低正常工作速度。你可以使用
'updatecount' 选项更改 200 个字符的计数。你可以使用
'updatetime' 选项设置时间。时间以毫秒为单位。在写入交换文件后,Vim 会将文件同步到磁盘。
如果你想确保你的更改已包含在交换文件中,请使用以下命令
Vim 交换文件可以通过前六个字符识别:"b0VIM "。之后是版本号,例如 "3.0"。
在 Unix 上,同一个文件可以使用两个名称。这可以通过硬链接和符号链接(软链接)来实现。
对于硬链接,Vim 不会知道文件的另一个名称。因此,交换文件的名称将基于你用来编辑文件的名称。不会检查是否使用另一个名称编辑了同一个文件,因为 Vim 找不到另一个交换文件(除非搜索整个硬盘,这会非常慢)。
对于符号链接,Vim 会解析链接以找到实际文件的名称。交换文件的名称基于该名称。因此,无论你使用什么名称编辑文件,交换文件的名称通常都是相同的。但是,也有一些例外情况
当实际文件的目录不可写时,交换文件将被放在其他位置。
当符号链接以某种方式创建循环时,你会收到一条
E773 错误消息,并且将使用未修改的文件名。你将无法正常保存文件。
另一种恢复方法是启动 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" 文件已存在的警告消息。