Comment détecter si un fichier spécifique existe dans Vimscript?

105

Je recherche un moyen élégant dans Vimscript pour vérifier si un fichier existe dans le répertoire courant.

J'ai trouvé le code ci-dessous mais je ne suis pas sûr que ce soit la solution la plus élégante (je définirai une option Vim si le fichier existe). Existe-t-il un moyen de ne pas avoir à faire une autre comparaison du nom de fichier?

Peut-être utiliser une fonction intégrée différente de Vim?

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

Réponses:

138

Avec un peu de recherche, vim manj'ai trouvé ceci, qui semble beaucoup mieux que l'original:

:function! SomeCheck()
:   if filereadable("SpecificFile")
:       echo "SpecificFile exists"
:   endif
:endfunction
stefanB
la source
4
Que faire si SpecificFile existe, mais n'est pas lisible pour l'utilisateur actuel. Peut-être que findfile est meilleur.
ppan
2
L'aide pour les filereadablementions que vous pouvez utiliser globsi vous ne vous souciez pas de la lisibilité.
Sumudu Fernando
8
if filereadable (expand ("~ / .vim / bundle / vundle / README.md")) let g: hasVundle = 1 endif
thinker3
@metaphy c'est un excellent commentaire, j'ai ajouté une réponse basée sur cela pour lui donner plus de visibilité, mais si vous voulez le crédit, n'hésitez pas à ajouter votre propre réponse et je supprimerai la mienne.
icc97
56

Certains des commentaires expriment des inquiétudes au sujet de l' filereadableutilisation à la globplace. Cela résout le problème d'avoir un fichier qui existe, mais les autorisations l'empêchent d'être lu. Si vous souhaitez détecter de tels cas, ce qui suit fonctionnera:

:if !empty(glob("path/to/file"))
:   echo "File exists."
:endif
Brianmearns
la source
Je reçois E116: Invalid arguments for function. Comment spécifiez-vous le fichier par rapport au répertoire personnel pour rechercher un plugin? (Voir aussi ici )
Scz
Parlez-vous du répertoire personnel de l'utilisateur? J'imagine juste un ~, mais je ne suis pas sûr. Quels arguments avez-vous fournis lorsque vous avez eu cette erreur?
brianmearns le
1
Je l'ai essayé avec ~, et cela a donné cette erreur. Maintenant, j'ai essayé à nouveau et ça marche ... :-)
Scz
1
Probablement juste une faute de frappe ou quelque chose comme ça. Mais heureux que cela ait fonctionné pour vous!
brianmearns le
Contrairement à l'autre réponse, cela semble également fonctionner pour les répertoires.
Brian McCutchon
12

Donner un peu plus de visibilité au commentaire de la métaphy sur la réponse acceptée:

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

filereadableest ce qui est requis, mais il y a une étape très pratique de expand, si vous utilisez ~dans votre chemin:

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

Par exemple

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