Как определить, существует ли в Vimscript определенный файл?

105

Я ищу элегантный способ в Vimscript проверить, существует ли файл в текущем каталоге.

Я придумал приведенный ниже код, но не уверен, что это самое элегантное решение (я установлю параметр Vim, если файл существует). Есть ли способ избежать повторного сравнения имени файла?

Может быть, использовать другую встроенную функцию от Vim?

:function! SomeCheck()
:   if findfile("SpecificFile", ".") == "SpecificFile"
:       echo "SpecificFile exists"
:   endif
:endfunction
СтефанБ
источник

Ответы:

138

Немного поискав, vim manя нашел это, которое выглядит намного лучше оригинала:

:function! SomeCheck()
:   if filereadable("SpecificFile")
:       echo "SpecificFile exists"
:   endif
:endfunction
СтефанБ
источник
4
Что делать, если SpecificFile существует, но не доступен для чтения текущему пользователю. Может, findfile лучше.
ppan
2
Справку по filereadableупоминаниям можно использовать, globесли вас не волнует удобочитаемость.
Sumudu Fernando
8
если файл доступен для чтения (expand ("~ / .vim / bundle / vundle / README.md")) let g: hasVundle = 1 endif
thinker3
@metaphy, это отличный комментарий, я добавил ответ, основанный на этом, чтобы сделать его более заметным, но если вы хотите, чтобы кредит, не стесняйтесь, добавьте свой собственный ответ, и я удалю свой.
icc97 08
56

Некоторые комментарии выражают озабоченность по поводу filereadableиспользования globвместо этого. Это решает проблему наличия файла, который существует, но разрешения не позволяют его прочитать. Если вы хотите обнаружить такие случаи, сработает следующее:

:if !empty(glob("path/to/file"))
:   echo "File exists."
:endif
Brianmearns
источник
Я понимаю E116: Invalid arguments for function. Как указать файл относительно домашнего каталога для проверки наличия плагина? (См. Также здесь )
Scz
Вы говорите о домашнем каталоге пользователя? Я бы предположил ~, но я не уверен. Какие аргументы вы привели, когда получили эту ошибку?
brianmearns
1
Я попробовал ~, и он дал эту ошибку. Теперь я попробовал еще раз, и это работает ... :-)
Scz
1
Наверное, это просто опечатка или что-то в этом роде. Но рад, что это сработало для вас!
brianmearns
В отличие от другого ответа, это работает и для каталогов.
Брайан МакКатчон
12

Добавляем больше наглядности метафическому комментарию к принятому ответу:

если файл доступен для чтения (expand ("~ / .vim / bundle / vundle / README.md")), пусть g: hasVundle = 1 endif

filereadableэто то, что требуется, но есть дополнительный удобный шаг expand, если вы используете ~на своем пути:

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

Например

  • :echo filereadable('~/.vimrc')дает 0,
  • :echo filereadable(expand('~/.vimrc')) дает 1
icc97
источник