Vim में फ़ंक्शन परिभाषा पर जाएं


241

मैं विम का उपयोग करके फ़ंक्शन परिभाषा में कैसे कूद सकता हूं? उदाहरण के लिए, विजुअल असिस्ट के साथ, मैं एक फंक्शन के तहत Alt+ टाइप कर सकता हूं gऔर यह एक मेन्यू खोलता है जिसमें फाइल्स को परिभाषाओं के साथ सूचीबद्ध किया जाता है।

मैं इस तरह से कुछ कैसे कर सकता हूं?


2
ग्नू ग्लोबल ctags से बेहतर है।
जिचो

6
@ जिचाओ, क्या आप हमें अपने अनुभव के बारे में कुछ और जानकारी दे सकते हैं? किन भाषाओं के साथ ग्नू ग्लोबल ने आपके लिए बेहतर काम किया? क्या इस संदर्भ में आपके द्वारा पसंद किए जाने के संदर्भ में कुछ और है? या शायद आपने इसे कई अलग-अलग परिदृश्यों में उपयोग किया है और आप इसे ज्यादातर / हमेशा पसंद करते हैं? आपको इसके बारे में क्या पसंद है? धन्यवाद।
still_dreaming_1

@ जिचाओ मैंने आपकी टिप्पणी को सामुदायिक विकि उत्तर में बदल दिया। मैं इस उत्तर के लिए आपके परिवर्तनों और इनपुट का स्वागत करूंगा।
still_dreaming_1

जवाबों:


213

Ctags का उपयोग करें। एक टैग फ़ाइल बनाएं, और बताएं कि यह कहां उपयोग हो रहा है: टैग कमांड। तब आप केवल फ़ंक्शन परिभाषा का उपयोग करके कूद सकते हैं Ctrl-]

इस सवाल में और टैग ट्रिक्स और टिप्स हैं ।


2
php C- जैसा पर्याप्त है कि "एक्सुबेरेंट ctags" को इसके साथ काम करना चाहिए। पता नहीं अगर यह एक अजगर मोड है।
पॉल टॉम्बलिन

5
Cscope के साथ कोई अनुभव नहीं है। क्या है?
पॉल टॉम्बलिन

10
C की समानता का CTTS समर्थन PHP से कोई लेना-देना नहीं है। यह PHP के साथ-साथ Python को भी सपोर्ट करता है। पूरा समर्थन देखने के लिए ctags.sourceforge.net/languages.html पर एक नज़र डालें ।
डेटा

1
मैं ctags कैसे उत्पन्न करूं?

4
उन संदर्भों को प्राप्त करना बहुत अच्छा होगा जहां उन ctags को संचालित करना सीखना सबसे अच्छा है।
Fzs2

137

यदि सब कुछ एक फ़ाइल में समाहित है, तो कमांड है gd(जैसे 'गोटो परिभाषा'), जो आपको कर्सर के नीचे शब्द की फ़ाइल में पहली घटना के लिए ले जाएगा, जो अक्सर परिभाषा है।


1
क्या होगा यदि मेरे पास कर्सर के नीचे शब्द नहीं है (मैं इसे टाइप करूँगा)?
फवाद सऊद

@FuadSaud बस इसका उपयोग करके खोज करते हैं/
LucasB

6
/लगभग हमेशा सटीक नहीं है, क्योंकि यह सभी महासागरों से मेल खाने वाला है। मुझे पता चला कि आप वास्तव में :tag <function_name>ctags के माध्यम से परिभाषा पर कूद सकते हैं ।
फवाद सऊद

@ फड जम्प टू डेफिनिशन फीचर एक आइडेंटिफायर को एक कर्सर (हर आईडीई में) के साथ इंगित करने पर निर्भर करता है। टाइप करना / खोजना एक अन्य विशेषता है, आप उन्हें भ्रमित कर रहे हैं।
खूनी

101

g* ctags की स्थापना के बिना एक अच्छा काम करता है।

वह है, कर्सर के नीचे शब्द (इस मामले में, फ़ंक्शन नाम) की खोज करने के लिए टाइप करें g, *(या बस *- नीचे देखें)। फिर nअगले पर जाने के लिए दबाएं (या Shift-n पिछले) घटना के ।

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

--Edit-- हालांकि मैं लंबे समय से g * का उपयोग कर रहा हूं, मैंने हाल ही में इन शॉर्टकट के लिए दो शॉर्टकट खोजे हैं!

