2009-06-28 7 views
40

मुझे समस्या है कि vim/gvim में ctags मुझे फ़ंक्शन की वास्तविक परिभाषा के बजाय कई बार आगे की घोषणा में ले जाता है।परिभाषा पर जाने के लिए vim में ctags प्राप्त करें, घोषणा नहीं

इसके आसपास जाने का कोई तरीका?

उत्तर

54

मुझे लगता है कि "ctrl-]" के बजाय "g ctrl-]" का उपयोग करना सबसे आसान तरीका है। यदि केवल एक मैच है, तो यह आपको वहां ले जाएगा। यदि कई मैचों हैं, तो यह आपको उन सभी को सूचीबद्ध करेगा, जो आपको इच्छित व्यक्ति चुनने की अनुमति देते हैं, जैसे: tselect। दोनों दुनिया के सर्वश्रेष्ठ।:)

+0

होनहार लग रहा है, मैं इसे बाहर की जाँच करेंगे - धन्यवाद। –

+0

मेरे लिए, यह मुझे नाम साझा करने वाले कार्यों के दो आगे की घोषणाओं (विभिन्न फ़ाइलों में) देता है। लेकिन यह समारोह के कार्यान्वयन नहीं दिखाती है। – frankster

+0

वाह। वह जीवन बदल रहा है। – Praxeolitic

8

आप tn और tp उपयोग करने के लिए विभिन्न मिलान टैग के लिए कूद करने में सक्षम होना चाहिए।

  • पहले मैच में जाने के लिए ^] दबाएं।
  • यदि वह मैच नहीं है जो आप चाहते हैं, तो अगले पर जाने के लिए :tn टाइप करें।
  • यदि आपने :tn टाइप किया है तो आप पिछले बार वापस जाने के लिए :tp टाइप कर सकते हैं।
1
:tselect my_little_function 

और आप मैचों की एक सूची प्राप्त होगा। या यदि आप एक टैग के लिए कूद और आप इसे से खुश नहीं हैं, तो टाइप करें

:tselect 

और तुम अंतिम सक्रिय टैग के लिए विकल्प की एक सूची प्राप्त।

8

मेरा मानना ​​है कि विम डिफ़ॉल्ट रूप से टैग फ़ाइल में पहले टैग पर जाता है। यदि आप चाहें तो आप एक अलग चुन सकते हैं: :tj का उपयोग करें (इसी तरह: tselect, लेकिन केवल एक मैच होने पर ऑटो-कूद) या Ctrl-] के बाद :tn)।

डिफ़ॉल्ट रूप से बदलने का एकमात्र तरीका टैग फ़ाइल के क्रम को बदलना है, लेकिन मुझे विश्वास नहीं है कि ctags ऐसा करने के लिए कमांड लाइन विकल्प प्रदान करता है।

यह उतना कठिन नहीं है जितना लगता है कि आपको मूल रूप से टैग फ़ाइल खोलने वाली स्क्रिप्ट की आवश्यकता होती है, इसे टैग के 'प्रकार' द्वारा टाइप किया जाता है और इसे फिर से लिखता है। टैग में 'दयालु' एक एकल वर्ण है जिसमें यह वर्णन किया गया है कि यह एक फ़ंक्शन (एफ), एक फ़ंक्शन प्रोटोटाइप (पी), एक मैक्रो, एक समेकित नाम आदि इत्यादि है। यदि आप लिनक्स का उपयोग कर रहे हैं, तो यह सिद्धांत में हो सकता है, के रूप में सरल हो:

#!/bin/sh 
ctags -R -f - . | tac > tags 

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

मैं लापरवाह प्लग के लिए क्षमा चाहता हूं, लेकिन मैंने एक विम प्लगइन लिखा है जो (अप्रत्यक्ष रूप से) आपको जो चाहिए वह करता है। यह फ़ंक्शन नाम, मैक्रोज़, एनम्स इत्यादि जैसी चीजों के लिए बहुत से अतिरिक्त हाइलाइटिंग समूहों को जोड़ने का इरादा है। हालांकि, यह अन्य चीजों में से एक है जो टैग फ़ाइल को फिर से क्रमबद्ध करता है ताकि फ़ंक्शन कार्यान्वयन फ़ंक्शन घोषणा से पहले आता है, जिससे जो आप चाहते हैं उसे प्राप्त करना (मुझे आपके जैसा ही आवश्यकता थी)। यदि आप किसी भी हाइलाइटिंग कार्यक्षमता को नहीं चाहते हैं, तो आप शायद इसे आसानी से बाहर निकाल सकते हैं: यह एक साधारण सरल पायथन प्रोग्राम और एक आसान सरल विम स्क्रिप्ट है और my site से उपलब्ध है।

