विम स्निपेट्स प्लगइन्स में क्या अंतर है?


25

विम के लिए स्निपेट्स प्लगइन्स की एक बड़ी संख्या है: अल्टिसनीप्स , स्निपमेट , xptemplate , neosnippet और बहुत कुछ।

उन सभी के पास पेशेवरों और विपक्ष हैं और अधिक या कम निर्भरता है। अब तक मैं अल्टिसनिप्स का उपयोग कर रहा हूं लेकिन कभी भी इससे पूरी तरह संतुष्ट नहीं हुआ हूं।

जैसा कि हमारे पास प्लगइन प्रबंधकों के बारे में एक बहुत ही रोचक और पूर्ण प्रश्न है, मुझे लगता है कि स्निपेट्स प्लगइन्स के बारे में उसी तरह के स्पष्टीकरण के लिए यह बहुत उपयोगी होगा।

यहां एक सूची है, जो एक अच्छी शुरुआत हो सकती है लेकिन कुछ पूर्ण, स्पष्ट और संक्षिप्त उत्तर के रूप में हमारे समुदाय लिख सकते हैं बहुत उपयोगी होगा।


1
आपके पास यह मैट्रिक्स मार्क वेबर विकी पर भी उपलब्ध है: vim-wiki.mawercer.de/wiki/topic/…
Luc Hermitte

2
IMHO यह काफी सामान्य है, शायद अगर आप "कभी भी इससे पूरी तरह संतुष्ट नहीं हुए हैं"? मैं Shougo के "neosnippet.vim" का उपयोग करता हूं।
वैनलेसर

आपको यहां से जानकारी के साथ विकी को अपडेट करना चाहिए। धन्यवाद।
क्रिश्चियन ब्रेबांट

@ChristianBrabandt: जैसे ही मेरे पास कुछ समय होगा (अगले कुछ दिनों में) मैं इसे अपडेट करूंगा।
statox

जवाबों:


22

मैं कई हफ्तों से अल्टिसनिप्स का उपयोग कर रहा हूं ।

मुझे लगता है कि इस प्लगइन के मुख्य लाभ निम्नलिखित हैं:

  • यह बहुत तेजी से उपलब्ध स्निपेट्स की एक बड़ी संख्या के साथ भी है।
  • एक नए स्निपेट को परिभाषित करने के लिए मूल सिंटैक्स समझना आसान है, इस प्रकार एक नया स्निपेट बनाने में आसान है जो आप करना चाहते हैं। (अधिक जटिल स्निपेट के लिए कुछ अतिरिक्त काम की आवश्यकता हो सकती है।)
  • यह बॉक्स से बहुत अच्छी तरह से काम करता है; एक बुनियादी विन्यास आपको बहुत जल्दी स्निपेट्स का उपयोग करने की अनुमति देता है।
  • यह वास्तव में विन्यास योग्य है। यहां तक ​​कि अगर बुनियादी विन्यास अच्छी तरह से काम करता है, अगर आप एक शक्ति उपयोगकर्ता हैं तो आप वास्तव में इसे बहुत सूक्ष्म रूप से ट्यून कर सकते हैं।

सबसे पहले अल्टिसनिप्स एक स्निपेट इंजन है जिसका अर्थ है कि प्लगइन स्निपेट का उपयोग करने के लिए सुविधाएँ प्रदान करता है लेकिन स्निपेट स्वयं प्रदान नहीं करता है। स्निपेट्स प्राप्त करने के लिए, लेखक विम-स्निपेट्स की सिफारिश करता है ।

एक बार जब आप दोनों प्लगइन्स स्थापित कर लेते हैं तो आप अपने स्निपेट्स का उपयोग कर पाएंगे।

स्निपेट: 'परिभाषा पैटर्न निम्नलिखित नामित फाइलों में जमा हो जाती है ft.snippets, ft_*.snippetsया ft/*, जहां ftवर्तमान दस्तावेज़ की फ़ाइल प्रकार' है 'और *एक खोल की तरह वाइल्डकार्ड मिलान किसी भी रिक्त स्ट्रिंग सहित स्ट्रिंग है। (ध्यान दें कि बिंदीदार फ़िलिप सिंटैक्स की तरह cuda.cppसमर्थित है।)