(ए) *कर्सर के नीचे शब्द की अगली घटना के लिए कूद जाएगा। (टाइप करने की आवश्यकता नहीं हैg Vi में 'गोटो' कमांड )।

(ख) # पिछली घटना में, समान फैशन में जाता है।

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


10
खोज के बीच शब्द सीमा *और अंतर g*है। *एक \<keyword\>खोज करता है ( \bkeyword\bनियमित रेगेक्स की तरह), जबकि शब्द सीमाओं के बिना g*खोज करता keywordहै।
निकोलई एस।

यदि आपके पास किसी फ़ाइल में फ़ंक्शन की सौ घटनाएँ *हैं, तो परिभाषा को खोजने से पहले आपको औसतन 50 हिट्स पर ले जाना है।
n

49

अपने प्रोग्राम में किसी भी वैरिएबल पर कर्सर रखते समय gdया gDउसका उपयोग करें ।

  1. gd आपको स्थानीय घोषणा पर ले जाएगा।
  2. gD आपको वैश्विक घोषणा पर ले जाएगा।

अधिक नेविगेशन विकल्प यहां मिल सकते हैं

लिनक्स कर्नेल जैसे बड़े प्रोजेक्ट को पार करने के लिए cscope का उपयोग करें ।


14

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

इसके अलावा आप cscope और उसके ' फाइंड ग्लोबल सिंबल' फंक्शन का उपयोग कर सकते हैं । लेकिन आपके विम को + cscope समर्थन के साथ संकलित करना होगा जो कि बिल्ड का एक विकल्प डिफ़ॉल्ट नहीं है।

यदि आप जानते हैं कि फ़ंक्शन को वर्तमान फ़ाइल में परिभाषित किया गया है, तो आप कर्सर के नीचे प्रतीक की परिभाषा के लिए कूदने के लिए सामान्य मोड में 'जीडी' कीस्ट्रोक्स का उपयोग कर सकते हैं।

यहाँ नेविगेशन के लिए सबसे ज्यादा डाउनलोड किया जाने वाला प्लगइन है
http://www.vim.org/scripts/script.php?script_id=273

यहाँ एक है जिसे मैंने संदर्भ में चयन करने के लिए लिखा है जबकि टैग
http://www.vim.org/scripts/script.php?script_250=2507 पर जाएं


हाय @ mykola-golubyev, स्क्रिप्ट के Detailed descriptionअनुभाग में आपके द्वारा प्रदत्त लिंक #2507टूट गया है। क्या आप कृपया एक और प्रदान कर सकते हैं?
FelikZ

12

एक अन्य सामान्य तकनीक है, फ़ंक्शन नाम को पहले कॉलम में रखना। यह परिभाषा को एक सरल खोज के साथ पाया जा सकता है।

int
main(int argc, char *argv[])
{
    ...
}

उपरोक्त फ़ंक्शन तब /^mainफ़ाइल के अंदर या :grep -r '^main' *.cकिसी निर्देशिका में पाया जा सकता है । जब तक कोड को ठीक से इंडेंट किया जाता है, जब तक कि पहचानकर्ता एक पंक्ति की शुरुआत में फ़ंक्शन परिभाषा में होता है।

बेशक, अगर आप इस बिंदु से ctags का उपयोग नहीं कर रहे हैं तो आपको खुद पर शर्म आनी चाहिए! हालाँकि, मुझे यह कोडिंग मानक एक सहायक जोड़ भी लगता है।


13
मैंने हमेशा सोचा है कि कुछ कोडर अपने हस्ताक्षर इस तरह क्यों लिखते हैं!
टार्चर

