有时Vim崩溃了,并留下了交换文件。棒极了。然后,我打开正在编辑的文件,Vim问我是否要恢复。是的,谢谢。完成后,Vim告诉我,
You may want to delete the .swp file now.
为什么,是的,我愿意。我怎么做?我认为它只是会再次开始使用旧的交换文件作为交换文件,并在我退出时清理它,但这不是事实。它会创建一个新文件,将其清理干净,当我再次打开文件时,它会再次提示我从第一个文件中恢复。
我肯定会丢失一些东西。
有时Vim崩溃了,并留下了交换文件。棒极了。然后,我打开正在编辑的文件,Vim问我是否要恢复。是的,谢谢。完成后,Vim告诉我,
You may want to delete the .swp file now.
为什么,是的,我愿意。我怎么做?我认为它只是会再次开始使用旧的交换文件作为交换文件,并在我退出时清理它,但这不是事实。它会创建一个新文件,将其清理干净,当我再次打开文件时,它会再次提示我从第一个文件中恢复。
我肯定会丢失一些东西。
Answers:
稍微简单一些的方法:
从终端仿真器:
vim filename
然后选择restore,如果要删除交换,请编写(保存),然后在vim中执行此操作:
:e // no argument needed. It assumes the current buffer.
...并选择这次删除。
我刚刚发现了这个问题,我想从现在开始。这样一来,即使恢复结果已损坏,我也不会意外覆盖工作文件(尽管我之前从未尝试过)。
关于堆栈溢出的这个问题,也有相关的技巧(我在这里找到了这个技巧)。
delete
选择,只有:[O] pen(E)dit(R)ecover(Q)uit(A)bort,我该怎么办?
(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
文件!
如果您确定目录树中不需要任何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
键入ls -a
列出目录中所有文件的类型
输入rm .whatever.your.swp
is并按enter
就这么简单。
.
前面带有的任何文件都是隐藏文件,通常看不到。
请记住,更改是立即且永久的,因此要小心。
file.swp
还是file.swo
。然后,我必须回到原来的位置。击球:e
是一个简单得多的解决方案。
ls: cannot access +A: No such file or directory
顺便说一句。一些插件会自动为您执行此操作:autoswap.vim
从描述:
- 文件是否已在其他窗口的另一个Vim会话中打开?
- 如果是这样,请交换到我们正在编辑该文件的窗口。
- 否则,如果swapfile早于文件本身,则将其删除。
- 否则,请以只读方式打开文件,以便我们进行查看并保存。
不,AFAIK您什么都不丢失。Vim
继续保留交换文件作为备份,直到您明确删除它为止。
只需保存并退出,然后再次重新打开同一文件。将会再次提示您
[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort, (D)elete it
现在只需按d
:)
像大多数Unix命令一样,Vim简单明了,而不是假定和隐含。
您使用(r)恢复。如果您不喜欢恢复或恢复已损坏,则可以将其丢弃。如果喜欢,可以保存文件。恢复文件不会为您删除,因为这不是明确的,并且在100%的情况下都不正确。
因此,您(r)发现,(w)写入和(q)uit,然后再次编辑并选择(d)elete或“ rm .myfile.js.swp”并再次编辑。从Vim的角度来看,这是快速完成的事情,并且始终是100%正确的行为。
这些文件也让我很烦,但是我在.vimrc中设置了选项- set noswapfile
防止vim创建它,而是将文件保留在内存中。
这是要添加的代码段.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
存在:
:sw
以获取当前的交换文件。.swp
。上面的代码段遵循相同的过程,但是删除所有交换文件。
希望这可以帮助。
从手册:h swap
:
您可以看到该命令正在使用的当前交换文件的名称:
:sw[apname]
.swp
文件之前,该:sw
命令可能会为您提供.swo
文件名-这不是您要删除的文件名。
如果询问您,则按D删除当前文件的交换文件。
如果不是,则必须手动进行。
一种替代方法是:
查找/搜索文件:
find | grep ".searchRefineVertTabs.jsp.swp"
然后删除此文件:
rm ./.searchRefineVertTabs.jsp.swp