禁用Vim中的交换文件创建。

257

有没有办法在Vim中禁用创建.swp文件?或者至少将它们创建在一个地方,这样我可以轻松找到并删除它们?

当我同时编辑并复制父目录时,我发现交换文件特别让人讨厌。当然,我知道可以使用“find -exec”来查找和删除它们,但我想要一个更实用的解决方案。

10个回答

302
在vim内禁用交换文件,输入: :set noswapfile
:set noswapfile

要永久禁用交换文件,请将以下内容添加到您的~/.vimrc文件中

set noswapfile

更多细节请参见Vim交换文件文档


12
如果你的编辑器崩溃(如停电等),交换文件是很有用的,但要记住这一点。 - koonse
4
另一个选择是仍然使用交换文件,但将其保留在内存中,这样就不会一直写入硬盘。这不能防止您在停电期间丢失文件,但如果您在另一个vim中打开相同的文件,它将立即告诉您。命令是:set directory=/dev/shm。 - webbertiger
trusktr的回答允许您在解决OP的问题时保留交换文件的优点。 - jpaugh
1
在vim中,您还可以在打开文件时禁用交换文件::noswapfile edit /path/to/file - Torkel Bjørnson-Langen
我的个人数据丢失哲学是DBAB和经常保存... - Samie Bencherif
如果您正在寻找一种在neovim配置中使用lua的方法: 请在任何一个配置文件中添加vim.cmd("noswapfile") - rtviii

184

在 .vimrc 或 /etc/vimrc 文件中设置以下变量,以便使 vim 将交换文件、备份文件和撤销文件放置在一个特定的位置,而不是被编辑的文件所在的工作目录:

set backupdir=~/.vim/backup//
set directory=~/.vim/swap//
set undodir=~/.vim/undo//

在路径中使用双斜杠可以告诉 Vim 启用一个特性,它避免了命名冲突。例如,如果你编辑一个文件位于某个位置,同时又编辑了另一个文件位于另一个位置,而这两个文件都有相同的名称,你不希望在 ~/.vim/swap/ 目录下发生命名冲突。如果你指定路径为 ~/.vim/swap//,Vim 将会根据正在被编辑的文件的完整路径创建交换文件,以避免冲突(文件路径中的斜线将被替换成百分号 %)。

例如,如果你编辑了 /path/one/foobar.txt 和 /path/two/foobar.txt 这两个文件,那么在 ~/.vim/swap/ 目录下将会看到两个交换文件,分别命名为 %path%one%foobar.txt 和 %path%two%foobar.txt。


你还可以补充说明,有时候备份文件的保存可能会挽救开发人员的一命。 - Bartłomiej Skwira
注释:(不是批评)这似乎主要适用于开发,因为对于阅读文件和进行小的编辑或不重要的笔记保留,这是vim使用的很大一部分,它似乎是一个额外的簿记工作最好留出。我个人更喜欢所有工作都没有交换或其他自动备份。如果我真的需要开发某些东西,我宁愿有一个更高级别的框架来保护我,最好带有代码版本控制等。 - j riv
@LelaDax 确实,大多数情况下这些文件基本上是无用的,因为我使用git来管理所有的源代码。在罕见的情况下(比如崩溃),它们确实会派上用场。但实际上,我经常使用撤销历史记录。与检查git提交以查看先前的历史记录相比,这样更容易快速导航。gundo使浏览撤销树变得轻松愉快。我可以没有交换和备份文件。 - trusktr
36
提醒新手(像我一样哈哈...),您需要前往~/.vim/并自行创建目录。它不会自动为您创建。 - aug
1
你也可以在你的vimrc中编写一些代码来自动创建文件夹,这就是我在我的vimrc中所做的。因此,在新系统上,我只需要获取我的vimrc,它就会处理剩下的事情。 - trusktr
显示剩余2条评论

51

我在这里找到了答案:这里

vim -n <file>

打开文件时不使用交换文件。

此外:

set dir=/tmp

.vimrc中设置,将交换文件创建在/tmp中。


*.ext~备份文件怎么办?是否有命令行选项可以禁用它们? - salmatron
非常有用,特别是对于那些一次性处理大文件的情况!谢谢。 - Felipe Alvarez

28

这是我个人的~/.vimrc备份设置