साथ ही, जब आप पहले कॉलम में '{' सहित अपने फंक्शन सिग्नेचर लिखते हैं, तो आप फाइल को आगे बढ़ाने के लिए]]] और [और [पीछे जाने के लिए] जल्दी-जल्दी घूम सकते हैं।
बेंटचिनरिंग

12

टी एल; डॉ:

आधुनिक तरीका है COC का उपयोग इंटेलीजेंस -जैसे पूर्ण होने के लिए और जंप-टू-डेफिनिशन के लिए एक या अधिक भाषा सर्वर (LS) और (जिस तरह से अधिक)। और भी अधिक कार्यक्षमता के लिए (लेकिन जम्प-टू-डेफिनिशन के लिए इसकी आवश्यकता नहीं है) आप एक या अधिक डिबगर्स स्थापित कर सकते हैं और पूर्ण विकसित आईडीई अनुभव प्राप्त कर सकते हैं। जल्दी शुरू:

  1. अपने VIM प्लग-इन को प्रबंधित करने के लिए विम-प्लग स्थापित करें
  2. शीर्ष पर COC और (वैकल्पिक रूप से) Vimspector जोड़ें ~/.vimrc:
    call plug#begin()
    Plug 'neoclide/coc.nvim', {'branch': 'release'}
    Plug 'puremourning/vimspector'
    call plug#end()
    
  3. :source $MYVIMRC | PlugInstallVIM प्लग-इन डाउनलोड करने के लिए कॉल करें
  4. सीओसी एक्सटेंशन तक आसान पहुंच प्राप्त करने के लिए पुनरारंभ vimकरें और कॉल करें:CocInstall coc-marketplace
  5. कॉल :CocList marketplaceऔर भाषा सर्वर के लिए खोज, उदाहरण के लिए:
    • pythonखोजने के लिए टाइप करें coc-jedi,
    • phpखोजने के लिए टाइप करें coc-phpls, आदि।
  6. (वैकल्पिक रूप से) install_gadget.py --helpउपलब्ध डिबगर्स के लिए देखें , जैसे:
    • ./install_gadget.py --enable-python,
    • ./install_gadget.py --force-enable-php, आदि।

पूर्ण उत्तर:

भाषा सर्वर (LS) एक अलग स्टैंडअलोन अनुप्रयोग है (प्रत्येक प्रोग्रामिंग भाषा के लिए एक) जो पृष्ठभूमि में चलता है और वास्तविक समय में आपके संपादक (किसी भी संपादक, न केवल vim) के लिए अतिरिक्त क्षमताओं को उजागर करने में आपकी पूरी परियोजना का विश्लेषण करता है । आपको चीजें मिलती हैं:

  • namespace जागरूक टैग पूरा होना
  • परिभाषा के लिए कूदो
  • अगली / पिछली त्रुटि पर जाएं
  • किसी वस्तु के सभी संदर्भ खोजें
  • सभी इंटरफ़ेस कार्यान्वयन खोजें
  • एक पूरे प्रोजेक्ट का नाम बदला
  • होवर पर प्रलेखन
  • स्निपेट्स, कोड क्रियाएँ, स्वरूपण, लाइनिंग और बहुत कुछ ...

भाषा सर्वर के साथ संचार भाषा सर्वर प्रोटोकॉल (एलएसपी) के माध्यम से होता है । दोनों nvimऔर vim8प्लग-इन के माध्यम से (या अधिक) समर्थन LSP, सबसे लोकप्रिय किया जा रहा है पूरा होने की विजय (COC)।

लैंग सर्वर वेबसाइट पर सक्रिय रूप से विकसित भाषा सर्वरों और उनकी क्षमताओं की सूची उपलब्ध है । उन सभी को COC एक्सटेंशन द्वारा प्रदान नहीं किया गया है। यदि आप उनमें से किसी एक का उपयोग करना चाहते हैं, तो आप या तो स्वयं COC एक्सटेंशन लिख सकते हैं या मैन्युअल रूप से LS स्थापित कर सकते हैं और COC के विकल्प के रूप में VIM प्लग-इन के बाद कॉम्बो का उपयोग कर सकते हैं:

  • LanguageClient - LSP को संभालता है
  • deoplete - जैसे ही आप टाइप करते हैं पूरा हो जाता है

डिबगर्स के साथ संचार डिबग एडाप्टर प्रोटोकॉल (डीएपी) के माध्यम से होता है । VIM के लिए सबसे लोकप्रिय DAP प्लग-इन Vimspector है

भाषा सर्वर प्रोटोकॉल (एलएसपी) Microsoft द्वारा विज़ुअल स्टूडियो कोड के लिए बनाया गया था और एक ओपन सोर्स प्रोजेक्ट के रूप में एक अनुमत एमआईटी लाइसेंस (रेड हैट और कोडेनवी के साथ सहयोग से मानकीकृत) के साथ जारी किया गया था। बाद में माइक्रोसॉफ्ट ने डिबग एडेप्टर प्रोटोकॉल (डीएपी) को भी जारी किया । VSCode द्वारा समर्थित कोई भी भाषा VIM में समर्थित है।

मैं व्यक्तिगत रूप से सीओसी + भाषा + सीओसी एक्सटेंशन द्वारा प्रदान सर्वर का उपयोग की सलाह देते हैं ALE अतिरिक्त linting के लिए (लेकिन LSP समर्थन सीओसी के साथ से बचने के संघर्ष करने के लिए निष्क्रिय के साथ) + Vimspector + Vimspector द्वारा प्रदान की डिबगर + निम्नलिखित विम प्लग इन ( "गैजेट" कहा जाता है):

call plug#begin()
Plug 'neoclide/coc.nvim'
Plug 'dense-analysis/ale'
Plug 'puremourning/vimspector'
Plug 'scrooloose/nerdtree'
Plug 'scrooloose/nerdcommenter'
Plug 'sheerun/vim-polyglot'
Plug 'yggdroot/indentline'
Plug 'tpope/vim-surround'
Plug 'kana/vim-textobj-user'
  \| Plug 'glts/vim-textobj-comment'
Plug 'janko/vim-test'
Plug 'vim-scripts/vcscommand.vim'
Plug 'mhinz/vim-signify'
call plug#end()

आप प्रत्येक को यह देखने के लिए Google कर सकते हैं कि वे क्या करते हैं।


11

1- एक्सटर्बेंट ctags स्थापित करें। यदि आप osx का उपयोग कर रहे हैं, तो यह आलेख थोड़ी सी चाल दिखाता है: http://www.runtime-era.com/2012/05/exuberant-ctags-in-osx-107.html

2- यदि आप केवल अपनी निर्देशिका में फ़ाइलों के लिए ctags शामिल करना चाहते हैं, तो अपनी निर्देशिका में इस आदेश को चलाएँ:

ctags -R

यह आपके लिए एक "टैग" फ़ाइल बनाएगा।

3- यदि आप रूबी का उपयोग कर रहे हैं और अपने रत्नों के लिए ctags को शामिल करना चाहते हैं (यह रूबीमोशन और मेरे द्वारा विकसित किए गए स्थानीय रत्नों के साथ वास्तव में मेरे लिए उपयोगी है), निम्न कार्य करें:

ctags --exclude=.git --exclude='*.log' -R * `bundle show --paths`

साभार: https://coderwall.com/p/lv1qww (ध्यान दें कि मैंने -e विकल्प को छोड़ दिया था, जो vim के बजाय emacs के लिए टैग बनाता है)

4- अपने ~ / .vimrc पर निम्न पंक्ति जोड़ें

set autochdir 
set tags+=./tags;

(क्यों अर्ध उपनिवेश: http://vim.wikia.com/wiki/Single_tags_file_for_a_source_tree )

5- उस शब्द पर जाएं जिसे आप फॉलो और हिट करना चाहते हैं ctrl + ]; यदि आप वापस जाना चाहते हैं, तो उपयोग करें ctrl+o(स्रोत: https://stackoverflow.com/a/53929/226255 )


उल्लिखित मैक लेख का लिंक टूट गया है। यहाँ अपडेट किया गया लिंक है: runtime-era.blogspot.com/2012/05/… आपका सबसे अच्छा दांव
होमब्रेव

6

पॉल की दूसरी प्रतिक्रिया के लिए: हाँ, ctags (विशेष रूप से विपुल-ctags ( http://ctags.sourceforge.net/ )) महान है। मैंने इसे अपने vimrc में भी जोड़ा है, इसलिए मैं संपूर्ण प्रोजेक्ट के लिए एक टैग फ़ाइल का उपयोग कर सकता हूं:

set tags=tags;/

2

स्थापित करें cscope। यह बहुत पसंद है ctagsलेकिन अधिक शक्तिशाली है। Ctrl+ के बजाय, परिभाषा में जाने के लिए ], Ctrl+ \+ करें g। बेशक आप समवर्ती दोनों का उपयोग कर सकते हैं। लेकिन एक बड़ी परियोजना (लिनक्स कर्नेल कहते हैं) के साथ, cscope मील से आगे है।


1

Ctags उत्पन्न करने के बाद, आप निम्नलिखित का उपयोग vim में भी कर सकते हैं:

:tag <f_name>

ऊपर आपको फंक्शन डेफिनिशन में ले जाएगा।

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