Bagaimana saya bisa menguji plugin dan hanya memasukkannya jika ada di .vimrc?


14

Di saya .vimrc Saya mencoba menggunakan ftplugin dan jelas menggunakan beberapa perintah yang berkaitan dengan itu dengan asumsi bahwa itu berhasil dimuat. Namun, saya sekarang menjumpai beberapa mesin lama yang tidak menginstal plugin. Bisakah saya membuat memuat plugin ini bersyarat dan menambahkan filetype on dan arahan serupa ke dalam blok bersyarat yang sama?

Saya telah melihat ada kondisi untuk skema warna dan versi Vim, tetapi saya belum melihat contoh yang akan memeriksa plugin (atau tidak mengenalinya).

NB: Bersikaplah lembut, saya seorang pemula VimScript.


1
Perhatikan bahwa plugin dimuat setelah Anda ~/.vimrc, jadi Anda tidak akan dapat menguji efek dari plugin di dalam Anda ~/.vimrc kecuali jika Anda menguji keberadaan file plugin atau menunda pengujian sampai setelah plugin dimuat dengan perintah otomatis seperti VimEnter.
garyjohn

@garyjohn: aha, itu menarik. Karena jenis ini bertentangan dengan jawaban yang ada. Bisakah Anda menuliskannya sebagai jawaban?
0xC0000022L

Saya telah mengedit jawaban saya untuk mengatasi masalah itu.
qqx

Komentar saya tidak bertentangan dengan jawaban qqx; itu dimaksudkan untuk menarik perhatian ke titik yang mungkin terlewatkan jika seseorang tidak membaca jawaban qqx dengan hati-hati atau membuat kesimpulan yang salah dari itu. Jawabannya bagus untuk memulai dan bahkan lebih jelas sekarang.
garyjohn

Jawaban:


18

Anda bisa membungkus blok itu dalam kondisi yang menggunakan exists() berfungsi untuk periksa apakah variabel, perintah atau fungsi yang ditentukan oleh plugin diketahui vim.

Berikut adalah beberapa bit yang saya miliki di file di bawah ~ / .vim:

" after/plugin/speeddating.vim
if exists(':SpeedDatingFormat')
    SpeedDatingFormat %-d %B %Y
endif

" ftplugin/ruby.vim
if exists('g:loaded_surround') && !exists('b:surround_'.char2nr(':'))
  let b:surround_{char2nr(':')} = ":\r"
endif

Perhatikan bahwa bit di atas ada dalam file yang dievaluasi setelah plugin normal, di sini sebuah ftplugin, dan sebuah file di after/plugin direktori.

Opsi lain adalah menggunakan blok coba / tangkap, meskipun ini membutuhkan pada paling tidak vim 7.0:

if v:version >= 700
    try
        runtime bundle/pathogen/autoload/pathogen.vim
        call pathogen#infect()
    catch
    endtry
endif

Sekali sesuatu di try bagian dari blok itu gagal itu akan melompat ke catch bagian. Sejak catch Bagian kosong, hanya akan melanjutkan dengan sisa file inisialisasi setelah endtry pernyataan.

Karena ini memuat kode secara manual daripada mengandalkan plugin sudah dimuat, ini bisa dilakukan di file .vimrc itu sendiri.


Bisakah Anda menambahkan persyaratan versi untuk try membangun? Akankah Vim lama mengerti ini? Yaitu. kapan diperkenalkan. Terima kasih dan +1 untuk sekarang.
0xC0000022L

1
Saya telah menambahkan informasi tentang versi yang diperlukan.
qqx

Saya pikir solusi terakhir dengan versi cek pembungkus try harus bekerja. Terima kasih banyak. Mari kita lihat apakah jawaban lain masih akan tiba. Kalau tidak, aku tentu saja akan menerima milikmu.
0xC0000022L

ah, tentu saja ini menonaktifkan plugin pada versi 6.x. Hmmm ... perlu menemukan sesuatu yang lebih baik, tetapi ini akan bekerja sementara itu. Terima kasih.
0xC0000022L