इस तरह से एक फ़िलाटाइप के लिए विशिष्ट स्निपेट का विस्तार केवल तब किया जाता है जब बफ़र का फ़िलिप सेट किया जाता है। allसभी बफ़र्स पर विस्तारित स्निपेट्स बनाने के लिए एक विशेष फ़िलाटाइप उपलब्ध है।

विम-स्निपेट द्वारा प्रदान किए गए स्निपेट्स के अलावा, उपयोगकर्ता अपने स्वयं के स्निपेट को परिभाषित कर सकता है। मेरी सिफारिश उन्हें ~/.vim/my-snippets/Ultisnipsइस तरह से निर्देशिका में जगह देने की होगी कि अल्टिसनिप्स उन्हें अतिरिक्त कॉन्फ़िगरेशन के बिना मिल जाएगा और उन्हें डॉटफ़ाइल रिपॉजिटरी में बनाए रखना आसान है।

स्निपेट्स का विस्तार करने के लिए, अल्टिसनिप्स एक चर प्रदान g:UltiSnipsExpandTrigger करता है जो मैपिंग को परिभाषित करता है जो विस्तार को ट्रिगर करेगा (मैंने चुना **जो मेरे लिए बहुत सुविधाजनक है)। ध्यान दें कि एक एकीकरण संभव होना चाहिए लेकिन मैंने इसे खुद से परीक्षण नहीं किया)।

पावर उपयोगकर्ताओं के लिए, अल्टिसनिप्स विस्तार के व्यवहार को अनुकूलित करने के लिए, या इसे अलग तरीके से ट्रिगर करने के लिए कुछ फ़ंक्शन प्रदान करता है। देख:h UltiSnips-trigger-functions


यह पहला स्निपेट प्रबंधक है जिसे मैंने वास्तव में बड़े पैमाने पर उपयोग किया है और मुझे लगता है कि यह एक अच्छा है जिसकी शुरुआत बॉक्स के बाहर इसकी सादगी और ट्यून होने की संभावना के साथ होगी।

अंत में यहाँ कुछ नामों की सूची दी गई है जो प्लगइन का अच्छा परिचय देते हैं:


क्या आप जानते हैं कि इसे कैसे बनाया जाता है ताकि जब इसका व्हाट्सएप द्वारा पूर्व या जब तक >HTML के बंद होने के कारण ट्रिगर न हो जाए तो इसका विस्तार न हो । यह एक टैग के अंत में पता नहीं है कि यह कष्टप्रद है, क्योंकि यदि आप इसे सक्षम करते हैं। विकल्प iतो यह इसे बनाता है इसलिए यह इसे विस्तारित करता है भले ही इसके शब्द के बीच में जो अच्छा नहीं है।
टैल्बॉय

13

मैं मूल स्निपमेट का उपयोग कर रहा हूं क्योंकि मैंने विम का उपयोग शुरू कर दिया है।

  • इसमें बाहरी निर्भरता नहीं है।
  • यह एक बहुत ही सरल वाक्यविन्यास का उपयोग करता है।
  • इसे स्थापित करना बहुत आसान है।
  • 2009 से इसे छोड़ दिया गया है।

मुझे कोई शिकायत नहीं है।


16
मैंने पहली बार किसी को एक सुविधा के रूप में परित्याग का उल्लेख करते देखा है। : डी
मूरू

6
एक परित्यक्त परियोजना एक स्थिर परियोजना है। आपको अपने स्थानीय उदाहरण के बारे में चिंता करने की ज़रूरत नहीं है या एक एपीआई बदलाव के साथ अपने वर्कफ़्लो को तोड़ने वाले अपडेट के बारे में। यदि आपने इसे स्थापित करते समय अपनी आवश्यकताओं को पूरा किया, तो यह हमेशा के लिए जारी रहेगा। जब तक आपकी जरूरतें नहीं बदलतीं। स्थिरता # 1 सुविधा है जो मैं किसी भी टूल में देखता हूं ।
रोमेल

