Làm thế nào để phát hiện nếu một tệp cụ thể tồn tại trong Vimscript?


105

Tôi đang tìm một cách thanh lịch trong Vimscript để kiểm tra xem tệp có tồn tại trong thư mục hiện tại hay không.

Tôi đã nghĩ ra đoạn mã dưới đây nhưng không chắc đó có phải là giải pháp thanh lịch nhất hay không (Tôi sẽ đặt tùy chọn Vim nếu tệp tồn tại). Có cách nào để không phải so sánh tên tệp khác không?

Có thể sử dụng một chức năng tích hợp sẵn khác với Vim?

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

Câu trả lời:


138

Với một chút tìm kiếm, vim mantôi đã tìm thấy cái này, cái này trông đẹp hơn nhiều so với bản gốc:

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

4
Điều gì sẽ xảy ra nếu SpecificFile tồn tại, nhưng không thể đọc được đối với người dùng hiện tại. Có lẽ findfile sẽ tốt hơn.
ppan

2
Trợ giúp cho các filereadableđề cập bạn có thể sử dụng globnếu bạn không quan tâm đến khả năng đọc.
Sumudu Fernando

8
nếu tệp có thể đọc được (mở rộng ("~ / .vim / pack / vundle / README.md")) let g: hasVundle = 1 endif
thinker3

@metaphy đó là một nhận xét tuyệt vời, tôi đã thêm một câu trả lời dựa trên đó để cung cấp cho nó nhiều khả năng hiển thị hơn, nhưng nếu bạn muốn tín dụng, hãy thêm câu trả lời của riêng bạn và tôi sẽ xóa của mình.
icc97,

56

Một số ý kiến ​​bày tỏ quan ngại về việc filereadablesử dụng globthay thế. Điều này giải quyết vấn đề có một tệp tồn tại, nhưng các quyền ngăn không cho nó được đọc. Nếu bạn muốn phát hiện những trường hợp như vậy, cách sau sẽ hoạt động:

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

Tôi hiểu E116: Invalid arguments for function. Làm cách nào để bạn chỉ định tệp liên quan đến thư mục chính để kiểm tra một plugin? (Xem thêm tại đây )
Scz

Bạn đang nói về thư mục chính của người dùng? Tôi sẽ đoán chỉ là một ~, nhưng tôi không tích cực. Bạn đã cung cấp đối số nào khi gặp lỗi đó?
brianmearns

1
Tôi đã thử nó với ~, và nó đã đưa ra lỗi đó. Bây giờ tôi đã thử lại và nó hoạt động ... :-)
Scz

1
Có lẽ chỉ là một lỗi đánh máy hoặc một cái gì đó. Nhưng rất vui vì nó đã làm việc cho bạn!
brianmearns

Không giống như câu trả lời khác, điều này dường như cũng hoạt động cho các thư mục.
Brian McCutchon

12

Cung cấp thêm một số khả năng hiển thị cho nhận xét của siêu hình về câu trả lời được chấp nhận:

nếu tệp có thể đọc được (mở rộng ("~ / .vim / pack / vundle / README.md")) let g: hasVundle = 1 endif

filereadablelà những gì bắt buộc, nhưng có một bước bổ sung hữu ích expand, nếu bạn đang sử dụng ~trong đường dẫn của mình:

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

Ví dụ

  • :echo filereadable('~/.vimrc')cho 0,
  • :echo filereadable(expand('~/.vimrc')) cho 1
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.