Vim的swp文件干扰了版本库vimdiff功能。

3
我的设置是使用vim(具体来说是MacVim图形模式)编辑源代码文件,然后使用vimdiff(再次在图形模式下)进行(mercurial)存储库差异比较。有时,当我进行差异比较时,vim会给出以下错误:

交换文件“〜/nn/src/imm/model/injector_node/.values_table.py.swp”已经存在!

如何解决这个问题?我可以命令vim停止制作swp文件,或者让vimdiff忽略它们,或者将其swp文件写入不同的位置吗?
3个回答

7

是的,(也许),是的。

要关闭交换文件:

set nobackup
set nowritebackup
set noswapfile

更改交换文件的位置(这是我的首选):

" Set the directory of the swap file
" The // indicates that the swap name should be globally unique
set directory=~/.vim/tmp//,/tmp

这里我将其设置在.vim目录下的tmp目录中。请参考:h 'directory'以了解每个选项部分的含义。

至于如何让Vimdiff忽略交换文件,我不太确定。但错误可能是因为在使用Mercurial检查差异时,您已经在MacVim中打开相同的文件。如果在执行差异之前关闭文件,那么应该就可以解决问题。


谢谢,我认为这解决了我的问题!我不想在执行差异之前关闭文件,但是“//”会确保如果两个编辑器打开相同的文件,它们不会尝试使用相同的交换文件吗? - Neil G
@NeilG:不会的。所谓“全局唯一”,是指每个文件都有一个完全限定名称。通常,交换文件只是文件名(因为默认情况下,Vim在与源文件相同的目录中创建交换文件),因此如果您在/home/foo中有一个名为bar的文件,以及在/home/baz中有另一个名为bar的文件,则它们在“全局唯一”方案下不会发生冲突。交换文件是一种安全机制,因此如果您不想关闭其他窗口,则可以关闭交换,或者在提示时选择“仍要编辑”。 - voithos
@NeilG 最好不要使用“仍然编辑”,而是使用“只读打开”。 - ZyX
@ZyX:但是如果他需要合并他的更改呢?他不得不实际保存文件,对吧? - voithos
1
@voithos,虽然他必须在“:w”前面使用感叹号,但它不会禁止保存它们。但是,在问题中要求查看存储库差异,而不是编辑它们,并且像“文件已在其他地方编辑”这样的消息很烦人。实际上,在这种情况下,我总是更喜欢使用我的aurum:没有交换文件或在不同位置打开两个文件的问题:您只需在创建更改的相同vim中查看更改即可。 - ZyX
@ZyX:啊,我明白了。我不知道你可以强制写入。 - voithos

4
我建议采用不同的方法:不要使用hg命令行界面查看文件之间的差异,而是使用一个添加了版本控制系统支持的vim插件。这样,您既不需要关闭任何东西,也不需要处理交换文件。
例如,使用我的aurum,您可以使用<leader>aD(映射到:AuVimDiff)查看当前打开缓冲区与其在存储库中的版本之间的差异,然后使用<Leader>X切换回正常视图(如果您没有编辑任何内容,它甚至会恢复打开/关闭的折叠)。如果您执行let g:aurum_vimdiffusewin=1并且使用垂直或水平(取决于'diffopt')等大小的分割,则我的脚本将重用相邻窗口之一。
使用<leader>agD命令可以在vimdiff分屏的多个标签页中查看存储库中所有文件的所有更改(不包括已添加和已删除的文件):它映射到:AuVimDiff full。据我所知,这个功能几乎是独一无二的:有一些针对mercurial的脚本可以完成同样的工作,但它们没有与其他VCS插件集成。再次提醒,可以使用<leader>X来关闭所有标签页。已经打开的缓冲区不会被关闭,其他的将会关闭。

另一个我可以推荐的插件是VCSCommand


1
我知道这个问题已经超过一年了,但是我可以推荐一个插件lawrencium,它将mercurial集成到vim中,受到了git的fugitive插件的启发。它们通过几个简单的命令使你所做的事情(以及许多其他版本控制系统的事情)变得更加容易。

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