VIM从入门到精通(恢复文件)

来源:互联网 发布:ubuntu卸载软件 编辑:程序博客网 时间:2024/06/06 16:28

现在开始我就要将一些vim的该机一点的技巧,这第一篇我就讲如何恢复文件。你的电脑死过机吗? 就在你辛辛苦苦编辑了几小时后? 别急! Vim已在磁盘上保留了充足的信息来恢复你的大部分工作. 本文将讲解Vim是如何利用交换文件来恢复你的劳动成果的.

 

主要分为以下内容

一、基本恢复方法

二、如何使用交换文件

三、什么时候应该恢复文件

 

多数情况下恢复文件是简单的, 如果你知道要恢复的文件名(当然也要保证你的硬盘还会转), 就可以在启动Vim时指定一个”-r”参数:

vim -r help.txt

Vim会读取交换文件(这正是存放你已编辑的文件的地方)以及你的原文件的一些信息. 一切正常的话, 你会看到下面的信息(当然文件名会不同):

 

通常最后的少量改动无法恢复. Vim会在你连续4秒不键入内容时跟磁盘同步一次, 或者是连续键入了200个字符之后. 这可以通过 “updatetime” 和 “updatecount” 两个选项来控制. 所以如果系统有所改动但Vim还没有同步时发生了宕机,那这一部分内容就无法恢复了.如果你在编辑一个没有指定文件名的缓冲区时死机了, 可以通过一个空字符串作为要恢复的”文件名”: vim -r “” ,确保你所在的目录是正确的, 否则Vim会找不到正确的交换文件.

 

Vim可以在几个地方存放交换文件. 通常它跟原文件同一个目录. 要找到交换文件, 可以先切换到某个目录然后用下面的命令: vim -r

Vim会列出所有找到交换文件. 它也会查看其它用来存放交换文件的目录来找到当前目录下的文件的交换文件. 除此之外的其它目录就不会被搜索了, 同时也不会遍历当前的目录树.如果有好几个交换文件看起来都差不多, Vim会以全部列出这些交换文件, 请你从中选择一个来进行恢复. 此时要小心这些交换文件的日期信息.如果你实在难以决断到底用哪个交换文件, 那就一个一个试看看哪一个恢复后的内容正是你想要的.

 

如果你能确切知道要用的交换文件名, 你也可以在恢复时明确指定该文件. Vim会根据交换文件名找出原文件名.例如:

vim -r .help.txt.swo

这同样适用于交换文件位于另一个非常规的目录中的情况. 如果这还不行, 那就根据Vim报告的文件名把它改名. 查看°directory°可以获知Vim在哪些目录下存放交换文件.

 

下面的解释将会有些复杂,不过如果你用过Unix系统(Linux)的话,那么你会更容易理解这是怎么回事。

一般来说,Vim会尽量防止你做错事,. 假设无辜的你正想编辑一个文件, 希望Vim象往常一样显示该文件的内容. 但它却给出了一大堆这样的东西:

这是因为编辑文件之前Vim会检查是否存在该文件的交换文件. 如果有, 那一定是出了状况. 可能是下面的两种情况:

1. 另一个Vim会话正在编辑该文件. 看看上面给出的信息中带有”processID”的那一行. 它可能是这样: “ process ID: 12559 (still running) ”

“(still running)”表明同一台电脑上另一进程正在编辑此文件. 在
非Unix系统上你可不会看到这么多的提示. 如果另一会话是通过网络编
辑该文件, 那你也不会看到这段提示. 因为进程是运行在另一台电脑上.
这两种情况下你要自己想办法找出原因.
如果另一个Vim也在编辑该文件, 你再不顾一切地编辑它的话, 被编
辑的文件就会有两个版本. 最后保存的版本将覆盖前一个的内容, 总会
有人痛失一切. 所以最好还是礼让三先, 退出Vim.

2. 交换文件可能是肇因于上一次的系统崩溃或Vim自己崩溃. 详察一下Vim给出的日期信息. 如果交换文件比你要编辑的文件更新, 而且给出了下面的消息: “ modified: YES ”,此时很可能是某个Vim会话崩溃了, 这还有得救.

如果交换文件的日期比要编辑的文件旧, 那说明要么该文件在崩溃之
后又被更改过. (比如你此前已经恢复过, 但还留着交换文件), 要么文件
的最后存盘时间是崩溃之前, 但却是在交换文件最后存盘时间之后(算幸
运了, 老的交换文件也不再需要了). 这时Vim会警告你说:NEWER than swap file!

 

有时候交换文件下面会出现这样的字样: “ [cannot be read] ~”,这是好是坏? 要视情况而定.如果上一次编辑过程中没有对文件做出任何改变, 那是好事. 这时交换文件的明细情况会显示其长度为0. 你可以简单地删除它.如果是因为你没有该交换文件的读权限就有点不妙. 你可以以只读方式浏览文件, 或者退出. 在多用户系统上, 如果你对文件的最后一次修改时是以另一个账号登入系统的, 退出系统后再以该账号登入就可以去除”read error”. 或者你应该看看是谁最后一次编辑过这个文件(或者还正在编辑)并跟他谈一谈.如果是因为磁盘的物理错误引起的那就非常糟糕了. 幸运的是这种情况很少发生. 你可以先试着以只读方式打开文件(如果可以的话), 看看对文件的修改有多少被丢失了. 如果正是你要对该文件负责, 就准备好重来吧.

那么该怎么办?如果你的VIM支持对话框的话, 它会以下面的形式提示你作出选择:

                    以只读方式打开.
                        如果你只想查看文件内容不想恢复的话就选这个. 或者你知道别人
                        正在编辑该文件, 你不过想看一下它的内容而已

                    还是要编辑.
                        小心! 如果该文件正被另一Vim编辑, 你很可能会得到两个版本.
                        此时Vim会警告你, 但最好还是安全第一, 以和为贵.

R                     从交换文件中恢复.
如果你确信交换文件中的内容正是你要找回的东西就那用这个.

                    退出.
                        这样就免于编辑该文件了. 如果有另一个Vim会话正在编辑最好是
                        选择退让. 如果你是刚刚启动Vim, 这个选择会同时退出Vim. 如
                        果启动时打开了好几个窗口, Vim只有在第一个窗口遇到这种情况时才退出
                        如果是在使用一个编辑命令时选择退出, 该文件就不会被
                        继续载入, 系统回到此前的编辑状态

A                    丢弃.
                       类似于退出, 但它同时会撤消对后续命令的执行, 这在载入一个脚
                       本编辑多个文件时比较有用. 如打开一个多窗口的编辑会话时.

                   删除交换文件.
                      只有确信你已不再需要这个交换文件时才应做此选择. 比如, 交换
                      文件里没有包含任何新的改动, 或原文件比交换文件还新. 在Unix上
                      只有创建新交换文件的进程不再运行时才会给出这一选择.

 

如果你没看到对话框(你运行的是不支持对话框的Vim), 就要手工恢复了. 下面的命令执行恢复: “ :recover ”

Vim并不总是能正确地检测到交换文件的存在. 比如另一编辑该文件的会话将交换文件放入了另一目录或者不同机器对被编辑文件的路径的理解不同. 所以不要什么都指望Vim.