Як визначити, чи існує певний файл у 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 існує, але не читається для поточного користувача. Можливо, файл пошуку краще.
ppan

2
Довідка для filereadableзгадок, яку ви можете використовувати, globякщо вам не важливо читати.
Сумуду Фернандо

8
якщо файл читається (розширити ("~ / .vim / bundle / vundle / README.md")) нехай g: hasVundle = 1 endif
thinker3

@metaphy це чудовий коментар, я додав відповідь на основі цього, щоб забезпечити йому більшу видимість, але якщо ви хочете, щоб кредит не соромтесь, додайте власну відповідь, і я видалю свою.
icc97

56

Деякі коментарі висловлюють занепокоєння щодо filereadableвикористання та globзамість цього. Це вирішує проблему наявності файлу, який існує, але дозволи не дозволяють його читати. Якщо ви хочете виявити такі випадки, буде працювати наступне:

:if !empty(glob("path/to/file"))
:   echo "File exists."
:endif

Я отримую E116: Invalid arguments for function. Як вказати файл відносно домашнього каталогу, щоб перевірити наявність плагіна? (Дивіться також тут )
Scz

Ви говорите про домашній каталог користувача? Я б здогадався просто ~, але я не позитивний. Які аргументи ви наводили, коли отримали цю помилку?
brianmearns

1
Я спробував це ~, і це дало цю помилку. Тепер я спробував ще раз, і це працює ... :-)
Ск

1
Напевно, просто помилка друку чи щось таке. Але радий, що це працювало на тебе!
brianmearns

На відміну від іншої відповіді, це, здається, працює і для каталогів.
Брайан МакКучон

12

Надання додаткової наочності коментарям метафії щодо прийнятої відповіді:

якщо файл читається (розширити ("~ / .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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.