删除我已经恢复的 Vim 交换文件的最简单方法是什么?

Pee*_*eja 112 vim swap-file

有时 Vim 会崩溃并给我留下一个交换文件。棒极了。然后我打开我正在编辑的文件,Vim 询问我是否要恢复。我愿意,谢谢。完成后,Vim 告诉我,

You may want to delete the .swp file now.
Run Code Online (Sandbox Code Playgroud)

为什么,是的,我愿意。我怎么做?我认为它会再次开始使用旧的交换文件作为交换文件并在我退出时清理它,但事实并非如此。它创建一个新文件,清理它,当我再次打开文件时,它再次提示我从第一个文件中恢复。

当然我错过了一些东西。

miy*_*lys 103

稍微简单的方法

从终端模拟器:

$ vim filename
Run Code Online (Sandbox Code Playgroud)

然后在 vim 中选择restore,如果你想删除交换你(保存)然后调用这个命令:

:e          // no argument needed. It assumes the current buffer.
Run Code Online (Sandbox Code Playgroud)

...这次选择删除

这种方法的一个好处是它不会自动覆盖工作文件,如果恢复结果损坏(尽管我以前从未发生过这种情况)。

Stack Overflow也有关于这个问题的相关提示(我在那里找到了这个提示)。

  • 我没有`delete`选项,只有:[O]pen (E)dit (R)ecover (Q)uit (A)bort,我该怎么办? (27认同)
  • 对于那些说他们没有看到 `(D)elete` 选项的人,请参阅 `:help swap-exists`;引用 `在 Unix 上,只有当创建交换文件的进程似乎没有运行时才提供这个选项。` 即,也许你有另一个 vim 进程正在运行,这导致这个选项被隐藏。这也可以解释为什么你有一个 `swp` 文件! (13认同)
  • @Arne:根据我的经验,这通常意味着文件当前是在另一个 vim 实例中打开的吗? (6认同)
  • [D]elete 选项仅在我更新到 Vim 7.4 后出现 (3认同)
  • 对我来说,工作流程是:`vim filename`,选择 [R]ecover,`:w` 保存,`:e`,然后选择 [D]elete。 (3认同)

小智 54

清除目录中的所有 vim 交换文件:

如果您确定目录树中不需要任何 vim 交换文件并想删除它们,则可以在 vim运行时在目录中使用以下命令(甚至不在另一个窗口中,甚至在不同的登录名中)会议):

find . -type f -name "*.sw[klmnop]" -delete
Run Code Online (Sandbox Code Playgroud)

一些灵感和想法来自 在 Google Groups 中删除垃圾 .swp 文件。这将删除 当前目录树中名称以.swk, .swl, .swm, .swn, .swo, 或结尾的所有文件.swp

这可能不是您想要的,原因如下:

  • 如前所述,它搜索当前目录?即,当前目录和所有子目录,递归。这超出了问题的要求,可能被认为是矫枉过正。
  • 如上所述,它将删除名称以.swk, .swl, .swm, .swn, .swo, or结尾的所有文件.swp,而不仅仅是.swp加里约翰逊说

    此外,并非所有交换文件都以 .swp 结尾。如果 Vim 需要创建一个交换文件并且一个以 .swp 结尾的文件已经存在,Vim 将使用扩展名 .swo 和 .swn 之后的扩展名。我认为它只是通过字母表向后继续。所以使用类似的东西

      \*.sw[nop] 
    
    Run Code Online (Sandbox Code Playgroud)

    甚至

      \*.sw? 
    
    Run Code Online (Sandbox Code Playgroud)

    会更彻底。

    这篇文章的 原作者说,

    'klmnop' 可能有点矫枉过正,但这通常可以确保我得到所有这些。

  • 另一方面,它可能是低效的。  卢布 暗示

    find . -type f \( -name ".*.s[a-v][a-z]" -o -name ".*.sw[a-p]" \) -delete
    
    Run Code Online (Sandbox Code Playgroud)

    它匹配从.saa到 的所有(小写)三字母扩展名.swp。他补充说:“不过要小心,虽然这是一个更完整的解决方案,但它会删除任何 .svg 图像文件和 .swf adobe flash 文件。如果您使用这些文件,您可能需要修改正则表达式。” 它还匹配.sav.snd(声音数据)、.sql.src.srt(SubRip 视频字幕格式)和许多其他常见的扩展名。

  • 这可能是矫枉过正。如上所述,它将删除名称以.swk, .swl, .swm, .swn, .swo, 或结尾的所有文件.swp。但是,显然,vim 交换文件通常是“点”文件。如果您编辑hello.cpp,交换文件可能是.hello.cpp.swp. 如rouble's answer所示(但未解释),仅删除名称以点开头的文件更安全;例如,与

    find . -type f -name ".*.sw[klmnop]" -delete
    
    Run Code Online (Sandbox Code Playgroud)


小智 18

键入ls -awhich 列出目录中的所有文件

键入rm .whatever.your.swp是并按enter

就这么简单。

.前面显示的任何文件都是隐藏文件,通常看不到。

请记住,更改是即时且永久的,因此请务必小心。

  • 不过,这并不是很简单。我必须离开 Vim,导航交换目录,记住文件的名称,并可能决定它是 `file.swp` 还是 `file.swo`。然后我必须回到我原来的地方。点击`:e` 是一个更简单的解决方案。 (4认同)

too*_*ley 8

顺便提一句。一些插件会自动为您执行此操作:autoswap.vim

从描述:

  1. 文件是否已经在其他窗口的另一个 Vim 会话中打开?
  2. 如果是这样,请切换到我们正在编辑该文件的窗口。
  3. 否则,如果交换文件比文件本身更旧,只需摆脱它。
  4. 否则,以只读方式打开文件,以便我们查看并保存。

  • 谁能告诉我为什么 vim 在没有插件的情况下默认情况下不能有合理的行为? (9认同)

Avi*_*vio 7

不,AFAIK 你什么都没有遗漏。Vim继续保留交换文件作为备份,直到您明确删除它。

只需保存并退出并再次重新打开相同的文件。你会被提示(再次)

[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort, (D)elete it
Run Code Online (Sandbox Code Playgroud)

现在只需按d:)

  • 真的吗?我的意思是,我知道。但这很愚蠢。这当然不是“简单”。 (11认同)
  • 在我的情况下没有删除选项。我该怎么办?(我保存,退出,然后重新打开) (6认同)