Namun alternatif lain adalah menggunakan :silent! {cmd}, yang menekan kesalahan saat {cmd} tidak ada. Ini bahkan berfungsi di Vim 6.
Ingo Karkat

7

Metode pilihan saya adalah hanya untuk memeriksa keberadaan file plugin. Saya menemukan ini lebih sederhana.

if !empty(glob("path/to/plugin.vim"))
   echo "File exists."
endif

3

Namun alternatif lain adalah menggunakan :silent! {cmd}, yang menekan kesalahan saat {cmd} tidak ada. Manfaat utama adalah bahwa itu perintah tunggal yang singkat. Ini bahkan berfungsi di Vim 6, dan sangat bagus untuk hal-hal opsional.

Misalnya, digunakan oleh plugin yang menggunakan Tim Pope's repeat.vim untuk membuat pemetaan berulang.


Mau sesuatu seperti !silent runtime ftplugin/man.vim | filetype on | filetype plugin on | filetype indent on berfungsi untuk menutup semua perintah berikut !silent atau apakah itu selalu spesifik untuk perintah selanjutnya?
0xC0000022L

Nya :silent!tidak !silent, dan itu berlaku untuk semua perintah yang terkandung, kecuali untuk kapan :unsilent digunakan di suatu tempat di dalam. (Tapi itu jarang terjadi.)
Ingo Karkat

Ups, sulit diperbaiki sekarang di komentar. Tapi paham. Terima kasih.
0xC0000022L

3

Saya ingin mencapai ini sambil menjaga konfigurasi Vim saya bersama dalam .vimrc, daripada dalam banyak after/ direktori. Ini adalah solusi yang saya buat:

  1. Periksa keberadaan setiap plugin dengan memeriksa perintah tunggal yang disediakannya exists(), dan atur opsinya jika memang ada. (Ini seperti dalam jawaban yang diterima.)

  2. Masukkan semua opsi yang diatur dengan cara di atas dalam suatu fungsi (disebut SetPluginOptionsNow() dalam kode saya).

  3. Panggil fungsi ini di VimEnter acara, yang dipicu saat memasuki sesi Vim baru - tetapi yang terpenting, setelah semua plugin telah dimuat. Karena kenyataan ini, kami exists() cek dapat memeriksa fungsi plugin tanpa masalah.

Ini contoh dari bagian saya .vimrc.

""" PLUGIN-SPECIFIC OPTIONS
" These are "supposed to be" set in after/plugin directory, but then
" cross-platform synchronization would get even messier. So, au VimEnter it is. 

function! SetPluginOptionsNow()


    " NERDTree Options
    if exists(":NERDTree")
        map <F10> :NERDTreeToggle<CR>
    endif

    " Syntastic Options
    if exists(":SyntasticCheck")
        let g:syntastic_stl_format = '[Syntax: line:%F (%e+%w)]'
        set statusline+=%#warningmsg#
        set statusline+=%{SyntasticStatuslineFlag()}
        set statusline+=%*
        " and so on...

endfunction

au VimEnter * call SetPluginOptionsNow()
""" END OF PLUGIN-SPECIFIC OPTIONS

jawaban ini tidak cocok dengan vim-airline. Secara khusus, menunggu acara VimEnter untuk menentukan hal-hal seperti airline_theme tampaknya menyebabkan banyak kesalahan ... Saya tidak begitu yakin mengapa.
StevieP

0

Awalnya diposting di pertanyaan lain: https://stackoverflow.com/a/48178537/2843583

Sama seperti alternatif Anda juga dapat menggunakan regexp untuk memutuskan apakah plugin yang ada di tangan Anda runtimepath:

if &rtp =~ 'plugin-name'
    ...
endif

Ini memiliki keuntungan karena berfungsi dengan plugin yang hanya memiliki kode vimscript di autoload direktori, yang pada gilirannya tidak dapat dideteksi ketika .vimrc awalnya diuraikan sejak potongan autoload dimuat pada saat pemanggilan fungsi.

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.