क्या मैं एक मल्टीपल सी ++ सोर्स फाइल प्रोजेक्ट में फंक्शन डिक्लेरेशन या डेफिनिशन पर जा सकता हूं?


15

क्या मैं एक मल्टीपल सी ++ सोर्स फाइल प्रोजेक्ट में फंक्शन डिक्लेरेशन या डेफिनिशन पर जा सकता हूं?

कहते हैं कि मेरे पास एक हेडर फ़ाइल है foo.hpp:

int bar();

और एक स्रोत फ़ाइल foo.cpp:

#include "foo.hpp"
int bar() { return 42; }

और एक मुख्य फ़ाइल main.cpp:

#include "foo.hpp"
int main() { bar(); return 0; }

क्या फंक्शन की परिभाषा और घोषणा दोनों फ़ंक्शन bar()से मिल सकती है main?

जवाबों:


15

इसको हासिल करने का सबसे आसान तरीका एक्सुब्रेन्ट ctags है। GNU / Linux (जैसे उबंटू या डेबियन) के तहत आपको बस करने में सक्षम होना चाहिए

sudo apt-get install exuberant-ctags

(OSX के लिए "$ काढ़ा स्थापित ctags" पर्याप्त होना चाहिए; विंडोज के लिए आप http://ctags.sourceforge.net/ पर जाना चाहते हैं और स्टैंडअलोन निष्पादन योग्य डाउनलोड कर सकते हैं )

फिर अपने प्रोजेक्ट के रूट फ़ोल्डर में नेविगेट करें और चलाएं

ctags -R --exclude=.git .

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

Ctrl + ]

अपने कर्सर को उस फ़ंक्शन पर रखा जाए जिसके लिए आप कार्यान्वयन देखना चाहते हैं। अन्य संयोजन और कई कमांड मोड फ़ंक्शन हैं जो आपको ctags द्वारा अपने कोड के माध्यम से नेविगेट करने देते हैं (जैसे Ctrl+ tपुराने टैग स्टैक के लिए कूदना)। :help 29.1अवलोकन के लिए देखें ।

ध्यान दें कि आपको कोड में प्रत्येक महत्वपूर्ण परिवर्तन के लिए ctags को फिर से चलाना है और इसे अपनी परियोजना को फिर से अनुक्रमित करने दें। आप या तो इसे मैन्युअल रूप से कर सकते हैं, या इसे हॉटकी या लेखन पर करने के लिए विम सिखा सकते हैं।

