मैं प्लगइन्स के लिए कैसे परीक्षण कर सकता हूं और केवल उन्हें शामिल कर सकता हूं यदि वे .vimrc में मौजूद हैं?


14

अपने में .vimrcमैं ftpluginइस बात से संबंधित कुछ आदेशों का उपयोग करने और स्पष्ट रूप से उपयोग करने की कोशिश कर रहा हूं कि इस धारणा के तहत कि यह सफलतापूर्वक लोड किया गया था। हालाँकि, मुझे अब कुछ पुरानी मशीनों का सामना करना पड़ा है, जिनमें प्लगइन स्थापित नहीं है। क्या मैं किसी भी तरह से इस प्लगइन की लोडिंग को सशर्त बना सकता हूं filetype onऔर समान सशर्त ब्लॉक में समान निर्देशों को जोड़ सकता हूं ?

मैंने देखा है कि रंग योजनाओं और विम संस्करण के लिए शर्तें हैं, लेकिन मैंने एक उदाहरण नहीं देखा है जो प्लगइन के लिए जांच करेगा (या पहचान नहीं पाया था)।

NB: कोमल हो, मैं एक VimScript शुरुआत कर रहा हूँ।


1
ध्यान दें कि प्लगइन्स आपके बाद लोड किए गए हैं ~/.vimrc, इसलिए आप अपने भीतर एक प्लगइन के प्रभावों का परीक्षण करने में सक्षम नहीं होंगे ~/.vimrcजब तक कि आप प्लगइन फ़ाइल के अस्तित्व के लिए परीक्षण नहीं करते हैं या जब तक प्लगइन्स एक ऑटोकॉमैंड के साथ लोड नहीं किए जाते हैं तब तक परीक्षण को स्थगित कर दें जैसे कि VimEnter।
गैरीजॉन

@garyjohn: अहा, यह दिलचस्प है। क्योंकि इस तरह के विरोधाभास मौजूदा जवाब देता है। क्या आप इसे उत्तर के रूप में लिख सकते हैं?
0xC0000022L

मैंने उस मुद्दे पर कुछ हद तक अपना जवाब संपादित कर दिया है।
qxx

मेरी टिप्पणी qqx के उत्तर के विपरीत नहीं थी; यह एक ऐसे बिंदु पर ध्यान आकर्षित करने के लिए था जो किसी को qqx के उत्तर को ध्यान से न पढ़ने या उससे गलत निष्कर्ष निकालने पर छूट सकता था। उत्तर की शुरुआत अच्छी थी और अब भी स्पष्ट है।
garyjohn

जवाबों:


20

आप उस ब्लॉक को एक सशर्त में लपेट सकते हैं जो exists()यह जांचने के लिए फ़ंक्शन का उपयोग करता है कि क्या चर, कमांड या प्लगइन द्वारा परिभाषित फ़ंक्शन विम के लिए जाना जाता है।

यहाँ कुछ बिट्स हैं जो मेरे पास ~ / .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

ध्यान दें कि उपरोक्त बिट्स उन फाइलों में हैं, जिनका मूल्यांकन सामान्य प्लगइन्स के बाद किया जाता है, यहाँ एक ftplugin, और after/pluginडायरेक्टरी में एक फाइल है ।

एक अन्य विकल्प कोशिश / पकड़ने वाले ब्लॉक का उपयोग करना होगा, हालांकि इसके लिए कम से कम 7.0 की आवश्यकता होती है:

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

एक बार tryउस ब्लॉक के अनुभाग में कुछ विफल हो जाता है तो यह catchअनुभाग पर छोड़ देगा । चूंकि catchअनुभाग खाली है, यह सिर्फ endtryबयान के बाद प्रारंभिक फ़ाइल के शेष के साथ जारी रहेगा ।

चूंकि यह पहले से लोड किए जा रहे प्लगइन पर निर्भर होने के बजाय मैन्युअल रूप से कोड लोड कर रहा है, यह .vrc फ़ाइल में ही किया जा सकता है।