3
"यदि आपने इसे स्थापित करते समय अपनी आवश्यकताओं को पूरा किया है, तो यह हमेशा के लिए जारी रहेगा। जब तक आपकी ज़रूरतें नहीं बदलतीं।" या आप एक बग ढूंढते हैं, जिस बिंदु पर आपको इसे स्वयं ठीक करने की आवश्यकता है, इसे ठीक करने के लिए किसी और को ढूंढें, या एक विकल्प की तलाश करें; एक जिसे छोड़ दिया गया है, शायद नहीं।

1
आपके उत्तर के लिए धन्यवाद @romainl! मेरा एक सवाल है: आपने कहा था कि प्लगइन को छोड़ दिया गया है, लेकिन रीडमी एक नए संस्करण में रीडायरेक्ट करता है, जो बहुत सक्रिय लगता है और कई कमेंट्स में लगता है कि कुछ सामान को ठीक करना बेहतर नहीं है?
statox

1
UltraSnips में कुछ बग और दस्तावेज़ीकरण त्रुटियां हैं जो कम-से-सुखद परिचय अनुभव के लिए बनाते हैं। आखिरकार इसे चालू होने के बाद, मैंने स्निपमेट की जांच करने का फैसला किया और स्थिरता के लिए @ रोमेनिल के तर्क को समझ सकता हूं।
chb

7

यहाँ म्यू-टेम्पलेट से सुविधाओं की एक सूची दी गई है । खुलासा: मैं इसका अनुचर हूं।

  • टेम्प्लेट-फाइलों का विस्तार किया जा सकता है:
    • स्वचालित रूप से एक नया बफ़र खोलने पर (जब तक .vimrc से निष्क्रिय नहीं किया जाता है)।
    • मेनू या कमांड लाइन के माध्यम से स्पष्ट रूप से,
    • स्निपेट-जैसे फैशन में INSERT- मोड से;
    • एक स्निपेट के साथ चयन को घेरने के लिए VISUAL- मोड से - आसपास के स्निपेट में अलग-अलग क्षेत्रों पर लागू किया जा सकता है (उदाहरण के लिए whileकंट्रोल-स्टेटमेंट में कोड या कंडीशन जोन );
  • सभी स्निपेट को अपने स्वयं के टेम्प्लेट-फ़ाइल में परिभाषित किया जाता है - अन्य सभी स्निपेट इंजन प्रति फ़ाइल एक फ़ाइल का उपयोग करते हैं और इसमें सभी स्निपेट डालते हैं;
  • टेम्प्लेट-फाइलें उपयोगकर्ता द्वारा या किसी विशेष परियोजना के संदर्भ में ओवरराइड की जा सकती हैं;
  • Filetype विशिष्ट स्निपेट को INSERT- मोड के लिए परिभाषित किया जा सकता है (उन्हें विरासत में प्राप्त किया जा सकता है, जैसे C स्निपेट C ++, Java, आदि से उपयोग किया जा सकता है), प्रत्येक स्निपेट के साथ मिलान स्निपेट्स की सूची संकेत के साथ प्रस्तुत की जाएगी;
  • कंप्यूटेड विम्ल एक्सप्रेशन डाले जा सकते हैं;
  • VimL निर्देशों को विस्तार के दौरान निष्पादित किया जा सकता है - मैं इसका उपयोग स्वचालित रूप से लापता को शामिल करने या बयान आयात करने के लिए करता हूं;
  • टेम्प्लेट-फाइल्स में अन्य टेम्प्लेट-फाइल्स को फंक्शन-जैसे तरीके से शामिल किया जा सकता है (पैरामीटर भी समर्थित हैं) - AFAIK, बहुत कम स्निपेट इंजन इसे लागू करते हैं, वे स्निपेट अलायस का समर्थन करने में भी सक्षम नहीं हैं, जो धन्यवाद को लागू करने के लिए तुच्छ है। यह सुविधा ;
  • मेरे प्लेसहोल्डर्स-सिस्टम के साथ पूरी तरह से एकीकृत;
  • पुनः इंडेंटेशन (यदि वांछित है), और पायथन इंडेंटेशन का समर्थन करता है;
  • अच्छी तरह से विम तह के साथ काम करता है;
  • I18n अनुकूल;
  • जब कई स्निपेट्स मेल खाते हैं, तो एक उन्नत समापन मेनू पॉप अप होता है (यह YouCompleteMe पॉपअप मेनू से प्रेरित है);
  • शैली विकल्पों स्वचालित रूप से लागू कर रहे हैं (कैसे आप अपने कोष्ठक पसंद करते हैं? if (...) {\n}? if (...)\n{\n}कुछ और?), और जाहिर है, वे ठीक चालू परियोजना, या वर्तमान फ़ाइल प्रकार, या यहाँ तक कि दोनों के आधार पर नियोजित किया जा सकता;
  • प्लगइन 100% विम है। हालांकि पायथन का उपयोग टेम्प्लेट फ़ाइल से किया जा सकता है।
  • म्यू-टेम्पलेट दो लाइब्रेरी प्लगइन्स (lh-vim-lib और lh-dev) और मेरे प्लेसहोल्डर सिस्टम (lh-ब्रैकेट्स) पर निर्भर करता है - यही कारण है कि मैं इसे VAM या VimFlavor के साथ इंस्टॉल करने की सलाह देता हूं क्योंकि मैं उन फ़ाइलों को प्रदान करता हूं जो घोषित करते हैं निर्भरता;
  • लाइसेंस कोड पीढ़ी के साथ संगत है - इसका मतलब है कि जबकि जीयूपीवी 3 के तहत म्यू-टेम्पलेट कोड है, स्निपेट्स नहीं हैं, आप उन्हें मालिकाना कोड में उपयोग कर सकते हैं: कुछ स्निपेट्स हालांकि बूस्ट सॉफ्टवेयर लाइसेंस के तहत हैं;

  • विस्तार तब होता है जब कोई भी स्थानीय vimrcs मौजूद हो, लोड होने के बाद - विस्तार होने से पहले प्रोजेक्ट-विशिष्ट चर सेट करने के लिए।

  • टॉम लिंक के StakeHolders प्लगइन के लिए धन्यवाद, doesTemplate के पास प्लेसहोल्डर्स हैं (एक नाम वाले प्लेसहोल्डर को संशोधित करके उसी नाम के साथ अन्य प्लेसहोल्डर्स को संशोधित करता है)। स्टेकहोल्डर स्थापित नहीं करने से आपको Stप्लेट का उपयोग करने से नहीं रोका जा सकेगा।

