इस तथ्य के बावजूद कि "विम के रूप में आईडीई का उपयोग करते हुए" विषय पर बहुत सारे लेख हैं, परिणाम ने मुझे संतुष्ट नहीं किया। मेरे पास परियोजना में सभी फ़ाइलों के लिए उपयोगकर्ता (अर्थात, मेरे) टैग पीढ़ी के लिए वास्तव में स्वचालित, पारदर्शी की कमी है, और परियोजना फाइलों को एक ही निर्देशिका और उसके उपनिर्देशिकाओं में नहीं होना चाहिए, और फ़ाइलों की सूची बनाना आसान और सुखद होना चाहिए।
इसके अलावा, मुझे प्रोजेक्ट को एक कंप्यूटर से दूसरे कंप्यूटर में आसानी से स्थानांतरित करने में सक्षम होना चाहिए और किसी विशिष्ट प्रोजेक्ट निर्देशिका से बंधा नहीं होना चाहिए।
आवश्यक कार्यक्षमता वाले प्लगइन्स की लंबी खोज असफल रही, इसलिए इस तरह के प्लगइन को लिखने का निर्णय लिया गया। मैंने इसे
अनुक्रमणिका कहा।
UPD: फिलहाल लेख थोड़ा पुराना है। जब मेरे पास इसके लिए समय होगा मैं इसे अपडेट कर दूंगा। हालांकि, मुख्य बात काम करती है, और पिछड़े संगतता प्रदान की जाती है, लेकिन सुविधाओं के अधिक पूर्ण उपयोग के लिए, मैं आपको पढ़ने की सलाह देता हूं
: इंडेक्स-सिन-चेंज-4.10 की मदद करें ।
प्लगइन संग्रह में निम्नलिखित फाइलें और फ़ोल्डर्स हैं:
plugin/indexer.vim
doc/indexer.txt
काम करने के लिए, आपको
ctags की आवश्यकता है, लेकिन बेहतर पैच किए गए ctags, क्योंकि नवीनतम संस्करण में 5.8 (इन पंक्तियों को लिखने के समय) एक बहुत ही अप्रिय बग है। बग के बारे में अधिक पढ़ें और
यहां पैच डाउनलोड
करें ।
सबसे पहले, यह कहा जाना चाहिए कि प्लगइन का उपयोग करने के लिए दो विकल्प हैं: अद्भुत
परियोजना प्लगइन के अतिरिक्त या इससे अलग।
प्रोजेक्ट प्लगइन के बारे में कुछ शब्द: यह प्लगइन आपको आसानी से परियोजनाओं और उन में फ़ाइलों की एक सूची का प्रबंधन करने की अनुमति देता है। नेत्रहीन, यह एक खिड़की है जिसमें परियोजनाओं, उपप्रोजेक्ट और फाइलों की एक पेड़ संरचना है। परियोजनाओं को कम से कम किया जा सकता है। आप सभी प्रोजेक्ट फ़ाइलों पर grep या vimgrep कर सकते हैं, और फिर परिणाम को उपसर्ग में देख सकते हैं। परियोजनाओं के साथ विंडो को दिखाने / छिपाने के लिए कुछ कुंजी (उदाहरण के लिए, F9) को मैप करना सुविधाजनक है।
इस प्लगइन का एक विस्तृत विवरण इस लेख के दायरे से परे है, इसके अलावा, Google में क्वेरी "विम प्रोजेक्ट" तुरंत बहुत सारे लिंक देता है। ऑफहंड -
यहाँ । ठीक है, ज़ाहिर है,: प्लगइन स्थापित करने के बाद परियोजना में मदद करें।
विकल्प 1. प्रोजेक्ट प्लगइन के अतिरिक्त उपयोग करें
तो, सबसे सरल विकल्प पर विचार करें: आप पहले से ही प्रोजेक्ट प्लगइन का उपयोग करते हैं और डिफ़ॉल्ट प्रोजेक्ट फ़ाइल ~ / .vimprojects का उपयोग करते हैं। यदि ऐसा है, तो इंडेक्सर प्लगइन स्थापित करना बहुत सरल होगा: आप बस आर्काइव की सामग्री को $ HOME / .vim (या इसी तरह की डायरेक्टरी) में अनज़िप करें, Vim को बंद करें (यदि यह खुला था) और इसे ~ / .vimprojects में किसी भी प्रोजेक्ट की डायरेक्टरी से शुरू करें। । आप बस किसी भी फ़ाइल को खोल सकते हैं जो परियोजना का हिस्सा है।
इंडेक्सर यह निर्धारित करेगा कि ऐसी फाइल जो इस तरह के हिस्से का हिस्सा है और इस तरह की परियोजना खोली गई है, उन सभी फाइलों को अनुक्रमित करें जो इस परियोजना का हिस्सा हैं और संबंधित मानों को विम एंड टैग्स और पथ चर में सेट करते हैं।
जब आप किसी भी फ़ाइल को सहेजते हैं तो वह टैग अपने आप अपडेट हो जाएगा।
अब आप कर्सर को किसी फंक्शन, वेरिएबल इत्यादि के नाम पर ले जा सकते हैं, और
g] या
Ctrl-] दबाकर (इसमें थोड़े बहुत अंतर हैं), इस फंक्शन की घोषणा पर जाएँ।
Ctrl-t आपको वापस लाएगा। और यदि आप C / C ++ में विकास कर रहे हैं, तो आप omnicppcomplete और code_complete प्लगइन्स को कनेक्ट कर सकते हैं, और फिर "स्ट्रक्चर_नाम।" या "संरचना_नाम->" लिखकर, आप इस संरचना के तत्वों की पसंद के साथ एक पॉपअप मेनू देखेंगे, और "function_name" ("टाइपिंग")। टैब को दबाने से उन सभी मापदंडों का ऑटो-प्रतिस्थापन मिलेगा जो यह फ़ंक्शन स्वीकार करता है, लेकिन मैं थोड़ा विचलित था।
यह सब कुछ इस तरह दिखता है:

