打开具有 .swp 文件的文件时如何消除警告?

Jam*_*mes 49 vim vi

当我打开一个包含 .swp 文件的文件时,如何摆脱烦人的警告?或者,我如何根本不生成 .swp 文件?示例警告:

E325: ATTENTION
Found a swap file by the name ".notes.swp"
          owned by: james   dated: Fri Dec  3 17:38:07 2010
         file name: ~james/school/se/project-dir/rottencucumber/doc/notes
          modified: no
         user name: james   host name: james-laptop
        process ID: 2251 (still running)
While opening file "notes"
             dated: Fri Dec  3 18:46:10 2010
      NEWER than swap file!

(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 notes"
    to recover the changes (see ":help recovery").
    If you did this already, delete the swap file ".notes.swp"
    to avoid this message.

Swap file ".notes.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort:
Run Code Online (Sandbox Code Playgroud)

use*_*833 50

如果您关心不丢失可能未保存的文本,则此消息实际上非常重要。它应该被认为是令人讨厌的,应该不会使你贸然删除交换文件或配置vim离不开它运行。

任何文件编辑与vim会有相应的交换文件,而你编辑,它vim用来跟踪变化的。当你退出编辑一个文件时,vim会自动丢弃相应的交换文件。因此,交换文件的存在以及您尝试在原始文件之上写入,应该引起考虑并采取适当的行动。

消息 ( E325: ATTENTION Found a swap file) 中出现的两种情况实际上很常见:(1)另一个vim程序正在编辑您要编辑的同一个文件(实际上可能是另一个人 - 在这种情况下,它真的没有意义只是盲目地删除交换文件 - 或者它可能是你在另一个终端窗口或选项卡中),或者(2)之前的vim会话崩溃了(最常见的是当你远程编辑时发生这种情况,并且网络会话被切断 - 其中如果 vim 会话未正常退出,并且.swp文件保留在后面;第二种情况的另一个示例是您不小心关闭了具有活动或后台vim会话的终端窗口或选项卡)。

当我遇到此消息时,我首先考虑我是在另一个终端窗口还是选项卡中编辑此文件,因为我通常使用多个终端窗口操作,每个窗口都有多个选项卡:

在此处输入图片说明

如果我意识到我正在另一个地方进行编辑,并且可以返回到它,然后我按下此附加会话的q(Q)uit,并通过原始vim会话返回编辑。

有时如果我不完全确定,我(Q)uit然后运行jobs以验证我是否vim在完全相同的终端中运行;如果没有出现任何问题,我会运行ps -ef | grep vim以检查我是否在vim其他地方运行(即在另一个终端窗口或选项卡中)。关键是,我总是尝试通过原始vim会话恢复编辑。


如果我确信,我不能回到原来的编辑会议上,我仍然呈现以下选项,然后我按r(R)ecover

Swap file ".notes.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort:
Run Code Online (Sandbox Code Playgroud)

r,您将看到如下消息:

Swap file ".notes.swp" already exists!
"notes" 18L, 46C
Using swap file ".notes.swp"
Original file "/private/tmp/notes"
Recovery completed. Buffer contents equals file contents.
You may want to delete the .swp file now.

Press ENTER or type command to continue
Run Code Online (Sandbox Code Playgroud)

另一方面,如果我不再面临这些选项,因为我在 shell 提示符下,那么我vim使用该-r选项运行,如下所示:

vim -r notes
Run Code Online (Sandbox Code Playgroud)

结果消息将是类似的:

Using swap file ".notes.swp"
Original file "/private/tmp/notes"
Recovery completed. Buffer contents equals file contents.
You may want to delete the .swp file now.

Press ENTER or type command to continue
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,按ENTER继续,您将看到您的文件。

注意:如果 Vim 对其发现的内容有疑问,它会给出错误信息并插入带有“???”的行。在文中。如果您在恢复时看到错误消息,请在文件中搜索“???” 看看有什么问题。您可能需要剪切和粘贴以获得所需的文本。

最常见的评论是“???LINES MISSING”。这意味着 Vim 无法从原始文件中读取文本。如果系统崩溃并且未保存部分原始文件,就会发生这种情况。

也就是说,我从未见过那些???痕迹,所以这一定是非常罕见的情况。


接下来,将内容保存(即写入)到另一个文件(通常我只是在原始文件名的末尾附加“2”):

:w notes2
Run Code Online (Sandbox Code Playgroud)

接下来,强制退出此vim会话:

:q!
Run Code Online (Sandbox Code Playgroud)

接下来,比较两个文件:

diff notes notes2
Run Code Online (Sandbox Code Playgroud)

如果diff返回 nothing,则意味着没有区别,可以安全地删除交换文件和第二个文件:

rm .notes.swp notes2
Run Code Online (Sandbox Code Playgroud)

此时,打开原始文件,就好像从来没有出现过问题一样继续:

vim notes
Run Code Online (Sandbox Code Playgroud)

如果diff返回 something,则意味着原始文件(通过交换文件)进行了更改,由于恢复,这些更改已保存到第二个文件中。

由于这些更改是在第二个文件中捕获的,因此您可以安全地删除交换文件并用第二个文件覆盖原始文件:

rm .notes.swp
remove .notes.swp? y

mv notes2 notes
overwrite notes? (y/n [n]) y
Run Code Online (Sandbox Code Playgroud)

此时,打开原始文件,就好像从来没有出现过问题一样继续:

vim notes
Run Code Online (Sandbox Code Playgroud)

这看起来像是很多工作,但是一旦您习惯了工作流程,最多需要 20 秒。

  • 不敢相信这不是公认的答案。这是完美的。+1 (3认同)

Hep*_*ite 19

粘贴的消息表明您仍然在另一个 Vim 会话中打开了“notes”文件。编辑正在其他地方编辑的文件绝对不是一个好主意。

如果该消息是错误的,您需要确定 Vim 会话如何不正确退出并在将来避免这种情况。

至于恢复,在这种情况下这可能是一个问题,因为“notes”比与之关联的 Vim .swp 文件更新,但您仍然可以尝试。只需确保先将“笔记”文件复制到备份位置即可。

通读“ :help recover.txt”是个好主意。

这里的教训是,您不应该看到此消息,并且您的意思是某处出了问题。这(可能)不是 Vim 的错。

如果此时您仍然坚决不让 Vim 创建 .swp 文件以便您可以从崩溃和其他相关问题中恢复,您可以set noswapfile~/.vimrc.


Bra*_*rks 11

您可以使用 -n 在不使用交换文件的情况下打开 vim

要一直这样做,只要把

alias vim='vim -n' 
Run Code Online (Sandbox Code Playgroud)

在您的 .bashrc 或 .bash_aliases 文件中

如果你需要在没有 -n 选项的情况下运行 vim,只需运行

\vim
Run Code Online (Sandbox Code Playgroud)

  • 我不建议总是在没有交换文件的情况下运行,但“-n”实际上正是我所需要的。我通常使用交换文件。但是,当使用 Vim 作为差异工具时,我希望能够查看我正在编辑的文件的差异,而这些差异不会给我这个消息或干扰我的交换文件。 (3认同)