¿Cómo detectar si existe un archivo específico en Vimscript?

105

Estoy buscando una forma elegante en Vimscript de verificar si existe un archivo en el directorio actual.

Se me ocurrió el código a continuación, pero no estoy seguro de si esa es la solución más elegante (estableceré una opción de Vim si el archivo existe). ¿Hay alguna forma de no tener que hacer otra comparación del nombre del archivo?

¿Quizás usar una función incorporada diferente de Vim?

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

Respuestas:

138

Con un poco de búsqueda vim man, encontré esto, que se ve mucho mejor que el original:

:function! SomeCheck()
:   if filereadable("SpecificFile")
:       echo "SpecificFile exists"
:   endif
:endfunction
StefanB
fuente
4
¿Qué pasa si SpecificFile existe, pero no es legible para el usuario actual? Quizás findfile sea mejor.
ppan
2
La ayuda para las filereadablemenciones que puede utilizar globsi no le importa la legibilidad.
Sumudu Fernando
8
if filereadable (expand ("~ / .vim / bundle / vundle / README.md")) let g: hasVundle = 1 endif
thinker3
@metaphy es un comentario excelente, agregué una respuesta basada en eso para darle más visibilidad, pero si quieres el crédito, siéntete libre de agregar tu propia respuesta y eliminaré la mía.
icc97
56

Algunos de los comentarios expresan preocupaciones sobre el filereadableuso y en su globlugar. Esto soluciona el problema de tener un archivo que sí existe, pero los permisos impiden que se lea. Si desea detectar tales casos, lo siguiente funcionará:

:if !empty(glob("path/to/file"))
:   echo "File exists."
:endif
Brianmearns
fuente
Yo entiendo E116: Invalid arguments for function. ¿Cómo se especifica el archivo relativo al directorio de inicio para buscar un complemento? (Vea también aquí )
Scz
¿Estás hablando del directorio de inicio del usuario? Supongo que solo un ~, pero no estoy seguro. ¿Qué argumentos proporcionó cuando recibió ese error?
brianmearns
1
Lo probé con ~y dio ese error. Ahora lo intenté de nuevo y funciona ... :-)
Scz
1
Probablemente sea un error tipográfico o algo así. ¡Pero me alegro de que te haya funcionado!
brianmearns
A diferencia de la otra respuesta, esto también parece funcionar para directorios.
Brian McCutchon
12

Dando un poco más de visibilidad al comentario de la metafía sobre la respuesta aceptada:

si se puede leer el archivo (expand ("~ / .vim / bundle / vundle / README.md")) let g: hasVundle = 1 endif

filereadablees lo que se requiere, pero hay un paso útil adicional de expand, en caso de que esté usando ~en su camino:

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

Por ejemplo

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