我没有 Windows 机器,但我能够在 Mac OS X 10.6 系统上重现并隔离此问题。
要么创建C:\TMP 或C:\TEMP(:help 'directory' 表示两者都在 Windows 版本的 Vim 上的 directory 选项的默认值中),或者将 现有 目录添加到directory 选项的值。
我在我的主目录下使用了一个 Vim 特定的临时目录(同样,这里没有 Windows)并添加两个尾部斜杠 (~/tmp/.vim-swaps//)。这种设置集中交换文件,但根据正在编辑的文件的目录为它们提供唯一的名称。请参阅:help :swapname 中的“优点”和“缺点”以及
:help 'directory' 中的“如果目录以两个路径分隔符结尾”位。
使用^= 前置1您的目录(以便始终使用它,如果它存在的话):
set directory^=C:\\some\\existing\\directory//
或者,使用+= 附加您的目录(以便仅在存在且不存在其他适用的directory 条目时使用):
set directory+=C:\\some\\existing\\directory//
Charles’ answer 建议 $TMP(对环境变量的引用)对于 Windows 来说可能是一个不错的值:
set directory+=$TMP//
根本原因与directory选项的默认值结合:Gdiff的索引“伪”文件的路径名有关。
:Gdiff 视图的索引端的缓冲区使用类似于 fugitive:///path/to/repository/.git//0/path/to/file/under/repository 的特殊路径名(逃犯捕获对命名缓冲区的读取和写入,并通过调用 Git “管道”命令将它们重定向到索引)。
directory 中的第一个条目通常是.。这意味着 Vim 将尝试将交换文件放在与编辑文件相同的目录中(即foo/bar.txt 将尝试使用foo/.bar.swp)。如果无法创建此首选交换文件,则将尝试来自 directory 的后续条目。
将. 作为第一个directory,fugitive:///path/to/repository/.git//0/path/to/file/under/repository 的首选交换文件将是fugitive:///path/to/repository/.git//0/path/to/file/under/.repository.swp。这个路径名的前导部分(fugitive:、path、to 等)可能不存在,所以 Vim 将继续从 directory 开始的下一个条目。如果没有其他 directory 条目可用于创建交换文件(例如,它们不存在),则会出现错误 E302。
通过使用set directory=.,~/no-such-dir,/var/no-such-dir,/no-such-dir(即采用默认的 Unix 值并将 tmp 的出现次数更改为 no-such-dir),我能够在 Unix-y 系统上重现您的问题。实际上不存在任何“no-such-dir”目录。当我使用:Gdiff 时,我遇到了同样的错误。
1:help :set^= 只说“添加”,但代码显示set listopt^=… 的前置类似于set listopt+=… 的添加方式(正如后者所记录的那样)。两者都应该根据需要自动插入逗号(尽管这方面可能存在错误)。