" backup to ~/.tmp 
set backup 
set backupdir=~/.vim-tmp,~/.tmp,~/tmp,/var/tmp,/tmp 
set backupskip=/tmp/*,/private/tmp/* 
set directory=~/.vim-tmp,~/.tmp,~/tmp,/var/tmp,/tmp 
set writebackup

13

与那些质疑vim为什么需要所有这些“灾难恢复”功能的人一样,我也持有同样的观点。当我在编辑文件时,我不希望vim在所编辑的文件目录中创建任何额外的文件,非常感谢您。为此,我在我的_vimrc文件中添加了以下内容以禁用交换文件,并将烦人的“备份”文件移动到Temp目录:

" Uncomment below to prevent 'tilde backup files' (eg. myfile.txt~) from being created
"set nobackup

" Uncomment below to cause 'tilde backup files' to be created in a different dir so as not to clutter up the current file's directory (probably a better idea than disabling them altogether)
set backupdir=C:\Windows\Temp

" Uncomment below to disable 'swap files' (eg. .myfile.txt.swp) from being created
set noswapfile

10
我认为其他编辑器不关心这一点更反映了其他编辑器的问题,而不是反映了vi(m)的问题。将相同目录作为默认放置这些文件的位置是有点不幸的选择,但至少可以辩解。(例如,在多服务器、高度交叉挂载的环境中,在最需要时找到恢复文件可能并不明显) - Domingo Ignacio
4
Vim的交换文件处理方式非常糟糕。我可能使用过它五次来恢复丢失的数据。但是我被迫恢复交换文件的次数已经达到了约9,000次,而那些文件几乎总是和原文件完全相同,或者更糟糕的是一个过时版本。如果恢复过程不那么糟糕的话,这可能是一个很好的功能。recover.vim会有所帮助,但交互性仍然太强。 - joeytwiddle
3
Sublime Text具备“灾难恢复”功能,我很喜欢它!即使我没有保存文件,在恢复时,我所做的任何更改(已保存或未保存)都会被自动恢复。 - leetNightshade
1
我有一个简单的自动命令,可以在更改发生时立即写入,使得交换文件和备份都变得无用。 - tbodt
@joeytwiddle Vim的交换文件已经帮助我多次恢复数据。我不记得有任何一次我无法恢复数据。恢复过程可能更加用户友好吗?可能是的,但我认为使用“糟糕”和“非常糟糕”等词语是没有根据的。 - Torkel Bjørnson-Langen
2
@TorkelBjørnson-Langen 可能是我重启机器时没有关闭所有 Vim 会话,然后对哪些恢复文件实际上有效感到很困惑,这可能是我的错。无论如何,我试图兼顾两者,编写了一个插件,仅在存在未保存的编辑时才维护交换文件:vim-swap-is-awesome.vim - joeytwiddle

7

您可以将backupdir和directory设置为null,以完全禁用交换文件,但通常建议将它们放在一个集中的目录中。Vim会确保没有名称冲突或类似的问题,因此这是一种完全安全的选择:

set backupdir=~/.vim/backup/
set directory=~/.vim/backup/

3
你应该在路径结尾处添加双斜杠“//”,这样你就可以同时修改两个同名文件。 - Samuel O'Malley
谢谢,@SamuelO'Malley。 // 做什么? - monokrome
如果您想阅读此内容的文档,请查看:help directory。双斜杠告诉vim将文件的完整路径编码到交换文件的名称中,例如%home%sam%dotfiles%.gitignore.swp,而不仅仅是.gitignore.swp - Samuel O'Malley

4
如果你使用 git,你可以将*.swp添加到 .gitignore中。

我认为这是大多数用户需要的!关闭交换文件是不好的做法。 - DenisKolodin

3
如果您在exrc文件中添加set directory="",则会关闭交换文件。但是,这样做将禁用恢复功能。
更多信息请参见此处

2

针对特定文件,不创建vim交换文件

autocmd bufenter  c:/aaa/Dropbox/TapNote/Todo.txt :set noswapfile

1
或者对于特定目录中的所有文件,以下似乎可以工作(仅进行了简要测试):autocmd bufenter c:/aaa/Dropbox/TapNote/* :set noswapfile - scottkosty

1

对于任何试图为Rails项目设置此内容的人,请添加

set directory=tmp,/tmp

into your

~/.vimrc

所以.swp文件将位于它们自然的位置 - tmp目录(每个项目)中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接