Eklentileri nasıl test edebilir ve yalnızca .vimrc'de varsa ekleyebilirim?


14

Benim başarıyla yüklü varsayım altında bununla ilgili bazı komutları .vimrckullanmak ftpluginve kullanmak için çalışıyorum . Ancak, şimdi eklentisi yüklü olmayan birkaç eski makine ile karşılaştım. Bir şekilde bu eklentinin yüklenmesini koşullu yapabilir ve filetype onaynı koşullu bloğa benzer yönergeler ekleyebilir miyim ?

Renk şemaları ve Vim sürümü için koşullar olduğunu gördüm, ancak eklentiyi kontrol edecek bir örnek görmedim (veya tanımadı).

Dikkat: Nazik ol, ben bir VimScript acemisiyim.


1
Eklentilerin ~/.vimrcsizden sonra yüklendiğini unutmayın , bu nedenle ~/.vimrceklenti dosyasının varlığını test etmedikçe veya eklentiler gibi bir otomatik komutla yüklenene kadar testi erteledikçe, bir eklentinin etkilerini test edemezsiniz. VimEnter.
garyjohn

@garyjohn: aha, bu ilginç. Çünkü bu tür mevcut cevapla çelişiyor. Cevap olarak yazabilir misiniz?
0xC0000022L

Cevabımı bu konuyu biraz ele almak için düzenledim.
qqx

Yorumum qqx'in cevabı ile çelişmedi; qqx'ın cevabını dikkatlice okumadıysa veya yanlış çıkarımlarda bulunmamışsa, gözden kaçırılabilecek bir noktaya dikkat çekmek gerekiyordu. Cevap başlangıçta iyi ve şimdi daha da net.
garyjohn

Yanıtlar:


20

Bu bloğu exists(), eklenti tarafından tanımlanan bir değişken, komut veya işlevin vim tarafından bilinip bilinmediğini kontrol etmek için işlevi kullanan bir koşulda sarabilirsiniz .

İşte ~ / .vim altındaki dosyalarda bulunan birkaç bit:

" 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

Yukarıdaki bitlerin normal eklentilerden sonra değerlendirilen dosyalarda, burada bir ftplugin ve after/plugindizindeki bir dosyada olduğunu unutmayın .

Başka bir seçenek, en azından vim 7.0 gerektirmesine rağmen, try / catch bloklarını kullanmak olacaktır:

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

tryBu bloğun bölümündeki bir şey başarısız olduğunda catchbölüme atlar . Yana catchbölümü boş, o hemen sonra başlatma dosyanın geri kalanı ile devam edecek endtryaçıklamada.

Bu, zaten yüklenmiş olan bir eklentiye güvenmek yerine kodu manuel olarak yüklediğinden, bu .vimrc dosyasının kendisinde yapılabilir.


8

Tercih ettiğim yöntem sadece eklenti dosyasının varlığını kontrol etmektir. Bunu daha basit buluyorum.

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

Kulağa makul geliyor, ama temel yol nedir? Otomatik olarak Vim evi mi (yani genellikle ~/.vim)?
0xC0000022L

.Vimrc yapılandırmanıza ve paket yönetimi tercihlerinize bağlıdır. Bunu yaparım:if filereadable($HOME."/.vim/plugins.vim") source ${HOME}/.vim/plugins.vim endif
user3751385

teşekkürler, harika. Verdiklerinizin ima ettiği bazı temel yollar olduğu konusunda endişeliydim.
0xC0000022L

4

Bunu .vimrcbir dizi after/dizin yerine Vim yapılandırmamı bir arada tutarken başarmak istedim . Bu benim geldiğim çözüm:

  1. Sağladığı herhangi bir komutu kontrol ederek her eklentinin varlığını kontrol edin exists()ve varsa seçeneklerini ayarlayın. (Bu, kabul edilen cevaptaki gibidir.)

  2. Yukarıdaki şekilde ayarlanan tüm seçenekleri bir fonksiyonun içine koy ( SetPluginOptionsNow()benim kodumda denir ).

  3. Bu işlevi çağırın VimEnter, en önemlisi ama - Yeni Vim oturumu girerken tetiklenir olay, sonra Eklentileri tüm yüklendi. Bu nedenle, exists()kontrollerimiz eklenti işlevlerini sorunsuz bir şekilde kontrol edebilir.

İşte o bölümden bir örnek .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

bu cevap vim-airline ile pek hoş değil. Özellikle, VimEnter olayı gibi şeyleri belirtmek için beklemek airline_themebir sürü hataya neden oluyor gibi görünüyor ... Neden olduğundan emin değilim.
StevieP

3

Başka bir alternatif de :silent! {cmd}, {cmd}mevcut olmadığında hatayı baskılayan başka bir alternatif kullanmaktır . Ana faydası, kısa bir tek komut olmasıdır. Bu, Vim 6'da bile çalışır ve isteğe bağlı şeyler için mükemmeldir.

Örneğin, eşlemeleri tekrarlanabilir hale getirmek için Tim Pope's repeat.vim kullanan eklentiler tarafından kullanılır .


Öyle :silent!değil !silentve :unsilentiçerideki bir yerde ne zaman kullanıldığı dışında tüm içerilen komutlar için geçerlidir . (Ama bu nadirdir.)
Ingo Karkat

2

Başlangıçta başka bir soruya gönderildi: /programming//a/48178537/2843583

Alternatif olarak, eldeki eklentinin sizin içinizde olup olmadığına karar vermek için bir regexp kullanabilirsiniz runtimepath:

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

Bunun avantajı, autoloaddizinde yalnızca vimscript koduna sahip eklentilerle çalışmasıdır; bu da, otomatik yükleme snippet'leri bir işlev çağrısı sırasında yüklendiğinden .vimrc başlangıçta ayrıştırıldığında algılanamaz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.