8

मेरा पसंदीदा तरीका प्लगइन फ़ाइल के अस्तित्व की जांच करना है। मुझे यह सरल लगता है।

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

उचित लगता है, लेकिन आधार पथ क्या है? क्या यह स्वतः विम घर (यानी आमतौर पर ~/.vim) है?
0xC0000022L

आपके .vimrc कॉन्फ़िगरेशन और आपके पैकेज प्रबंधन वरीयताओं पर निर्भर करता है। मैं यह करता हूँ:if filereadable($HOME."/.vim/plugins.vim") source ${HOME}/.vim/plugins.vim endif
user3751385

धन्यवाद, कमाल। मैं इस बात से अधिक चिंतित था कि आपके द्वारा दिए गए कुछ आधार मार्ग निहित हैं।
0xC0000022L

4

मैं निर्देशिका के .vimrcएक समूह के बजाय अपने विम कॉन्फ़िगरेशन को एक साथ रखते हुए इसे प्राप्त करना चाहता था after/। यह वह उपाय है जो मैं लेकर आया हूं:

  1. किसी भी एक कमांड के लिए चेक करके प्रत्येक प्लगइन के अस्तित्व की जांच करें exists(), जो मौजूद है और यदि मौजूद है तो उसके विकल्प सेट करें। (यह स्वीकृत उत्तर की तरह है।)

  2. एक फ़ंक्शन के भीतर उपरोक्त सभी तरीके सेट करें ( SetPluginOptionsNow()मेरे कोड में कहा जाता है)।

  3. इस फ़ंक्शन को उस VimEnterइवेंट पर कॉल करें , जिसे एक नए विम सत्र में प्रवेश करते समय ट्रिगर किया गया है - लेकिन निर्णायक रूप से, प्लगइन्स सभी लोड होने के बाद । इस तथ्य के कारण, हमारे exists()चेक एक समस्या के बिना प्लगइन फ़ंक्शन के लिए जांच कर सकते हैं।

यहाँ मेरे उस हिस्से से एक नमूना है .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

यह उत्तर विम-एयरलाइन के साथ अच्छा नहीं है। विशेष रूप से, चीजों को निर्दिष्ट करने के लिए विमनटर इवेंट की प्रतीक्षा करना, airline_themeत्रुटियों का एक समूह प्रेरित करने के लिए लगता है ... मुझे वास्तव में यकीन नहीं है कि क्यों।
स्टीव

3

फिर भी एक और विकल्प उपयोग कर रहा है :silent! {cmd}, जो {cmd}मौजूद नहीं होने पर त्रुटि को दबा देता है। मुख्य लाभ यह है कि यह एक छोटा एकल आदेश है। यह भी विम 6 में काम करता है, और वैकल्पिक सामान के लिए बहुत अच्छा है।

उदाहरण के लिए, इसका उपयोग प्लगइन्स द्वारा किया जाता है जो मैपिंग को दोहराने योग्य बनाने के लिए टिम पोप के रिपीट.विम का उपयोग करते हैं ।


यह :silent!, नहीं !silent, और यह जब को छोड़कर सभी निहित आदेशों पर लागू होता है, :unsilentकहीं न कहीं अंदर किया जाता है। (लेकिन यह दुर्लभ है।)
इंगो करकट

2

प्रारंभ में एक अन्य प्रश्न में पोस्ट किया गया: /programming//a/48178537/2843583

एक विकल्प के रूप में आप यह तय करने के लिए एक regexp का उपयोग कर सकते हैं कि क्या आपके हाथ में प्लगइन आपके में है runtimepath:

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

इसका यह फायदा है कि यह उन प्लगइन्स के साथ काम करता है जिनके पास autoloadनिर्देशिका में केवल विम्सस्क्रिप्ट कोड होता है , जो बदले में पता नहीं लगाया जा सकता है। एक फ़ंक्शन कॉल के समय ऑटोलैड स्निपेट्स लोड होने के बाद ।vimrc को शुरू में पार्स किया जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.