我遇到了Vim插件的问题,它试图获取一个临时文件,但无法创建目录。
因此,当它被使用时,插件失败,因为从未创建过目录,因此它会抛出错误,因为文件从未被写入。
我只能在Gentoo上重现:
:let temp_file = tempname()
:echo temp_file
/tmp/vhISQyY/3
Press ENTER or type command to continue
:!ls /tmp/
pathogen pip_build_vagrant solarized
Press ENTER or type command to continue
该插件遵循:help tempname()
中给出的重定向命令的相同示例。
我知道该文件不存在,但没有目录中断。其他使用tempname()
的插件从不检查包含目录是否存在,只是写入它,所以我想知道这是否是一个Vim错误,或者我是否真的在插件中做错了。
这是tpope的fugitive
插件的摘录,该插件以相同的方式使用tempname()
(不检查目录):
let errorfile = tempname()
try
try
execute cd.s:fnameescape(s:repo().tree())
if &shell =~# 'cmd'
let command = ''
let old_editor = $GIT_EDITOR
let $GIT_EDITOR = 'false'
else
let command = 'env GIT_EDITOR=false '
endif
let command .= s:repo().git_command('commit').' '.a:args
if &shell =~# 'csh'
noautocmd silent execute '!('.command.' > '.outfile.') >& '.errorfile
elseif a:args =~# '\%(^\| \)--interactive\>'
noautocmd execute '!'.command.' 2> '.errorfile
else
noautocmd silent execute '!'.command.' > '.outfile.' 2> '.errorfile
endif
finally
execute cd.'`=dir`'
endtry
...
失败的插件就是这样使用它:
let tmp_path = tempname()
silent! execute "keepalt w " . tmp_path
答案 0 :(得分:3)
正在删除或清理/ tmp目录。我曾经提出patch来解决这个问题,但是Bram并不想要包含它。从那以后,我在我的.vimrc
:
"In case /tmp get's clean out, make a new tmp directory for vim:
:command! Mktmpdir call mkdir(fnamemodify(tempname(),":p:h"),"",0700)