tempname()没有创建目录

时间:2014-01-13 17:41:06

标签: vim

我遇到了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

1 个答案:

答案 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)