Username: Password:

VIM从崩溃中恢复
来源: ChinaUnix博客  作者: ChinaUnix博客   发布时间:2007-01-01 19:27:00

*11.1*  基本恢复
在大多数情况下,恢复一个文档相当简单。假设您知道正在编辑的是哪个文档 (并且硬盘
没坏的话)。能够用 "-r" 选项启动 Vim:
        vim -r help.txt
Vim 会读取交换文档 (用于保存您的编辑数据的文档) 并且提取原文的编辑碎片。假如一
切顺利,您会看到如下文字 (当然了,文档名会不相同):
        Using swap file ".help.txt.swp"
        Original file "~/vim/runtime/doc/help.txt"
        Recovery completed. You should check if everything is OK.
        (You might want to write out this file under another name
        and run diff with the original file to check for changes)
        Delete the .swp file afterwards.
        (译者注:中文情况下是:
        使用交换文档 ".help.txt.swp"
        原文档 "~/vim/runtime/doc/help.txt"
        恢复完成。请确定一切正常.
        (您可能想要把这个文档另存为别的文档名,
        再执行 diff 和原文档比较以检查是否有改变)
        然后把 .swp 文档删掉。
        )
为了安全起见,能够用另一个文档名保存这个文档:
        :write help.txt.recovered
能够把这个文档和原文档作一下比较,看看恢复的效果怎样。这方面 Vimdiff 能够帮很
大的忙 (参见 |
08.7
|)。注意用一个比较新的原文档来比较 (您在电脑崩溃前最后保存
过的文档),并且检查有没有东西丢失了 (由于某些问题导致 Vim 无法恢复)。
    假如在恢复的过程中 Vim 显示出一些警告信息,注意小心阅读。这应该是很少见
的。
最后所做的一些修改不能恢复是正常的。Vim 在您停止大约 4 秒不输入的时候或输入
大约两百个字符以后才会更新交换文档。这间能够通过 ’updatetime’ 和 ’updatecount’
两个选项来调整。这样,假如系统崩溃前 Vim 没有更新交换文档,最后一次更新后编辑
的内容就会丢失。
假如您编辑的时候没有给定文档名,能够用一个空的字符串来表示文档名:
        vim -r ""
您需要进入原来的目录执行这个命令,否则 Vim 是很难找到这个交换文档的。
*11.2*  交换文档在哪
Vim 能够把交换文档保存在几个不同的地方。通常是原文档所在的目录。要知道这一点,
进入该目录,然后输入:
        vim -r
