打开具有.swp文件的文件时如何摆脱警告?


43

当我打开一个包含.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:

Answers:


41

如果您不想丢失可能未保存的文本,此消息实际上非常重要。它应该被认为是令人讨厌的,应该不会使你贸然删除交换文件或配置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:

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

如果,在另一方面,我不再面对这些选择,因为我在shell提示符下,然后我跑vim-r选项,如下所示:

vim -r notes

结果消息将类似:

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

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

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

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

也就是说,我从未见过这些???标记,所以这一定是非常罕见的


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

:w notes2

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

:q!

接下来,比较两个文件:

diff notes notes2

如果diff没有返回,则表示没有区别,并且删除交换文件和第二个文件是安全的:

rm .notes.swp notes2

此时,打开原始文件并继续,就像从未出现过问题一样:

vim notes

如果diff返回某些内容,则表示原始文件(通过交换文件)发生了更改,由于恢复,已将其保存到第二个文件中。

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

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

mv notes2 notes
overwrite notes? (y/n [n]) y

此时,打开原始文件并继续,就像从未出现过问题一样:

vim notes

这似乎很多工作,但是一旦你习惯了工作流程,最多需要20秒。


2
不敢相信这不是公认的答案。这是完美的。+1
大卫

比接受的答案好得多。希望我们有办法解决这个问题!
迈克尔·达兰特2017年

1
消息有用的情况并非总是如此。如果我正在编辑文件,我会关心自从我开始编辑后文件是否已更改此时我尝试保存它,而不是我是否也在另一个vim窗口中编辑它。对我来说,在两个终端中打开文件是完全没问题的,只要保存到文件中不会交错。当我试图保存时,Vim只需要唠叨我,而不是当我打开它时。
Ken Simon

不幸的是,这并没有回答这个问题,只是说我不应该忽视唠叨屏幕。我的情况是我已经在vim中打开文件(可能是为了编辑),想要同时看到文件的不同部分,并且不希望分割缓冲区因为clang_complete继续调整缓冲区的大小。在这种情况下,我实际上想知道如何在Vim中只读文件并让它忽略交换文件。
Lelanthran

@Lelanthranvim -n file_name
user664833

19

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

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

至于恢复,这可能是这个例子中的问题,因为“notes”比与之关联的Vim .swp文件更新,但你仍然可以尝试。只需确保先将“备注”文件复制到备份位置即可。

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

这里的教训是,你不应该看到这个消息,而且你的意思是某些地方错了。它(可能)不是Vim的错。

如果此时您仍然绝对决定不让Vim创建.swp文件以便您可以从崩溃和其他相关问题中恢复,那么您可以将“ set noswapfile”放入~/.vimrc


1
小心!我几乎把所有的工作都弄丢了VIM。在尝试任何操作之前复制代码。
Squirrl 2015年

我强烈建议读者通过user664833查看答案(这条消息实际上非常重要......)因为我认为它提供了更好的信息和建议这个答案imho
Michael Durrant

11

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

要一直这样做,就这样说吧

alias vim='vim -n' 

在.bashrc或.bash_aliases文件中

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

\vim

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

1
我喜欢这个答案 - 它简短,准确,它回答了实际的问题!
Lelanthran


1

当我打开一个包含.swp文件的文件时,如何摆脱恼人的警告?

使用以下内容中的短信选项~/.vimrc

set shortmess=A

这也是运行POSIX模式时的默认设置。

但是,不要这样做:就像拆下汽车的安全气囊以提高燃油效率一样。从长远来看,你将花费更多的时间来恢复,而不是回答这个问题。


1
假设一个单用户系统,配置并不是那么可怕。我喜欢打开很多终端标签,有时我想编辑一个我已经埋在其他标签中的文件。如果我想做一些很好的快速编辑。如果我发现自己早在其他Vim窗口,美妙之处在于,它会提醒我,然后,在我保存的文件已经改变了,我可以做一个快速的:e,看看发生了什么(包括快速u撤消回什么我曾经在缓冲区里。)我比那些已经打开文件的人更喜欢这件事。
Ken Simon

1

当我的终端意外关闭了与vi open的连接时,这发生在我身上。

谢天谢地,我没有丢失任何变化。

要删除该警告并丢弃交换:

  1. 查找进程的ID在看process ID: 2251 (still running),在这种情况下,它是2251
  2. 确认您拥有正确的IDps 2251
  3. 使用杀死进程kill 2251

就是这样。

请记住,交换文件可以保护您,您不应该完全禁用它们。


但如果没有vi(m)流程怎么办?
斯科特

-2

我通过三个简单的步骤解决了这个问题:

1 :)运行文件存在的“ls -la”,以便您可以查看.swp文件。

2 :)现在“rm -i * .swp”即删除目录中的“.swp”文件。

3 :)现在确认已删除“.swp”文件。

4 :)现在享受那些警告。


3
为什么在世界上你会建议rm -rf删除文件?我换成-rf一个更明智的-i
Nifle
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.