Como detectar se um arquivo específico existe no Vimscript?

105

Estou procurando uma maneira elegante no Vimscript de verificar se existe um arquivo no diretório atual.

Eu vim com o código abaixo, mas não tenho certeza se essa é a solução mais elegante (vou definir uma opção Vim se o arquivo existir). Existe alguma maneira de não ter que fazer outra comparação do nome do arquivo?

Talvez use uma função integrada diferente do Vim?

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

Respostas:

138

Com um pouco de pesquisa em vim man, encontrei isto, que parece muito melhor que o original:

:function! SomeCheck()
:   if filereadable("SpecificFile")
:       echo "SpecificFile exists"
:   endif
:endfunction
StefanB
fonte
4
E se SpecificFile existir, mas não for legível para o usuário atual. Talvez findfile seja melhor.
ppan
2
A ajuda para filereadablemenções que você pode usar globse não se importar com a legibilidade.
Sumudu Fernando
8
se legível por arquivo (expandir ("~ / .vim / bundle / vundle / README.md")) let g: hasVundle = 1 endif
thinker3
@metaphy é um excelente comentário, adicionei uma resposta baseada nisso para dar mais visibilidade, mas se você quiser o crédito, fique à vontade para adicionar sua própria resposta e eu excluirei a minha.
icc97
56

Alguns dos comentários expressam preocupações sobre filereadablecomo usar glob. Isso resolve o problema de ter um arquivo que existe, mas as permissões impedem que ele seja lido. Se você quiser detectar esses casos, o seguinte funcionará:

:if !empty(glob("path/to/file"))
:   echo "File exists."
:endif
brianmearns
fonte
Eu entendo E116: Invalid arguments for function. Como você especifica o arquivo relativo ao diretório inicial para verificar se há um plugin? (Veja também aqui )
Scz
Você está falando sobre o diretório inicial do usuário? Acho que é apenas um ~, mas não tenho certeza. Que argumentos você forneceu quando obteve esse erro?
brianmearns
1
Tentei com ~, e deu aquele erro. Agora tentei de novo e funciona ... :-)
Scz
1
Provavelmente apenas um erro de digitação ou algo assim. Mas que bom que funcionou para você!
brianmearns
Ao contrário da outra resposta, isso parece funcionar para diretórios também.
Brian McCutchon
12

Dando um pouco mais de visibilidade ao comentário metafórico sobre a resposta aceita:

se legível por arquivo (expandir ("~ / .vim / bundle / vundle / README.md")) deixe g: hasVundle = 1 endif

filereadableé o que é necessário, mas há uma etapa útil extra de expand, caso você esteja usando ~em seu caminho:

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

Por exemplo

  • :echo filereadable('~/.vimrc')0,
  • :echo filereadable(expand('~/.vimrc'))1
icc97
fonte