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


84

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

You may want to delete the .swp file now.

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

我肯定会丢失一些东西。


参见此处vi.stackexchange.com/questions/13518/… “如果Vim进程仍在运行,则不会显示“ Delete it”选项“,并注意TMUX会话中的注释,即确保您没有在运行Vim。 (也GNU屏幕)在后台的某个地方,在这里看到vi.stackexchange.com/questions/13518/...
zenaan

Answers:


81

稍微简单一些的方法:

从终端仿真器:

vim filename

然后选择restore,如果要删除交换,请编写(保存),然后在vim中执行此操作:

:e          // no argument needed. It assumes the current buffer.

...并选择这次删除

我刚刚发现了这个问题,我想从现在开始。这样一来,即使恢复结果已损坏,我也不会意外覆盖工作文件(尽管我之前从未尝试过)。

关于堆栈溢出的这个问题,也有相关的技巧(我在这里找到了这个技巧)。


16
我没有delete选择,只有:[O] pen(E)dit(R)ecover(Q)uit(A)bort,我该怎么办?
阿恩(Arne)2015年

4
@Arne:根据我的经验,通常意味着当前在另一个vim实例中打开文件?
miyalys,2015年

1
[D] elete选项仅在我更新到Vim 7.4之后才出现
jmlarson

@Arne我有同样的问题。但是过了大约一个小时后,我重新启动了vim并且该选项可用。PC当时没有重新启动。vim可能认为另一个vim进程正在运行。这就是为什么它不显示该选项。
ka3ak

6
对于那些说他们看不到(D)elete选择权的人,请参见:help swap-exists;引用,On Unix this choice is only offered when the process that created the swap file does not appear to be running.即您可能正在运行另一个vim进程,该进程导致该选项被隐藏。它也可以解释为什么您首先拥有一个swp文件!
Lqueryvg

39

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

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

find . -type f -name "*.sw[klmnop]" -delete

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

由于多种原因,这可能不是您想要的:

  • 如前所述,它搜索当前目录  ;即,当前目录和所有子目录都是递归的。这超出了问题的要求,可能被认为是过大的。
  • 如上所述,它会删除其名字与结尾的所有文件.swk.swl.swm.swn.swo,或.swp,而不是只.swp。  加里·约翰逊(Gary Johnson)说

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

      \*.sw[nop] 
    

    甚至

      \*.sw? 
    

    会更彻底。

    这篇文章 的原始作者说,

    'klmnop'可能有点过分,但这通常可以确保我将所有这些都得到。

  • 另一方面,这可能是徒劳的。  卢布 建议

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

    匹配所有(小写)三字母扩展名,范围从.saa.swp。他补充说:“尽管要小心,尽管这是一个更完整的解决方案,但它将删除所有.svg图像文件和.swf adobe flash文件。你可能想,如果你有这些文件的工作来修改正则表达式。”这也符合.sav.snd(声音数据).sql.src.srt(SubRip视频字幕格式),以及许多其他常见的扩展。

  • 这可能是矫kill过正。如上所述,它会删除其名字与结尾的所有文件.swk.swl.swm.swn.swo,或.swp。但是,显然,vim交换文件通常是“点”文件。如果进行编辑hello.cpp,则交换文件可能为.hello.cpp.swp。如rouble答案所示(但未说明),仅删除名称以点开头的文件更为安全。例如,与

    find . -type f -name ".*.sw[klmnop]" -delete
    

14

键入ls -a列出目录中所有文件的类型

输入rm .whatever.your.swpis并按enter

就这么简单。

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

请记住,更改是立即且永久的,因此要小心。


4
不过,这不是很简单。我必须离开Vim,导航交换目录,记住文件名,并可能确定它是file.swp还是file.swo。然后,我必须回到原来的位置。击球:e是一个简单得多的解决方案。
2013年

1
ls: cannot access +A: No such file or directory
乔纳森(Jonathan)2015年

这就是我需要的
user5510975 '18

7

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

从描述:

  1. 文件是否已在其他窗口的另一个Vim会话中打开?
  2. 如果是这样,请交换到我们正在编辑该文件的窗口。
  3. 否则,如果swapfile早于文件本身,则将其删除。
  4. 否则,请以只读方式打开文件,以便我们进行查看并保存。

6
谁能告诉我为什么在没有插件的情况下,vim默认情况下不会具有明智的行为?
帕维尔·西默达

6

不,AFAIK您什么都不丢失。Vim继续保留交换文件作为备份,直到您明确删除它为止。

只需保存并退出,然后再次重新打开同一文件。将会再次提示您

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

现在只需按d:)


11
真?我的意思是,我知道。但这很愚蠢。这肯定不是“简单”的。
Peeja 2012年

1
顺便说一句,退出和中止之间有什么区别?
trusktr

5
我的情况下没有删除选项。我该怎么办?(我保存,退出并重新打开)
Paschalis 2014年

您不需要先退出vim,只需在文件中选择“无论如何编辑”或“恢复”后键入:e <return>,即可选择删除它
00prometheus

2