Vim 会列出任何他能找到的交换文档。他还会从其他目录寻找本目录文档的交换文档,但
他不会寻找其他目录里的交换文档,更不会遍及整个目录树。
    这个命令的输出如下:
        Swap files found:
           In current directory:
        1.    .main.c.swp
                  owned by: mool   dated: Tue May 29 21:00:25 2001
                 file name: ~mool/vim/vim6/src/main.c
                  modified: YES
                 user name: mool   host name: masaka.moolenaar.net
                process ID: 12525
           In directory ~/tmp:
              -- none --
           In directory /var/tmp:
              -- none --
           In directory /tmp:
              -- none --
        (译者:中文的情形如下:
        找到以下交换文档:
           位于当前目录:
        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 报告的
文档名是什么,然后根据需要给文档换名。根据 ’directory’ 选项的值您能够知道 Vim
会把交换文档放到什么地方。
        备注:
        Vim 在 ’dir’ 选项指定的目录中寻找名为 "filename.sw?" 的交换文档。假如
        通配符不能正常工作 (例如 ’shell’ 选项不正确),Vim 转而尝试文档
        "filename.swp"。假如仍失败,您就只能通过给定交换文档的名称来恢复原来的
        文档了。
*11.3*  是不是崩溃了?                           *ATTENTION*    *E325*
Vim 尽可能保护您不要做傻事。有时您打开一个文档,天真地以为文档的内容会显示出
来。可是,Vim 却给出一段很长的信息:
                E325: ATTENTION
        Found a swap file by the name ".main.c.swp"
                  owned by: mool   dated: Tue May 29 21:09:28 2001
                 file name: ~mool/vim/vim6/src/main.c
                  modified: no
                 user name: mool   host name: masaka.moolenaar.net
                process ID: 12559 (still running)
        While opening file "main.c"
                     dated: Tue May 29 19:46:12 2001

        (1) Another program may be editing the same file.
            If this is the case, be careful not to end up with two
            different instances of the same file when making changes.
            Quit, or continue with caution.

        (2) An edit session for this file crashed.
            If this is the case, use ":recover" or "vim -r main.c"
            to recover the changes (see ":help recovery").
            If you did this already, delete the swap file ".main.c.swp"
            to avoid this message.
        (译者注:翻译成中文如下:
                E325: 注意
         发现交换文档 "main.c.swp"
             任何者:mool     日期:2001年5月29日 星期二 21:09:28
             文档名:~mool/vim/vim6/src/main.c
             修改过:否
             用户名:mool   主机名:masaka.moolenaar.net
             进程号:12559 (仍在运行)
         正在打开文档 "main.c"
               日期:2001年5月29日 星期二 19:46:12
        (1) 另一个程式可能也在编辑同一个文档。
            假如是这种情况,修改时请注意避免同一个文档产生两个不同的版本。
            
            退出,或小心地继续。
        (2) 上次编辑此文档时崩溃。
            假如是这样,请用 ":recover" 或 "vim -r main.c"
            恢复修改的内容 (请见 ":help recovery")。
            假如您已进行了恢复,请删除交换文档 ".main.c.swp"
            以避免再看到此消息。
        )
您碰到这个信息是因为 Vim 发现您编辑的文档的交换文档已存在。这一定是有什么地
方出问题了。可能的原因有两个:
1. 这个文档正在被另一个进程编辑。注意有 "process ID" 那行。他看起来是这样的:
                process ID: 12559 (still running)
    "still running" 表示同一台电脑上有一个进程正在编辑这个文档。在非 Unix 的
    系统上您不会得到这个信息。而假如您通过网络编辑这个文档,可能也得不到这个信
    息,因为那个进程不在您的机器上。在这两种情况下,您要自己找到原因。
       假如另一个 Vim 正在编辑这个文档,继续编辑会导致同一个文档有两个版本。最
    后存盘的文档会覆盖前一个版本。这样的结果是一些编辑数据丢失了。这种情况下,
    您最好退出这个 Vim。
2. 交换文档可能是由于前一次 Vim 或电脑崩溃导致的。检查提示信息中的日期。如
   果交换文档比您正在编辑的文档新,而且出现这个信息:
                modified: YES
   这就表明您很可能需要恢复了。
       假如文档的日期比交换文档新,可能是在崩溃后被修改过了 (也许您已恢复
   过,只是没有删除交换文档?),也可能文档在崩溃前保存过,但这发生在在最后一次
   写入该交换文档之后 (那您运气了,您根本无需这个旧的交换文档)。Vim 会用如下
   语句提醒您:
      NEWER than swap file!
      (译者注:意为 "文档比交换文档新")
无 法 读 取 的 交 换 文 件
有时下面这样的信息
        [cannot be read]
        或 [无法读取] (中文信息,译者)
会出现在交换文档的文档名之下。这可好可坏,依情况而定。
假如上次编辑在作出任何修改前就崩溃了的话,是好事。这样交换文档的长度为 0。您只
要删除之然后继续即可。
假如情况是您对交换文档没有读权限,就比较糟糕。您可能得以只读方式浏览该文档。或
者退出。在多用户系统中,假如您以别人的身份登录并做了上一次修改,先退出登录然后
以那个身份重新登录可能会 "治愈" 该读取错误。不然的话,您得找出是谁做的上一次修
改 (或正在修改),然后和那个人聊聊。
假如情况是交换文档所在的磁盘物理性地损坏了,就很糟糕了。幸运的是,这种情况几
乎不会发生。
您可能需要以只读方式查看文档 (假如允许的话),看看到底有多少改变被 "忘记" 了。
假如您是改变文档的那个人,准备好重做您的改变。
怎 么 办?
假如 Vim 版本支持对话框,您能够从对话框的五个选择中 (译者注: 原文如此) 挑一
个:
  Swap file ".main.c.swp" already exists!
  [O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort, (D)elete it:
  (译者:含义是:
  交换文档 ".main.c.swp" 已存在!
  以只读方式打开([O]),直接编辑((E)),恢复((R)),退出((Q)),中止((A)),删除
交换文档((D)):
  )
O  用只读方式打开文档。当您只是想看看文档的内容,而不打算恢复他的时候用这个选
   项。您可能知道有人在编辑他,但您想看看他的内容,而不会修改他。
E  直接编辑。小心使用这个选择!假如这个文档已被另一个文档打开,您编辑他会导
   致他有两个版本。Vim 已警告过您了,安全比事后说对不起要好。
R  从交换文档中恢复文档。假如您知道交换文档中有新的东西,而您想恢复他,选择这
   一项。
Q  退出。不再编辑该文档。在有另一个 Vim 编辑该文档的时候选这一项。
       假如您刚打开 Vim,这会退出 Vim。当您用多个窗口打开几个文档,Vim 只会在
   第一个文档碰到交换文档的时候退出。假如您是通过编辑命令打开文档,该文档不会
   被载入,Vim 会回到原来的文档中。
A  中止。类似 (Q) 退出,但同时中止更多的命令。这在试图加载一个编辑多个文档的脚
   本 (例如一个多窗口的会话) 时很有用。
D  删除交换文档。当您能确定您不再需要他的时候选这一项。例如,他不包括修改的数
   据,或您的文档比交换文档新。
       在 Unix 系统上,只有建立这个交换文档的进程不再运行,这个选择才会出现。
假如没有出现对话框 (您使用的 Vim 不支持对话框),您只能手工处理。要恢复一个文
件,使用如下命令:
        :recover
Vim 不是总能检测到一个文档有交换文档的。当另一个会话把交换文档放到别的位置或
在编辑另一台机器的文档的时候,双方使用的交换文档路径不相同都会发生这个问题。所
以,不要老是等 Vim 来提醒您。
假如您确实不想看到这个信息,您能够在 ’shortmess’ 选项中加上 ’A’ 标志位。但是一
般您无需这样做。


本文来自ChinaUnix博客,假如查看原文请点:http://blog.chinaunix.net/u1/49923/showart_393552.html

喜欢本文,那就收藏到:

    Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪ViVi 365Key网摘 天极网摘 和讯网摘 博拉网 POCO网摘 添加到饭否 QQ书签 Digbuzz我挖网
相关评论  我也要评论
还没有关于此文章的相关评论!
  • 昵称: (为空则显示guest)
  • 评论分数: ★ ★ ★★★ ★★★★ ★★★★★
  • 评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
  • 导航
    赞助商
    文章类别
    订阅