Jak sprawdzić, czy określony plik istnieje w Vimscript?

105

Szukam eleganckiego sposobu w Vimscript, aby sprawdzić, czy plik istnieje w bieżącym katalogu.

Wymyśliłem kod poniżej, ale nie jestem pewien, czy jest to najbardziej eleganckie rozwiązanie (ustawię opcję Vima, jeśli plik istnieje). Czy jest jakiś sposób, aby nie musieć robić kolejnego porównania nazwy pliku?

Może użyć innej wbudowanej funkcji niż Vim?

:function! SomeCheck()
:   if findfile("SpecificFile", ".") == "SpecificFile"
:       echo "SpecificFile exists"
:   endif
:endfunction
stefanB
źródło

Odpowiedzi:

138

Po krótkich poszukiwaniach vim manznalazłem to, które wygląda znacznie lepiej niż oryginał:

:function! SomeCheck()
:   if filereadable("SpecificFile")
:       echo "SpecificFile exists"
:   endif
:endfunction
stefanB
źródło
4
Co się stanie, jeśli plik SpecificFile istnieje, ale nie jest czytelny dla bieżącego użytkownika. Może znajdź plik jest lepszy.
ppan
2
Pomoc do filereadablewzmianek, z których możesz skorzystać, globjeśli nie zależy Ci na czytelności.
Sumudu Fernando
8
if filereadable (expand ("~ / .vim / bundle / vundle / README.md")) let g: hasVundle = 1 endif
thinker3
@metaphy to doskonały komentarz, dodałem na tej podstawie odpowiedź , aby była bardziej widoczna, ale jeśli chcesz otrzymać kredyt, możesz dodać własną odpowiedź, a ja usunę swoją.
icc97
56

Niektóre komentarze wyrażają zaniepokojenie filereadablei używanie globzamiast tego. Rozwiązuje to problem posiadania pliku, który istnieje, ale uprawnienia uniemożliwiają jego odczyt. Jeśli chcesz wykryć takie przypadki, zadziała:

:if !empty(glob("path/to/file"))
:   echo "File exists."
:endif
brianmearns
źródło
Rozumiem E116: Invalid arguments for function. Jak określić plik względem katalogu domowego, aby sprawdzić, czy jest wtyczka? (Zobacz także tutaj )
Scz
Czy mówisz o katalogu domowym użytkownika? Myślę, że tylko a ~, ale nie jestem pewien . Jakie argumenty podałeś, kiedy pojawił się ten błąd?
brianmearns
1
Próbowałem z tym ~i dał ten błąd. Teraz spróbowałem ponownie i działa ... :-)
Scz
1
Prawdopodobnie tylko literówka czy coś. Ale cieszę się, że to zadziałało!
brianmearns
W przeciwieństwie do drugiej odpowiedzi wydaje się, że działa to również w przypadku katalogów.
Brian McCutchon
12

Dając trochę więcej widoczności komentarzowi metafii na temat zaakceptowanej odpowiedzi:

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

filereadablejest to, co jest wymagane, ale jest dodatkowy przydatny krok expand, jeśli powinieneś używać ~na swojej ścieżce:

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

Na przykład

  • :echo filereadable('~/.vimrc')daje 0,
  • :echo filereadable(expand('~/.vimrc')) daje 1
icc97
źródło