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


105

我正在Vimscript中寻找一种优雅的方式来检查当前目录中是否存在文件。

我想出了下面的代码,但是我不确定这是否是最优雅的解决方案(如果文件存在,我将设置Vim选项)。有没有什么方法不必对文件名进行其他比较?

也许使用与Vim不同的内置函数?

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

Answers:


138

经过一些搜索,vim man我发现了这一点,它看起来比原始的要好得多:

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

4
如果SpecificFile存在,但当前用户不可读该怎么办。也许findfile更好。
ppan 2012年

2
如果您不关心可读性,则filereadable可以使用提及帮助glob
Sumudu Fernando 2012年

8
如果文件可读(expand(“〜/ .vim / bundle / vundle / README.md”))让g:hasVundle = 1 endif
thinker3

@metaphy是一个很好的评论,我在基础上添加了一个答案,以使其更具可见性,但是如果您希望功劳随意添加自己的答案,我将删除我的答案。
icc97 '18

56

一些评论表达了担忧filereadable和使用glob代替。这解决了存在确实存在的文件的问题,但是权限阻止读取该文件。如果您想检测出这种情况,则可以进行以下操作:

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

我懂了E116: Invalid arguments for function。如何指定相对于主目录的文件以检查插件?(另请参见此处
Scz

您在谈论用户主目录吗?我猜只是一个~,但我不是积极的。出现错误时,您提供了哪些参数?
brianmearns 2015年

1
我尝试使用~,但出现了该错误。现在我再试一次,它可以工作... :-)
Scz 2015年

1
可能只是一个错字之类的。但是很高兴它为您服务!
brianmearns 2015年

与其他答案不同,这似乎也适用于目录。
Brian McCutchon '16

12

使metaphy对已接受答案的评论更具可见性:

如果文件可读(expand(“〜/ .vim / bundle / vundle / README.md”)),则让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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.