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

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

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

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')dá 0,
  • :echo filereadable(expand('~/.vimrc')) dá 1
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.