cscope या ctags दूसरे पर एक का चयन क्यों करें? [बन्द है]


131

मैं मुख्य रूप से संपादक के रूप में vim / gvim का उपयोग करता हूं और कर्नेल स्रोत की खोज के लिए lxr (लिनक्स क्रॉस संदर्भ) और या तो cscope या ctags के संयोजन का उपयोग कर रहा हूं । हालाँकि, मैंने कभी भी cscope या ctags का उपयोग नहीं किया है और यह सुनना चाहूंगा कि कोई एक प्राथमिक संपादक के रूप में मेरे उपयोग को ध्यान में रखते हुए दूसरे को क्यों चुन सकता है।

जवाबों:


157

ctags दो विशेषताओं को सक्षम करता है: आपको फ़ंक्शन कॉल से उनकी परिभाषाओं तक कूदने की अनुमति देता है, और ओमनी पूर्णता। पहले अर्थ यह है कि जब आप एक विधि के लिए एक कॉल से अधिक कर रहे हैं, मार g]या CTRL-]जगह है जहाँ कि विधि परिभाषित या कार्यान्वित किया जाता है पर चला जाएगा। दूसरी विशेषता का मतलब है कि जब आप टाइप करते हैं foo.या foo->, और अगर फू एक संरचना है, तो फ़ील्ड पूर्ण होने के साथ एक पॉप-अप मेनू दिखाया जाएगा।

cscope की भी पहली विशेषता है - उपयोग करना set cscopetag- लेकिन अंतिम नहीं। हालाँकि cscope अतिरिक्त रूप से उन स्थानों में से किसी में भी कूदने की क्षमता को जोड़ता है जहाँ किसी फ़ंक्शन को भी कहा जाता है।

जहाँ तक एक कोड बेस के इर्द-गिर्द कूदने की बात है, ctags केवल आपको कभी उस जगह की ओर ले जाएगा जहाँ फ़ंक्शन कार्यान्वित किया जाता है, जबकि cscope आपको दिखा सकता है कि फ़ंक्शन कहाँ है।

आप एक को दूसरे पर क्यों चुनेंगे? खैर, मैं दोनों का उपयोग करता हूं। ctags को स्थापित करना आसान है, तेजी से चलाने के लिए और यदि आप केवल एक तरह से कूदने के बारे में परवाह करते हैं तो यह आपको कम लाइनें दिखाएगा। आप सिर्फ :!ctags -R .और g]सिर्फ काम चला सकते हैं । यह उस ओमनी को पूरी तरह से सक्षम बनाता है।

Cscope बड़े, अज्ञात कोड बेस के लिए बहुत अच्छा है। सेट अप एक दर्द है क्योंकि cscope को पार्स करने के लिए फ़ाइलों के नामों की सूची वाली एक फ़ाइल की आवश्यकता होती है। इसके अलावा, डिफ़ॉल्ट रूप से, कोई कुंजी बाइंडिंग सेट नहीं हैं - आपको :cscope blah blahमैन्युअल रूप से चलाने की आवश्यकता है ।

मुट्ठी की समस्या को हल करने के लिए मुझे एक बैश स्क्रिप्ट मिली cscope_gen.shहै जो इस तरह दिखाई देती है:

#!/bin/sh
find . -name '*.py' \
-o -name '*.java' \
-o -iname '*.[CH]' \
-o -name '*.cpp' \
-o -name '*.cc' \
-o -name '*.hpp'  \
> cscope.files

# -b: just build
# -q: create inverted index
cscope -b -q

यह उस कोड की खोज करता है जिसकी मुझे दिलचस्पी है, cscope.files सूची बनाता है और डेटाबेस बनाता है। इस तरह मैं सभी सेट अप चरणों को याद रखने के बजाय ":! Cscope_gen.sh" चला सकता हूं।

मैं इस स्निपेट के साथ ctrl-space x 2 में cscope खोज को मैप करता हूं, जो cscope के अन्य डाउनर को कम करता है:

nmap <C-@><C-@> :cs find s <C-R>=expand("<cword>")<CR><CR>

नहीं है प्लग इन को इस cscope_maps.vim समान बाइंडिंग का एक समूह तक कि सेट। मैं कभी भी याद नहीं रख सकता कि सभी विकल्पों का क्या मतलब है, इसलिए ctrl-space से चिपके रहें।

इसलिए निष्कर्ष निकालना: ctags को स्थापित करना आसान है और ज्यादातर बिना कुछ किए काम करता है, यह ओमनी-पूर्ण के लिए भी महत्वपूर्ण है। यदि आपको एक बड़ा और अधिक अज्ञात कोड आधार बनाए रखना है, तो cscope अधिक सुविधाएँ प्रदान करता है, लेकिन इसके लिए अधिक पैर की आवश्यकता होती है।


2
क्या ctags को अधिक सटीक बनाने का कोई तरीका है? मैंने make tagsकर्नेल रूट डायर में किया और कूदने के साथ खेल रहा हूं और ज्यादातर समय गलत जगह समाप्त होता है। मैंने पढ़ा कि ctags में c प्रीप्रोसेसर के साथ समस्याएँ हैं, लेकिन यह देखते हुए कि ctags का उपयोग lxr में किया जाता है, जाहिर है कि ऐसा कुछ होना चाहिए।
रॉबर्ट एस। बार्न्स

