Vim错误:执行某些需要临时文件的命令时无法打开文件/tmp/.*。

8

Gentoo,vim版本为7.3.762

问题:
仅在vim实例运行了很长时间(如2小时)后才会发生。然后,我运行一些需要临时文件的命令,例如插件fugitive中的:Gstatus,我会收到错误消息:

can't open file /tmp/RANDOM_NAME

我无法想象是什么原因导致了这个问题。这与操作系统的自动清理策略有关吗?
因为我不仅在运行fugitive命令时遇到了这个问题,还在下面的函数中遇到了:

" Use ranger as vim's file chooser
fun! RangerChooser()
    silent !ranger --choosefile=/tmp/chosenfile $([ -z '%' ] && echo -n . || dirname %)
    if filereadable('/tmp/chosenfile')
        exec 'edit ' . system('cat /tmp/chosenfile')
        call system('rm /tmp/chosenfile')
    endif
    redraw!
endfun

也许 /tmp 是一个填满的虚拟文件系统? - user2864740
我也遇到过这个问题。似乎是vim会话中某种奇怪的状态。只要重新启动vim,它就会消失,并且不会影响同时运行的其他vim会话。这可能与system()本身有关。当出现问题时,我可以使用:echo system('ls')来重现错误。 - Mu Mind
4个回答

21

我遇到了这个问题,是因为我最近把我的shell从fish改成了bash。在我的vimrc中更改shell解决了这个问题:

set shell=/bin/bash


我在使用vim时遇到了一个错误,因为一个扩展无法打开tmp文件。按照这个答案中提到的设置shell的方法解决了我的问题。导致这个问题的扩展名叫做airline,我看到的错误是:Error detected while processing function airline#extensions#branch#get_head[1]...不过现在已经全部解决了。在这里提一下,以防其他人也在寻找解决方法。谢谢! - Bjorn
你救了我的一天。谢谢! - sametcodes
2
没想到这个也能在Windows上运行,但它确实可以!谢谢 :) - BSL-5
谢谢,我已经试了好几个小时来解决这个问题了。 - user7847084
我之前在使用cmd运行nvim,但是将shell设置为gitbash后,一旦我将shell重新设置回cmd,错误就消失了。感谢您的帮助。 - Jess Patton

2

我知道逃犯插件使用了内部vim函数tempname()。该函数返回一个唯一文件名的文件路径,该文件路径位于Unix风格系统中/tmp目录下的一个目录中。如果该目录不再存在,则可能会出现此错误。我不能确定这是否是您遇到的问题,但这是需要检查的内容。

如果您输入:echo isdirectory(fnamemodify(tempname(), ":p:h"))并且返回值为0,则请尝试使用:call mkdir(fnamemodify(tempname(), ":p:h"))来解决问题。


不幸的是,最近我没有看到这个问题再次发生~(我已经将Linux内核从3.8升级到3.10.7)。我在想是否有可能在vim仍在使用它时,操作系统清除了临时文件。 - Yang Liu
有趣。我没想到会有帮助,但是:call mkdir(fnamemodify(tempname(), ":p:h"))却解决了问题。看起来你也可以通过使用:call system('rm -rf ' . fnamemodify(tempname(), ':p:h'))删除临时路径来使 Vim 陷入这种破坏状态。 - Mu Mind

2
我知道这是一个老的帖子。仍然发布以便对某些人有所帮助。
最近在我的系统上遇到了这个错误。文件名的格式为“/ tmp / /”。结果发现,在我启动 Vim 实例并一直运行了几天后,/ tmp / 目录已被清理。
快速使用mkdir /tmp/<random-dir-name>修复此问题而无需重新启动 Vim。

0

将下面的代码添加到你的vimrc文件中,并在你的主目录下创建.tmp文件夹

let $TMPDIR = $HOME."/tmp"

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