ChatGPT解决这个技术问题 Extra ChatGPT

How to detect if a specific file exists in Vimscript?

I'm looking for an elegant way in Vimscript to check if a file exists in the current directory.

I came up with the code below but I'm not sure if that's the most elegant solution (I'll set a Vim option if the file exists). Is there any way of not having to do another comparison of the filename?

Maybe use a different built-in function from Vim?

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

s
stefanB

With a bit of searching in vim man I've found this, which looks much better that the original:

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

What if SpecificFile exists, but is not readable for current user. Maybe findfile is better.
The help for filereadable mentions you can use glob if you don't care about readability.
if filereadable(expand("~/.vim/bundle/vundle/README.md")) let g:hasVundle = 1 endif
@metaphy that's an excellent comment, I've added an answer based on that to give it more visibility, but if you want the credit feel free to add your own answer and I'll delete mine.
b
brianmearns

Some of the comments express concerns about filereadable and using glob instead. This addresses the issue of having a file that does exist, but permissions prevent it from being read. If you want to detect such cases, the following will work:

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

I get E116: Invalid arguments for function. How do you specify the file relative to the home directory to check for a plugin? (See also here)
Are you talking about the user home directory? I would guess just a ~, but I'm not positive. What arguments did you supply when you got that error?
I tried it with ~, and it gave that error. Now I tried again and it works... :-)
Probably just a typo or something. But glad it worked for you!
Unlike the other answer, this appears to work for directories, too.
i
icc97

Giving some more visibility to metaphy's comment on the accepted answer:

if filereadable(expand("~/.vim/bundle/vundle/README.md")) let g:hasVundle = 1 endif

filereadable is what is required, but there's an extra handy step of expand, should you be using ~ in your path:

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

For example

:echo filereadable('~/.vimrc') gives 0,

:echo filereadable(expand('~/.vimrc')) gives 1


a
aloussase

Sorry if it's too late, but doing

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

works fine for me