Bagaimana cara mendeteksi jika file tertentu ada di Vimscript?


105

Saya mencari cara yang elegan di Vimscript untuk memeriksa apakah file ada di direktori saat ini.

Saya datang dengan kode di bawah ini tetapi saya tidak yakin apakah itu solusi yang paling elegan (saya akan menetapkan opsi Vim jika file tersebut ada). Adakah cara agar tidak perlu membandingkan nama file lagi?

Mungkin menggunakan fungsi bawaan yang berbeda dari Vim?

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

Jawaban:


138

Dengan sedikit pencarian di vim mansaya telah menemukan ini, yang terlihat jauh lebih baik dari aslinya:

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

4
Bagaimana jika SpecificFile ada, tetapi tidak dapat dibaca oleh pengguna saat ini. Mungkin findfile lebih baik.
ppan

2
Bantuan untuk filereadablemenyebutkan dapat Anda gunakan globjika Anda tidak peduli dengan keterbacaan.
Sumudu Fernando

8
jika filereadable (perluas ("~ / .vim / bundle / vundle / README.md")) biarkan g: hasVundle = 1 endif
thinker3

@metaphy itu adalah komentar yang luar biasa, saya telah menambahkan jawaban berdasarkan itu untuk memberikan lebih banyak visibilitas, tetapi jika Anda ingin kredit, silakan tambahkan jawaban Anda sendiri dan saya akan menghapus milik saya.
icc97

56

Beberapa komentar mengungkapkan kekhawatiran tentang filereadabledan globsebagai gantinya. Ini mengatasi masalah memiliki file yang memang ada, tetapi izin mencegahnya untuk dibaca. Jika Anda ingin mendeteksi kasus seperti itu, berikut ini akan berfungsi:

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

Saya mengerti E116: Invalid arguments for function. Bagaimana Anda menentukan file relatif terhadap direktori home untuk memeriksa plugin? (Lihat juga di sini )
Scz

Apakah Anda berbicara tentang direktori home pengguna? Saya hanya akan menebak ~, tapi saya tidak yakin. Argumen apa yang Anda berikan ketika Anda mendapatkan kesalahan itu?
Brianmearns

1
Saya mencobanya dengan ~, dan itu memberikan kesalahan itu. Sekarang saya mencoba lagi dan berhasil ... :-)
Scz

1
Mungkin hanya salah ketik atau semacamnya. Tapi senang itu berhasil untuk Anda!
Brianmearns

Berbeda dengan jawaban lain, ini tampaknya berfungsi untuk direktori juga.
Brian McCutchon

12

Memberi lebih banyak visibilitas untuk komentar metaphy pada jawaban yang diterima:

jika file dapat dibaca (luaskan ("~ / .vim / bundle / vundle / README.md")) biarkan g: hasVundle = 1 endif

filereadableadalah apa yang diperlukan, tetapi ada langkah praktis ekstra expand, jika Anda menggunakan ~di jalur Anda:

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

Sebagai contoh

  • :echo filereadable('~/.vimrc')memberi 0,
  • :echo filereadable(expand('~/.vimrc')) memberi 1
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.