2
अगर गहरी मैक्रो वूडू है, तो ctags विफल होने की संभावना है :-( मैं इसका उपयोग ज्यादातर सी ++ सामान के लिए करता हूं, जो चीजों के उस पक्ष पर कम निर्भर करता है (हालांकि इसकी अपनी समस्याएं हैं ...)
रिच

12
सेट cscopetag( cst) बनाने के लिए :tagऔर CTRL-]कमांड पहले cscope के माध्यम से खोज, फिर टैग
Hasturkun

1
इसके अलावा, पुनरावर्ती खोज में ctags बहुत धीमी है, "ctags -L cscope.files" का उपयोग करने से आपके टैग पीढ़ी में काफी तेजी आएगी।
हारून एच।

1
@ RobertS.Barnes किसी तरह के समाधान का उपयोग कर रहा है g C-], vim आपको नाम से मेल खाने वाले टैग की सूची दिखाएगा। आपको अभी भी उचित परिभाषा खोजने की आवश्यकता होगी जिसे आप मैन्युअल रूप से देख रहे हैं।
ह्यूबर्ट करियो

15

मैं कुछ महीने पहले उसी स्थिति में था ...

Ctags की सटीकता की कमी में दर्द होता है .. और मुझे मैक्रो संबंधित सभी सामानों के लिए बहुत बेहतर लगता है (और लिनक्स कर्नेल में मैक्रोज़ का एक गुच्छा होता है) ।।

उपयोग के विषय में, यह वास्तव में सीधा है ... आप अपने कर्नेल की जड़ में बस cscope -R टाइप करें और फिर आपको चिंता करने की कोई बात नहीं है .. (मेरा मतलब है कि अगर आप केवल सही खोज करना चाहते हैं ...)

फिर, कुंजी बाइंडिंग सभी Ctrl- \ पर आधारित हैं (यदि आप Ctrl से एलर्जी हो तो इसे रीमैप कर सकते हैं), आप मुख्य रूप से s और g का उपयोग करते हैं ....,

कर्नेल के लिए विकास, मुझे इतना पूरा करने की आवश्यकता नहीं थी ...।

वैसे भी, cscope के लिए जाएं, यह बहुत अधिक सुविधाजनक, सटीक है।


4
<< आप सिर्फ कर्नेल के मूल में cscope -R टाइप करते हैं .... कर्नेल के नीचे "cscope" टाइप करने के लिए बेहतर है, अन्यथा आप लिनक्स कर्नेल में मौजूद सभी आर्किटेक्चर के साथ समाप्त हो जाएंगे और इसलिए एक ही C प्रतीक के लिए कई परिभाषा।
कुमार

4

हम्म ... आप शायद ctags के बजाय etags का उपयोग करना चाहिए ...

यदि आप cscope का उपयोग करते हैं, तो आप कॉल चैन देख सकते हैं, अर्थात, जो इस फ़ंक्शन को कॉल करता है और यह फ़ंक्शन किस फ़ंक्शन को कॉल करता है?

मुझे यकीन नहीं है कि यह etags / ctags का उपयोग करके किया जा सकता है ...

यह सिर्फ एक विशेषता है ... उस फ़ाइल का पता लगाने के बारे में क्या है जिसमें एक विशेष फ़ंक्शन परिभाषा है? यह आपको केवल cscope में मिलता है।

मैं cscope और etags दोनों का उपयोग करता हूं, वे दोनों अलग-अलग चीजों के लिए अच्छे हैं, खासकर जब एक बड़े कोडबेस के साथ काम करते हैं, जैसे कि लिनक्स कर्नेल। वास्तव में, मैंने cscope और etags का उपयोग तब शुरू किया जब मैंने लिनक्स कर्नेल / Xen के साथ काम करना शुरू किया।

LXR महान नहीं है, क्योंकि आपको नेटवर्क आदि पर क्लिक करना है, जबकि आप अपने कर्नेल कोड पर cscope और टैग डेटाबेस का निर्माण कर सकते हैं और नेटवर्क (lxr के विपरीत) पर जाने की जरूरत नहीं है


क्या सिर्फ ईमैक्स के लिए एग्स नहीं हैं? मैं विशेष रूप से जी / विम का उपयोग करता हूं।
रॉबर्ट एस। बार्न्स

हाँ आप सही है। मैन पेज से: etags प्रोग्राम का उपयोग टैग टेबल फ़ाइल बनाने के लिए किया जाता है, जो कि emacs (1) द्वारा समझे गए प्रारूप में है; ctags प्रोग्राम का उपयोग vi (1) द्वारा समझे गए प्रारूप में एक समान तालिका बनाने के लिए किया जाता है।
rmk

1
मुझे विश्वास है कि etags और ctags के दो स्वाद हैं। एक है एमेक वन, दूसरा है एक्सटर्बेंट ctags एक। पहले पहली बार emacs के लिए लिखा गया था, लेकिन vi के लिए भी इस्तेमाल किया जा सकता है; दूसरा पहली बार vi के लिए लिखा गया था, लेकिन इसका उपयोग emacs के लिए भी किया जा सकता है। मैं एक दूसरा (अत्यधिक ctags) खोजने के लिए उपयोग करना आसान है, भले ही मैं एक emacs उपयोगकर्ता हूँ। यदि आप अतिउत्साही- ctags पैकेज स्थापित करते हैं, तो etags / ctags बायनेरिज़ के लिंक बदल जाएंगे, और विभिन्न बायनेरिज़ को इंगित करेंगे।
Ustun

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