पूरी तरह से ईमानदार होने के लिए, टेम्पलेट सिंटैक्स थोड़ा बोझिल है, और प्लेसहोल्डर सिस्टम पहली प्लेसहोल्डर पीढ़ी से संबंधित है - म्यू-टेम्पलेट विम के लिए सबसे पुराने टेम्पलेट / स्निपेट्स इंजन में से एक है।

हालांकि, तथ्य यह है कि यह स्निपेट को अन्य स्निपेट (सशर्त रूप से और मापदंडों के साथ) को शामिल करने की अनुमति देता है, जो अतिरंजित हो सकता है या नहीं भी हो सकता है। विशिष्ट अनुप्रयोग हैं

  • C ++ फ़ाइल टेम्पलेट

    1. जिसमें एक फ़ाइल हेडर शामिल है (आमतौर पर सही कॉपीराइट नोटिस शामिल करने के लिए प्रत्येक प्रोजेक्ट के लिए अलग-अलग ठीक है)
    2. फिर वर्तमान प्रकार की फ़ाइल (.h, .cpp, या इकाई परीक्षण फ़ाइल) के लिए सबसे उपयुक्त टेम्पलेट को लोड करें:
      • हेडर-फाइल के मामले में, एंटी-रिनिवल गार्ड को शामिल किया जाएगा - जिस तरह से उनकी गणना की जाती है उसे ओवरराइड किया जा सकता है (फिर से प्रोजेक्ट नीतियों का पालन करने के लिए)
      • .cpp फ़ाइलें मामले में, मिलान .h फ़ाइल स्वचालित रूप से शामिल होने पर मिल जाती है
  • मेरे पास lh-cpp में एक सामान्य वर्ग स्निपेट / विज़ार्ड है। और कई विशिष्ट वर्ग प्रकार जो इस सामान्य वर्ग टेम्पलेट का उपयोग करते हैं, लेकिन विभिन्न मापदंडों के साथ।