संकेत: यदि आप ctags का व्यापक उपयोग करते हैं, तो शायद vim-taglist ( http://vim-taglist.sourceforge.net ) प्लगइन भी देखने लायक है। यह आपको उस वर्ग / फ़ाइल के सभी कार्यों की एक सूची के साथ एक आईडीई-शैली की रूपरेखा देता है।


जानने लायक दो बातें: सार्वभौमिक-सीटीजी ने कई मायनों में अतिरंजित-सीटीजी को अलंकृत किया है। इसके अलावा, git को अपने टैग्स को कैसे सिंक करना है
D. Ben Knoble

4

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

पहले एक और अधिक फैशनेबल: YouCompleteMe में एक :GoToDefinitionऔर एक :GoToDeclarationकमांड है।

मैं जो उपयोग करता हूं (यह 10 साल की लंबी आदतों को बदलना मुश्किल है)। मेरे lh-टैग प्लगइन में ctags डेटाबेस उत्पन्न करने और इसे वृद्धिशील रूप से अपडेट करने का एक तरीका है। और यह CTRL+W Meta+Downसभी तरह की घोषणाओं और परिभाषाओं को प्रस्तुत करने के लिए एक रास्ता भी प्रदान करता है ( जो कि कर्सर के नीचे क्या है / (जो चुना गया है)। जैसा कि यह समाधान ctags पर निर्भर करता है, यह पता करने में सक्षम नहीं होगा कि कर्सर के तहत पहचानकर्ता को अधिभार किससे संबंधित है। अन्य ctags आधारित समाधान इस विषय पर खराब (/ जितना अच्छा) होना चाहिए। हालांकि YCM यहां बहुत बेहतर होना चाहिए।

खुलासा: मैंने lh-tags को एक अधिक एर्गोनोमिक विकल्प के रूप में लागू किया :tselect

(वास्तव में मुझे एक तीसरा समाधान याद है: मैंने क्लैंग-इंडेकर और संबंधित विम प्लगइन का एक कांटा शुरू किया था जिसने इसे एनकैप्सुलेट किया होगा। लेकिन YCM के साथ, मैं इस समाधान को भूल जाऊंगा)

संपादित करें: 2019 तक, सबसे कुशल समाधान एलएसपी सर्वरों पर भरोसा करते हैं । मैं COC + ccls को इंडेक्स, जंप और कई और चीजें करने के लिए उपयोग कर रहा हूं । जब मैं किसी प्रोजेक्ट के लिए COC को कॉन्फ़िगर करने के लिए बहुत आलसी हूं, जिस पर मैं ज्यादा समय नहीं बिताऊंगा या जहां मैं क्लैंग और ccls के हाल के संस्करणों को स्थापित नहीं कर सकता / सकती हूं, तो मैं टैग आधारित समाधानों के लिए वापस आ रहा हूं।


1
इनपुट के लिए धन्यवाद, प्रत्येक समाधान का परीक्षण करेगा। मैंने YouCompleteMe का परीक्षण किया और केवल GoToDeclarationकई स्रोत फ़ाइलों के साथ काम करता है। यहाँ के बारे में किए गए दस्तावेज़ों से एक उद्धरण है GoToDefinition: For C-family languages this only works ... when the definition of the symbol is in the current translation unit.। इसके अलावा, आदेश हैं :YcmCompleter GoTo*
एलन हसेगावा

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

3

कुछ विकल्प हैं। पहले वाला है ctags। यदि आपको अधिक उन्नत इंडेक्सर की आवश्यकता है तो cscopeएक बेहतर विकल्प है। उदाहरण के लिए, यह आपको दिए गए फ़ंक्शन के सभी कॉलर्स को सूचीबद्ध करने की अनुमति देगा । ये उपकरण वास्तव में इसे ठीक से समझे बिना आपके कोड को अनुक्रमित करेंगे (उनके पास एक साधारण व्याकरण की परिभाषा है, यह जानने के लिए कि दिए गए प्रतीक का मतलब क्या है)। उस व्याकरण का विस्तार करना भी अपेक्षाकृत आसान है। taglistप्लगइन एक इन के लिए होना आवश्यक है और यह taglist में शो परिणाम के लिए इंडेक्सर व्याकरण का विस्तार करना संभव है।

यदि आपको इंडेक्सर से अधिक कुछ चाहिए तो सिंटैक्स चेकिंग की तरह तो YouCompleteMeशायद जाने का रास्ता है। यह सबसे ऊपर है llvmऔर इस प्रकार इसका उचित पार्सर है। यह कोड सिंटैक्स और शब्दार्थ को जांचने की अनुमति देता है ।

फिर यदि आप एक ऐसे कोड के साथ काम करते हैं जिसमें डोमेन विशिष्ट भाषा या एम्बेडेड कोड होता है, तो आप अक्सर फ़ाइलों को पूरा करने के लिए समाप्त हो जाते हैं। वैकल्पिक प्रति Ackलिपि है जो इस कार्य में मदद करने का प्रयास करती है।


0

मुझे लगता है कि ctags यह वही है जो आपको चाहिए। Vim मूल रूप से ctags के साथ एकीकृत है, और परिभाषाओं और घोषणाओं को पूरा करने के लिए आसानी से कूद सकता है।

इस लेख http://andrew.stwrt.ca/posts/vim-ctags पर एक नज़र डालें


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