1

यह विकल्प मेरे लिए काम किया बेहतर

अपने .vimrc में निम्न पंक्ति रखो और अब आप टैग किया गया स्थान पर जाने के लिए (आपकी फ़ाइल में variable/entry पर) माउस की डबल क्लिक करें उपयोग कर सकते हैं। यदि एकल मैच मिलता है, तो यह तुरंत कूद जाएगा। कई प्रविष्टियाँ मिलान पाए जाने पर, यह उपयोगकर्ता इनपुट के लिए संकेत देगा ..

:map <2-LeftMouse> g< c-]> 
1

अपने .vimrc फ़ाइल में निम्न जोड़ें:

noremap <c-]> 2<c-]> 

इस लाइन का कारण बनता है vim स्वचालित रूप से दूसरे मैच के लिए कूद करने (बजाय पहले में से), जो आमतौर पर कार्य परिभाषा है।

1

देर पार्टी के लिए है, लेकिन आने वाले vim टैग Googler के लिए:

मैंने पाया कि ctags के अलावा cscope का उपयोग कर जाने के लिए, कम से कम C/C के लिए रास्ता है ++। यह कॉल पेड़ के बारे में अधिक बुद्धिमान है, और यदि यह विफल रहता है तो आप इसे ctags पर फ़ॉलबैक पर सेट कर सकते हैं। हर बार जब आप ctags -R चलाते हैं तो "cscope -b" चलाएं। और आप जाने के लिए तैयार हो जाएंगे। आप नीचे दिए गए सेटिंग्स का उपयोग करें, तो आपको Ctrl का उपयोग करने में सक्षम हो जाएगा - हमेशा की तरह]/Ctrl-टी, लेकिन आप यह भी एक समारोह घोषणा करने के लिए कूद और समारोह कॉल करने के jumplist दिखा तरह गंधा नई छलांग जोड़ सकते हैं।

" setup 
if has("cscope") 
    set csto=0                    
    set cst 
    set nocsverb 
    " add any database in current directory 
    if filereadable("cscope.out") 
    cs add cscope.out 
    " else add database pointed to by environment 
    elseif $CSCOPE_DB != "" 
    cs add $CSCOPE_DB 
    endif 
    set csverb 
endif 

" jump to a function declaration 
nmap <silent> <C-\> :cs find s <C-R>=expand("<cword>")<CR><CR>1<CR><CR> 
" show a list of where function is called 
nmap <silent> <C-_> :cs find c <C-R>=expand("<cword>")<CR><CR> 
+0

आपका क्या मतलब है 'बस आर द्वारा' un "cscope -b" हर बार जब आप ctags -R चलाते हैं? ctags -R चलाने से पहले cscope -b चलाएं? या के बाद? –

0

, विम सीधे एक टैग के लिए कूद करने, अगर वहाँ केवल एक टैग मैच बनाने के लिए कई तरीके हैं अन्यथा टैग मैचों की एक सूची प्रस्तुत करते हैं।

आप 'tjump' पूर्व आदेश का उपयोग कर सकते हैं। उदाहरण के लिए, कमांड ':tjump func1', परिभाषा func1 पर चला जाएगा, तो यह केवल एक बार परिभाषित किया गया है। यदि func1 को कई बार परिभाषित किया गया है, मिलान टैग की एक सूची प्रस्तुत की जाएगी।

आप कर्सर को टैग पर रख सकते हैं और g Ctrl-] दबा सकते हैं।

आप मिलान टेक्स्ट को कूद या सूचीबद्ध करने के लिए दृश्यमान रूप से एक टेक्स्ट चुन सकते हैं और g Ctrl-] दबा सकते हैं।

आप 'stjump' पूर्व आदेश का उपयोग कर सकते हैं। यह एक नई विंडो में टैग सूची से मिलान या चयनित टैग खुल जाएगा।

आप एक करने के लिए Ctrl-W g Ctrl-] दबा सकते हैं: stjump।

Help: :tjump, g_Ctrl-], v_g_CTRL-], :stjump, Ctrl-W_g_Ctrl-] 
0

आप प्रेस तो CTRL + ], इस दूसरे मैच के लिए सीधे जाना होगा सकते हैं, जावा में, यह आम तौर पर कुछ इंटरफ़ेस के कार्यान्वयन है।

संबंधित मुद्दे