ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

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

s
stefanB

通过在 vim man 中进行一些搜索,我发现了这个,它看起来比原来的要好得多:

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

如果 SpecificFile 存在,但当前用户不可读怎么办。也许 findfile 更好。
filereadable 的帮助提到如果您不关心可读性,可以使用 glob
if filereadable(expand("~/.vim/bundle/vundle/README.md")) let g:hasVundle = 1 endif
@metaphy 这是一个很好的评论,我在此基础上添加了 an answer 以使其更具可见性,但如果您想要信用,请随时添加您自己的答案,我会删除我的。
b
brianmearns

一些评论表达了对 filereadable 和使用 glob 的担忧。这解决了文件确实存在但权限阻止读取它的问题。如果您想检测此类情况,以下方法将起作用:

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

我得到E116: Invalid arguments for function。如何指定相对于主目录的文件来检查插件? (另见here
你说的是用户主目录吗?我猜只是一个~,但我并不肯定。当您遇到该错误时,您提供了哪些论据?
我用 ~ 尝试过,它给出了那个错误。现在我又试了一次,它起作用了...... :-)
可能只是一个错字什么的。但很高兴它对你有用!
与其他答案不同,这似乎也适用于目录。
i
icc97

metaphy's comment 对已接受的答案有更多的了解:

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


a
aloussase

抱歉,如果为时已晚,但正在做

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

对我来说很好