像大多数Unix命令一样,Vim简单明了,而不是假定和隐含。

您使用(r)恢复。如果您不喜欢恢复或恢复已损坏,则可以将其丢弃。如果喜欢,可以保存文件。恢复文件不会为您删除,因为这不是明确的,并且在100%的情况下都不正确。

因此,您(r)发现,(w)写入和(q)uit,然后再次编辑并选择(d)elete或“ rm .myfile.js.swp”并再次编辑。从Vim的角度来看,这是快速完成的事情,并且始终是100%正确的行为。


好的,那么有没有办法让vim给我交换文件的路径?我很乐意运行第二个命令以删除交换文件(实际上,我喜欢该命令的显式性),但是我希望有一个命令可以删除交换文件,无论它在哪里。例如,我有一个单独的swapfile目录。如果两个打开的文件具有相同的基本名称,则无法以编程方式确定哪个是当前缓冲区的正确交换文件。
Peeja

1
是的,但是提供一个简单的“恢复和删除”选项会很好。这可能也很容易实现。如果还没有完成的话,我有一天会去上学的。
trusktr 2013年

1
大多数Unix命令简单,明确,并且具有合理的默认行为。Vim恢复并不简单,UX与LibreOffice一样糟糕,其行为显然是错误的,并且在许多情况下,其结果是数据丢失。
帕维尔·西默达

1

这些文件也让我很烦,但是我在.vimrc中设置了选项- set noswapfile 防止vim创建它,而是将文件保留在内存中。


根据OP,交换文件很有用,因此关闭它们可能不是最佳选择。
Kusalananda

不要关闭交换文件。如果您的计算机崩溃了,您将失去工作。
Lqueryvg '18年

当然,该选项会带来风险,并且据我所知,这些交换文件是在vi * editiors崩溃时经常发生的。现在我可以说vim可以稳定运行,它们作为遗留物存在,恕我直言。
德米特里(Dmitrii)'18年

1

这是一个更完整的正则表达式,用于根据Github自己的Vim gitignore文件清除所有vim交换文件。

$ find ./ -type f \( -name "\.*\.s[a-v][a-z]" -o -name "\.*\.sw[a-p]" \) -delete

不过请注意,尽管这是一个更完整的解决方案,但它会删除所有.svg图像文件和.swf adobe flash文件。如果使用这些文件,则可能需要修改正则表达式。


1

这是要添加的代码段.vimrc。它将删除与当前文件缓冲区关联的所有交换文件,并重置交换扩展名。

function! DeleteFileSwaps()
    write
    let l:output = ''
    redir => l:output 
    silent exec ':sw' 
    redir END 
    let l:current_swap_file = substitute(l:output, '\n', '', '')
    let l:base = substitute(l:current_swap_file, '\v\.\w+$', '', '')
    let l:swap_files = split(glob(l:base.'\.s*'))
    " delete all except the current swap file
    for l:swap_file in l:swap_files
        if !empty(glob(l:swap_file)) && l:swap_file != l:current_swap_file 
            call delete(l:swap_file)
            echo "swap file removed: ".l:swap_file
        endif
    endfor
    " Reset swap file extension to `.swp`.
    set swf! | set swf!
    echo "Reset swap file extension for file: ".expand('%')
endfunction
command! DeleteFileSwaps :call DeleteFileSwaps()

一旦遇到困境,就可以执行。:DeleteFileSwaps 如果与:windo:tabdo命令结合使用,那就太好了。

:tabdo DeleteFileSwaps 

更多详细信息:一个文件可以包含多个交换文件。由于交换文件(扩展名为)的原因.swp仍然存在,因此vim将继续创建新文件。要找出是否.swp存在:

  • 在vim中打开目标文件后,执行:sw以获取当前的交换文件。
  • 检查当前交换文件所在的目录。
  • 然后,检查目录是否包含具有打开文件名称的扩展文件,并且扩展名为.swp

上面的代码段遵循相同的过程,但是删除所有交换文件。

希望这可以帮助。


0

从手册:h swap

您可以看到该命令正在使用的当前交换文件的名称: :sw[apname]


警告...可能不是您要删除的文件的名称。在删除.swp文件之前,该:sw命令可能会为您提供.swo文件名-这不是您要删除的文件名。
Lqueryvg '18年

0

如果询问您,则按D删除当前文件的交换文件。

如果不是,则必须手动进行。

一种替代方法是:

查找/搜索文件:

find | grep ".searchRefineVertTabs.jsp.swp"

然后删除此文件:

rm ./.searchRefineVertTabs.jsp.swp

1
问过,但我的选择是恢复。问题是如何在恢复立即删除它,因为不再需要它。vim的失败似乎不适合我。但是,可接受的答案是我到目前为止发现的最干净的工作流程。
2015年

-1

您可以使用,

rm -f .<filename>.<ext>.swp

例:

rm -f .rc.local.swp

从技术上讲,这是可行的,但要获得当前接受的答案,这远远没有那么容易。
Peeja

加号<ext>在这里是多余的,因为文件名至少在Linux上包含零个或多个扩展名。
帕维尔·西默达
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.