如何在Vimscript中检测特定文件是否存在?

124

我正在寻找用 Vimscript 检查当前目录中文件是否存在的优雅方法。

我想出了下面的代码,但不确定这是否是最优雅的解决方案(如果文件存在,我将设置一个 Vim 选项)。有没有不必再比较文件名的其他内置函数可以使用?

也许可以使用 Vim 中不同的内置功能?

:function! SomeCheck()
:   if findfile("SpecificFile", ".") == "SpecificFile"
:       echo "SpecificFile exists"
:   endif
:endfunction
4个回答

156

vim man中搜索一下,我找到了这个,它看起来比原来的好得多:

:function! SomeCheck()
:   if filereadable("SpecificFile")
:       echo "SpecificFile exists"
:   endif
:endfunction

5
如果SpecificFile存在但当前用户无法读取,也许使用findfile会更好。 - ppan
2
filereadable 的帮助文档提到,如果您不关心可读性,可以使用 glob - Sumudu Fernando
10
如果(expand("~/.vim/bundle/vundle/README.md"))可读,则将g:hasVundle变量设为1。 - thinker3
@metaphy 这是一个非常好的评论,我已经基于此添加了答案以增加其可见性,但如果您想获得荣誉,请随意添加自己的答案,我会删除我的。 - icc97

68

有些评论表达了对filereadable的担忧,建议使用glob代替。这解决了存在文件但权限不允许读取的问题。如果你想检测这种情况,可以使用以下方法:

:if !empty(glob("path/to/file"))
:   echo "File exists."
:endif

我收到了“E116:函数参数无效”的错误。如何指定相对于主目录检查插件的文件?(请参见此处 - Scz
你是在谈论用户主目录吗?我猜只需要一个 ~,但我不确定。当你遇到那个错误时,你提供了什么参数? - brianmearns
1
我用 ~ 试了一下,它报错了。现在我又试了一次,它可以工作了... :-) - Scz
1
可能只是一个打字错误或其他什么问题。但很高兴它对你起作用了! - brianmearns
与其他答案不同,这似乎也适用于目录。 - Brian McCutchon
显示剩余2条评论

24
metaphy的评论在被接受的答案上增加一些可见性。
if filereadable(expand("~/.vim/bundle/vundle/README.md")) let g:hasVundle = 1 endif`
如果你在文件路径中使用了“~”,那么需要使用filereadable函数来判断文件是否可读。此外,还有一个额外的便捷步骤,即使用expand函数。
function! SomeCheck()
   if filereadable(expand("SpecificFile"))
       echo "SpecificFile exists"
   endif
endfunction

例如:
  • :echo filereadable('~/.vimrc') 返回 0
  • :echo filereadable(expand('~/.vimrc')) 返回 1

6

如果现在太晚了,但是做这个还是值得的。

if !empty(expand(glob("filename")))
    echo "File exists"
else
    echo "File does not exists"
endif

对我来说运作良好


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