यदि आप प्रोजेक्ट प्लगइन का उपयोग करते हैं, लेकिन आपके पास एक अलग प्रोजेक्ट फाइल है, तो आप इसे अपने _vimrc में निर्दिष्ट कर सकते हैं:
let g:indexer_projectsSettingsFilename = /path/to/my/.vimprojects
मैं विकल्पों की पूरी सूची थोड़ी देर बाद दूंगा।
जैसा कि आप देख सकते हैं, इन प्लगइन्स का एक गुच्छा के साथ काम करना काफी सुविधाजनक है: प्रोजेक्ट आपको परियोजनाओं का प्रबंधन करने की अनुमति देता है, और इंडेकर टैग को अपडेट करने का ध्यान रखता है।
यदि किसी कारण से आप परियोजना का उपयोग नहीं करना चाहते हैं, तो
विकल्प 2. प्रोजेक्ट प्लगइन के बिना उपयोग करें
आपको एक सिंगल फाइल में वर्णन करना होगा कि कौन सी फाइलें किस प्रोजेक्ट का हिस्सा हैं। डिफ़ॉल्ट ~ / .indexer_files है। इस फ़ाइल के लिए सिंटैक्स काफी सरल है। शायद समझाने का सबसे अच्छा तरीका एक उदाहरण दिखाना है:
[CoolProject]
/home/user/myproject/src/*.c
/home/user/myproject/src/*.h
/home/user/myproject/inc/*.h
[AnotherProject]
$HOME/myproject2**/*.c
$HOME/myproject2**/*.h
जैसा कि आप अनुमान लगा सकते हैं, यहाँ दो परियोजनाएँ हैं: कूलप्रोजेक्ट और अन्यप्रोजेक्ट।
CoolProject प्रोजेक्ट में सभी * .c फाइलें / होम / यूजर / myproject / src डायरेक्टरी से, और सभी हेडर फाइलें / होम / यूजर / myproject / inc और / home / यूजर / myproject / src से शामिल हैं।
और एक औरProject में * .c और * .h फाइलें ~ / myproject2 निर्देशिका और सभी उपनिर्देशिका पुनरावर्ती ("**" पुनरावर्ती इंगित करता है) शामिल हैं।
ठीक है, जैसा कि आप देख सकते हैं, फ़ाइल रास्तों में आप उपयोगकर्ता द्वारा घोषित उन लोगों सहित, VIM चर, जैसे कि $ HOME, $ VIM और अन्य का उपयोग कर सकते हैं।
UPD : संस्करण 1.5 में,
torkve उपयोगकर्ता के अनुरोध पर, इस फ़ाइल में कई प्रोजेक्ट वाली निर्देशिका को सेट करने की क्षमता जोड़ी गई है। मान लीजिए कि आपके पास एक ~ / कार्यक्षेत्र निर्देशिका है जिसमें परियोजनाओं का एक समूह है, और परियोजनाओं की सूची अक्सर बदलती रहती है। हर बार .indexer_files फ़ाइल का संपादन आलसी होगा। तो आप इस तरह से कुछ निर्दिष्ट कर सकते हैं:
[PROJECTS_PARENT filter="*.c *.h *.cpp"]
~/workspace
कीवर्ड PROJECTS_PARENT है। इंडेक्सर प्रत्येक फ़ोल्डर को ~ / कार्यक्षेत्र में एक अलग प्रोजेक्ट के रूप में विचार करेगा, जिसमें सूचीबद्ध प्रकारों की फाइलें शामिल हैं।
अन्य सभी मामलों में, इंडेक्सर ठीक उसी तरह से काम करता है जैसे प्रोजेक्ट के साथ: यदि आप प्रोजेक्ट डायरेक्टरी से विम चलाते हैं, तो इस प्रोजेक्ट की सभी फाइलों के लिए टैग जेनरेट हो जाएंगे, और अगर इस प्रोजेक्ट की कोई भी फाइल सेव हो गई, तो टैग्स अपडेट हो जाएंगे।
यही है, अब मैं सिर्फ प्रोजेक्ट बना सकता हूं, वहां फाइलें जोड़ सकता हूं और भूल सकता हूं कि उन्हें कैसे अनुक्रमित किया जाता है। हुर्रे!
लेकिन मेरे लिए यह पर्याप्त नहीं था।
तथ्य यह है कि मैं इसे पसंद नहीं करता जब परियोजना फाइलें अलग-अलग स्थानों पर होती हैं (पुस्तकालयों के अपवाद के साथ जो कई परियोजनाओं द्वारा होगी। वास्तव में, पुस्तकालय अलग-अलग परियोजनाएं हैं)। हमारे द्वारा विचार किए गए मामलों में, परियोजना एक फ़ोल्डर में है, और परियोजना विवरण (.vimprojects या .indexer_files) के साथ फाइल दूसरे (घर में) में है।
यही है, मैं प्रत्येक परियोजना के लिए अपनी स्वयं की .vimprojects फ़ाइल रखना चाहूंगा, जो कि परियोजना के फ़ोल्डर में ही निहित होगी और जिसमें वास्तव में, केवल इस परियोजना का विवरण होगा। यह पता चला है, परियोजना के आधार पर, आपको इस परियोजना के लिए विशिष्ट सेटिंग्स लोड करने की आवश्यकता है।
मैंने इस समस्या को निम्नानुसार हल किया: प्रोजेक्ट के रूट फ़ोल्डर में, मैं एक फ़ोल्डर बनाता हूं ".vimprj" (नाम बदला जा सकता है), जिसमें मैंने प्रोजेक्ट-विशिष्ट सेटिंग्स के साथ फाइलें डालीं। इसमें झूठ है ।vimprojects जब विम शुरू होता है, तो सबसे पहले इंडेक्सर इस निर्देशिका में ".vimprj" फ़ोल्डर की तलाश करेगा, अगर यह नहीं है, तो अगले स्तर पर जाएं, और इसी तरह। पुनरावृत्ति की गहराई को बदला जा सकता है, डिफ़ॉल्ट रूप से यह 10 है।
यदि ".vimprj" फ़ोल्डर पाया जाता है, तो अनुक्रमणिका वैश्विक चर $ INDEXER_PROJECT_ROOT की घोषणा करेगी, जैसा कि आप अनुमान लगा सकते हैं, परियोजना रूट फ़ोल्डर के लिए पथ का संकेत देगा। ".Vimprj" फ़ोल्डर के लिए नहीं, लेकिन उस फ़ोल्डर में ".vimprj" निहित है। इस निर्देशिका की सभी * .vim फाइलें भी लॉन्च की जाएंगी, जिसमें विशिष्ट सेटिंग्स सेट की जा सकती हैं। यहाँ इस तरह के एक सेटल फ़ाइल का उदाहरण दिया गया है:
" .vimprj
let s:sPath = expand('<sfile>:p:h')
" indexer , .vimprj
let g:indexer_projectsSettingsFilename = s:sPath.'/.vimprojects'
" project , .vimprj
" : project.
" project.vim,
"
let g:proj_project_filename=s:sPath.'/.vimprojects'
" , ,
let &makeprg = 'pic30-gcc -mcpu=24HJ128GP504 -xc -c "%:p" -o"%:t:ro" -I"'.$INDEXER_PROJECT_ROOT.'\src\utils" -I"'.$INDEXER_PROJECT_ROOT.'\src\app" -g -Wall -mlarge-code -mlarge-data -O1'
प्रोजेक्ट फ़ाइल .vimprojects में भी, मैं प्रोजेक्ट के लिए निरपेक्ष पथ का उपयोग नहीं करता, लेकिन चर $ INDEXER_PROJECT_ROOT को प्रतिस्थापित करता हूं। अब मैं प्रोजेक्ट फ़ोल्डर को स्थानांतरित कर सकता हूं, जहां भी मैं चाहता हूं, किसी भी मामले में, सभी रास्ते सही होंगे और टैग उत्पन्न होंगे। यही मैं हासिल करना चाहता था।
अब कुछ विवरण।
प्रोजेक्ट प्लगइन को ~ / .vimprojects के अलावा किसी प्रोजेक्ट फ़ाइल को निर्दिष्ट करने के तरीके के बारे में।
प्लगइन के निर्माता Aric Blumer द्वारा प्रदान की जाने वाली एकमात्र संभावना है, हर बार Vim शुरू होने पर कमांड: "प्रोजेक्ट /path/to/my/.vimprojects"। बेशक, आप इसे कुछ कुंजी के लिए मैप कर सकते हैं, लेकिन यह अभी भी एक "बैसाखी" है, और यह असुविधाजनक है: आप बस इस कुंजी को दबाने के लिए भूल सकते हैं। आप वैकल्पिक कुंजी + "प्रोजेक्ट /path/to/my/.vimprojects" के साथ विम चला सकते हैं, लेकिन मुझे यह पसंद नहीं है। मैंने प्लगइन के निर्माता के साथ पत्राचार किया, लेकिन उसने मुझे बताया कि मैं केवल एक ही था जिसे इसकी आवश्यकता थी, और वह कुछ भी नहीं बदलेगा। इसलिए मैं आपको केवल यह बता सकता हूं कि प्रोजेक्ट को कैसे बदलना है। ऐसा करें ताकि आप प्रोजेक्ट फ़ाइल के साथ एक चर निर्दिष्ट कर सकें। एक पंक्ति के बजाय, आपको 5 लाइनें सम्मिलित करने की आवश्यकता होगी, बस इतना ही।
उपरोक्त परियोजना 1.4.1 के लिए सही है (इस लेखन के समय नवीनतम संस्करण)।
1272 लाइन पर जाएं। इसमें केवल एक कमांड होनी चाहिए:
Project
आपको इस लाइन को निम्न कोड ब्लॉक से बदलना होगा:
if !exists("g:proj_running") && exists('g:proj_project_filename')
exec('Project '.g:proj_project_filename)
else
Project
endif
यही है, अब, यदि आप चर g: proj_project_filename निर्दिष्ट करते हैं, तो इसका मान ~ / -vimprojects के बजाय उपयोग किया जाएगा।
UPD : इंडेक्सर संस्करण 3.0 में दो "सुविधाएँ" मेरे लिए बहुत महत्वपूर्ण हैं:
1. टैग पृष्ठभूमि में उत्पन्न होते हैं। इसका मतलब है कि आपकी परियोजना के आकार की परवाह किए बिना, आपको पूरी परियोजना को अनुक्रमित होने तक इंतजार नहीं करना पड़ेगा। एक BUT है: यह केवल तभी काम करता है जब Servername खाली न हो (: servername मदद)। जब आप gvim चलाते हैं (और vim नहीं), तो यह स्वयं डिफ़ॉल्ट सर्वरनाम "GVIM" सेट करता है, अर्थात gvim में बैकग्राउंड टैग जेनरेशन बॉक्स से बाहर काम करेगा। और यदि आप कंसोल विम का उपयोग करते हैं और चाहते हैं कि टैग पृष्ठभूमि में उत्पन्न हों, तो आपको इसे कुछ इस तरह से चलाने की आवश्यकता है:
$ vim --servername MY_SERVER
2. आप विभिन्न परियोजनाओं से एक विम सत्र में फाइलें खोल सकते हैं, और सभी आवश्यक परियोजनाओं के लिए टैग सही तरीके से उत्पन्न होंगे। अलग-अलग परियोजनाओं से टैग नहीं मिलाते हैं। यह बहुत सुविधाजनक है जब आपको एक ही समय में कई परियोजनाओं के साथ काम करने की आवश्यकता होती है। (उदाहरण के लिए, एक दूसरे के साथ बातचीत करने वाली कई संस्थाओं की परियोजनाएं)
अनुक्रमणिका प्लगइन विकल्प
g: indexer_lookForProjectDir (डिफ़ॉल्ट: 1)
यदि 1 है, तो प्लगइन ".vimprj" फ़ोल्डर के लिए खोज करेगा।
g: indexer_dirNameForSearch (डिफ़ॉल्ट: ".vimprj")
प्रोजेक्ट सेटिंग्स निर्देशिका का नाम
g: indexer_recurseUpCount (डिफ़ॉल्ट: 10)
इस फ़ोल्डर को खोजने के लिए पुनरावृत्ति गहराई
g: indexer_projectsSettingsFilename (डिफ़ॉल्ट: "~ / .vimprojects")
प्रोजेक्ट पथ और फ़ाइल नाम (प्रोजेक्ट प्लगइन फ़ाइल)
g: indexer_indexerListFilename (डिफ़ॉल्ट: "~ / .indexer_files")
प्रोजेक्ट पथ और फ़ाइल नाम (मूल अनुक्रमणिका प्लगइन प्रारूप)।
यदि दोनों फाइलें मौजूद हैं (दोनों ".indexer_files" और ".vimprojects"), तो केवल .indexer_files का उपयोग किया जाता है। एक और फाइल को नजरअंदाज कर दिया जाएगा। यह पता लगाने के लिए कि वर्तमान में किस फ़ाइल का उपयोग किया जा रहा है, आप कमांड का उपयोग कर सकते हैं: IndexerInfo। मैं आपको नीचे दिए गए अनुक्रमणिका प्लगइन के आदेशों के बारे में अधिक बताऊंगा।
g: indexer_projectName (डिफ़ॉल्ट: "")
प्रोजेक्ट फ़ाइल से पढ़ने के लिए प्रोजेक्ट का नाम। यदि परियोजना का नाम इंगित नहीं किया गया है, तो किसी भी परियोजना का उपयोग किया जाएगा।
g: indexer_enableWhenProjectDirFound (डिफ़ॉल्ट: 1)
यदि 1, तो Vimer को किसी भी निर्देशिका से लॉन्च किया गया था, जिसमें प्रोजेक्ट फ़ाइलें स्थित हैं, तो अनुक्रमणिका प्रोजेक्ट फ़ाइलों को अनुक्रमित करेगी।
यदि 0, तो फ़ाइलें केवल तभी इंडेक्स की जाएंगी जब प्रोजेक्ट में शामिल फ़ाइल खोली गई थी।
g: indexer_tagsDirname (डिफ़ॉल्ट: "")
टैग को बचाने के लिए निर्देशिका।
यदि यह विकल्प खाली है (डिफ़ॉल्ट रूप से), तो टैग वाले फ़ोल्डर का नाम निम्नानुसार चुना गया है:
मान लीजिए आप फ़ाइल ~ / .indexer_files का उपयोग करते हैं। फिर टैग ~ / .indexer_files_tags / project_name फ़ोल्डर में सहेजे जाएंगे, जहां प्रोजेक्ट_name प्रोजेक्ट का नाम है।
यदि आप ~ / .vimprojects फ़ाइल का उपयोग कर रहे हैं। फिर टैग ~ / .vimprojects_tags / project_name फ़ोल्डर में सहेजे जाएंगे, जहां project_name प्रोजेक्ट का नाम है।
यदि यह विकल्प खाली नहीं है, तो सभी टैग फाइलें निर्दिष्ट फ़ोल्डर में सहेजी जाती हैं।
मैं इस विकल्प को खाली छोड़ने की सलाह देता हूं।
g: indexer_ctagsCommandLineOptions (डिफ़ॉल्ट: "--c ++ - प्रकार = + p + l --fields = + iaS --extra = + q")
जिन विकल्पों के साथ ctags लॉन्च किया जाएगा।
g: indexer_ctagsJustAppendTagsAtFileSave (डिफ़ॉल्ट: लिनक्स के लिए: 1, विंडोज के लिए: 0)
यदि 1 है, तो परियोजना से किसी भी फ़ाइल को सहेजते समय, ctags को केवल इस फ़ाइल के लिए "-a" कुंजी (परिशिष्ट) के साथ लॉन्च किया जाएगा।
(यहां आपको जी पर भी ध्यान देने की आवश्यकता है
: indexer_useSedWhenAppend विकल्प : जब यह स्थापित हो जाए, तो टैग अपडेट करने से पहले, इस फाइल के पुराने टैग्स को सेड यूटिलिटी का उपयोग करके हटा दिया जाएगा)
यदि 0 है, तो जब आप किसी भी फ़ाइल को प्रोजेक्ट से बचाते हैं, तो टैग पूरी तरह से अपडेट हो जाएंगे।
कुछ कठिनाइयाँ हैं। विंडोज के लिए सेड के सभी संस्करण जिन्हें मैंने टेढ़ा करने के लिए काम पाया। मैं यहां उनके ग्लिच के बारे में बात नहीं करता, मैं केवल यही कहूंगा कि मैं अभी भी उन्हें सही ढंग से काम करने के लिए नहीं मिला। और लिनक्स पर यह अच्छी तरह से काम करता है। इसलिए, मुझे समझौता करना पड़ा: लिनक्स में, डिफ़ॉल्ट रूप से, टैग केवल सहेजी गई फ़ाइल के लिए अपडेट किए जाते हैं, और टैग फ़ाइल से "कचरा" हटाने के लिए सेड का उपयोग किया जाता है; और विंडोज पर, हर सेव बस सभी टैग को अपडेट करता है। वास्तव में, इंडेक्सर 3.0 में पृष्ठभूमि टैग पीढ़ी के आगमन के साथ, यह अब कोई समस्या नहीं है।
Indexer Plugin Commands
: IndexerInfoप्लगइन की वर्तमान स्थिति के बारे में जानकारी प्रदर्शित करता है: किस प्रोजेक्ट फ़ाइल का उपयोग किया जाता है, कितनी फ़ाइलों को अनुक्रमित किया जाता है, कितनी और कौन सी फाइलें मिली हैं, आदि।
यदि किसी कारण से प्लगइन आपकी अपेक्षा के अनुरूप काम नहीं करता है, तो सबसे पहले यह कमांड देना होगा।
: IndexerRebuildप्रोजेक्ट में शामिल सभी फ़ाइलों के लिए अपडेट टैग।
और अंत में, लिंक
अनुक्रमणिका प्लगइन पृष्ठ:
http://www.vim.org/scripts/script.php?script_id=3221प्रोजेक्ट प्लगइन पेज:
http://www.vim.org/scripts/script.php?script_id=69पैच किए गए cagags:
http://dfrank.ru/ctags581आपका ध्यान देने के लिए धन्यवाद।