आपके उत्तर के लिए धन्यवाद! मेरे पास एक सवाल है: आपने कहा All snippets are defined in their own template-file -- all other snippet engines use one file per filetype and put all snippets in it कि सामान्य (यानी फाइललाइट द्वारा एक फ़ाइल) की तुलना में इस वास्तुकला का क्या फायदा है?
statox

@statox मैं कहूंगा, यह एक स्निपेट रखरखाव का मुद्दा है। कुछ स्निपेट्स अत्यधिक जटिल हैं। internals/class-skeletonउदाहरण के लिए lh-cpp पर एक नज़र डालें । मैं नहीं बल्कि यह नियंत्रण बयान स्निपेट्स के साथ मिश्रित है। लेकिन मुझे स्वीकार करना चाहिए, कि सभी नियंत्रण विवरण एक साथ होने से यह समस्याग्रस्त नहीं होगा। इसके अलावा, इस दृष्टिकोण के लिए धन्यवाद, मैं आसानी से अपने स्निपेट्स को ओवरराइड कर सकता हूं, उन्हें मक्खी पर अपडेट कर सकता हूं, उन्हें कार्यों के रूप में उपयोग कर सकता हूं, आदि
ल्यूक हरमिट

वास्तव में जब मैं आपका लिंक देखता हूं तो मैं समझ सकता हूं कि कुछ स्निपेट बेहतर तरीके से अपनी फाइलों में रहते हैं। आपके स्पष्टीकरण के लिए धन्यवाद।
statox

1
@ स्टाटॉक्स वास्तव में, मेरे पास कई स्निपेट्स हैं जो जटिल होते हैं: वे संभव के रूप में कई स्मार्ट चीजों का पता लगाने, घटाने, और करने की कोशिश करते हैं। अधिकांश समय मैं कोड को ऑटोलॉग्ड फ़ंक्शन पर ले जाता हूं, लेकिन कभी-कभी, यह कई स्निपेट का उपयोग करने के लिए अधिक समझ में आता है जो एक दूसरे को कॉल करते हैं (और भिन्नता बिंदुओं के रूप में कार्य करते हैं जो परियोजना की जरूरतों के लिए ट्यून किए जा सकते हैं -> कॉपीराइट स्टेटमेंट, ...)
Luc Hermitte

4

SnipMate और UltiSnips विम के लिए दो सबसे लोकप्रिय स्निपेट इंजन हैं। दोनों TextMate के स्निपेट सिंटैक्स से प्रेरित हैं। UltiSnips सभी स्निपमेट स्निपेट्स चला सकते हैं, लेकिन इसे और अधिक शक्तिशाली बनाने के लिए अतिरिक्त सिंटैक्स भी हैं।

अंगूठे का एक अच्छा नियम यह है कि यदि आपके वीम को अजगर का समर्थन है, तो उल्टिसनिप्स का उपयोग करें। यदि नहीं, तो SnipMate का उपयोग करें।

मेरे में .vimrc, मैं अजगर उपलब्धता के आधार पर या तो प्लग (प्लग का उपयोग करके) लोड करता हूं।

if (has('python') || has('python3'))
    Plug 'SirVer/ultisnips'
else
    Plug 'garbas/vim-snipmate'
    Plug 'MarcWeber/vim-addon-mw-utils' "required for snipmate
    Plug 'tomtom/tlib_vim' "required for snipmate
endif

UltiSnips अपने स्निपेट में अजगर कोड भी चला सकता है, जिससे यह कुछ शांत चालें कर सकता है। यह मेरे पसंदीदा स्निपेट में से एक है जो एक पाठ के चारों ओर एक बॉक्स खींचता है ( मैं कैसे लेटेक्स और विम का उपयोग करके गणित के व्याख्यान में नोट्स लेने में सक्षम हूं। गिल्स Castel )

snippet box2 "Box"
`!p snip.rv = '┌' + '─' * (len(t[1]) + 2) + '┐'`
│ $1 │
`!p snip.rv = '└' + '─' * (len(t[1]) + 2) + '┘'`
$0
endsnippet

इस स्निपेट के साथ, मैं कुछ इस तरह से आउटपुट कर सकता हूं:

┌─────────────────────┐
│ this is a cool box! │
└─────────────────────┘
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.