Come rilevare se un file specifico esiste in Vimscript?


105

Sto cercando un modo elegante in Vimscript per verificare se esiste un file nella directory corrente.

Ho inventato il codice qui sotto ma non sono sicuro che sia la soluzione più elegante (imposterò un'opzione Vim se il file esiste). C'è un modo per non dover fare un altro confronto del nome del file?

Forse utilizzare una funzione incorporata diversa da Vim?

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

Risposte:


138

Con un po 'di ricerca vim manho trovato questo, che sembra molto meglio dell'originale:

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

4
Cosa succede se SpecificFile esiste, ma non è leggibile per l'utente corrente. Forse findfile è migliore.
ppan

2
L'aiuto per le filereadablemenzioni puoi usare globse non ti interessa la leggibilità.
Sumudu Fernando

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

@metaphy è un commento eccellente, ho aggiunto una risposta basata su questo per dargli maggiore visibilità, ma se vuoi il merito sentiti libero di aggiungere la tua risposta e io cancellerò la mia.
ICC97

56

Alcuni commenti esprimono preoccupazione filereadablee utilizzo globinvece. Ciò risolve il problema di avere un file che esiste, ma le autorizzazioni ne impediscono la lettura. Se desideri rilevare tali casi, funzionerà quanto segue:

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

Capisco E116: Invalid arguments for function. Come si specifica il file relativo alla directory home per verificare la presenza di un plugin? (Vedi anche qui )
Scz

Stai parlando della home directory dell'utente? Immagino solo un ~, ma non sono positivo. Quali argomenti hai fornito quando hai ricevuto quell'errore?
brianmearns

1
L'ho provato con ~e ha dato quell'errore. Ora ho riprovato e funziona ... :-)
Scz

1
Probabilmente solo un errore di battitura o qualcosa del genere. Ma sono contento che abbia funzionato per te!
brianmearns

A differenza dell'altra risposta, questo sembra funzionare anche per le directory.
Brian McCutchon

12

Dando un po 'più di visibilità al commento di metaphy sulla risposta accettata:

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

filereadableè ciò che è richiesto, ma c'è un passaggio extra utile di expand, se utilizzi ~nel tuo percorso:

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

Per esempio

  • :echo filereadable('~/.vimrc')0,
  • :echo filereadable(expand('~/.vimrc'))1
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.