Wie erkenne ich, ob eine bestimmte Datei in Vimscript vorhanden ist?

105

Ich suche nach einer eleganten Möglichkeit in Vimscript, um zu überprüfen, ob eine Datei im aktuellen Verzeichnis vorhanden ist.

Ich habe mir den folgenden Code ausgedacht, bin mir aber nicht sicher, ob dies die eleganteste Lösung ist (ich werde eine Vim-Option festlegen, wenn die Datei vorhanden ist). Gibt es eine Möglichkeit, den Dateinamen nicht erneut vergleichen zu müssen?

Verwenden Sie möglicherweise eine andere integrierte Funktion als Vim?

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

Antworten:

138

Mit ein wenig Suchen vim manhabe ich Folgendes gefunden, das viel besser aussieht als das Original:

:function! SomeCheck()
:   if filereadable("SpecificFile")
:       echo "SpecificFile exists"
:   endif
:endfunction
stefanB
quelle
4
Was ist, wenn SpecificFile vorhanden ist, aber für den aktuellen Benutzer nicht lesbar ist? Vielleicht ist findfile besser.
ppan
2
Die Hilfe für filereadableErwähnungen, die Sie verwenden können, globwenn Sie sich nicht um die Lesbarkeit kümmern.
Sumudu Fernando
8
wenn filereadable (erweitern ("~ / .vim / bundle / vundle / README.md")) lassen Sie g: hasVundle = 1 endif
thinker3
@metaphy, das ist ein ausgezeichneter Kommentar. Ich habe eine darauf basierende Antwort hinzugefügt , um die Sichtbarkeit zu verbessern. Wenn Sie jedoch möchten, dass das Guthaben verwendet wird, können Sie Ihre eigene Antwort hinzufügen, und ich werde meine löschen.
icc97
56

Einige der Kommentare äußern Bedenken hinsichtlich filereadableund Verwendung globstattdessen. Dies behebt das Problem, dass eine Datei vorhanden ist, aber Berechtigungen verhindern, dass sie gelesen wird. Wenn Sie solche Fälle erkennen möchten, funktioniert Folgendes:

:if !empty(glob("path/to/file"))
:   echo "File exists."
:endif
brianmearns
quelle
Ich verstehe E116: Invalid arguments for function. Wie geben Sie die Datei relativ zum Home-Verzeichnis an, um nach einem Plugin zu suchen? (Siehe auch hier )
Scz
Sprechen Sie über das Home-Verzeichnis des Benutzers? Ich würde nur a raten ~, aber ich bin nicht positiv. Welche Argumente haben Sie geliefert, als Sie diesen Fehler erhielten?
Brianmearns
1
Ich habe es mit ~versucht und es gab diesen Fehler. Jetzt habe ich es nochmal versucht und es funktioniert ... :-)
Scz
1
Wahrscheinlich nur ein Tippfehler oder so. Aber froh, dass es bei dir funktioniert hat!
Brianmearns
Im Gegensatz zur anderen Antwort scheint dies auch für Verzeichnisse zu funktionieren.
Brian McCutchon
12

Metaphys Kommentar zur akzeptierten Antwort etwas sichtbarer machen :

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

filereadableist erforderlich, aber es gibt einen besonders praktischen Schritt expand, falls Sie ihn ~auf Ihrem Weg verwenden sollten:

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

Beispielsweise

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