विम और Ctags युक्तियाँ और चालें [बंद]


485

मैंने अपने Vim (या बल्कि gVim) के साथ Ctags (C ++ विकास में मदद करने के लिए) स्थापित किए हैं , और अपने पसंदीदा कमांड, मैक्रोज़, शॉर्टकट, युक्तियों का पता लगाना चाहते हैं जो इसके साथ जाते हैं ...

अपना सर्वश्रेष्ठ शस्त्रागार साझा करें। विम विकास पर C ++ के लिए आप कौन से अन्य विम-ऐड की सिफारिश करेंगे?

संपादित करें कि आप CTags के साथ अन्य ऐड-ऑन का क्या उपयोग करेंगे?

EDIT2 टैग्स के साथ आप किस संस्करण का उपयोग करते हैं? क्या इससे कोई फर्क पड़ता है?

EDIT3 आप बड़ी और छोटी दोनों परियोजनाओं के लिए अपने प्रोग्रामिंग अनुभव को कैसे बढ़ाते हैं?


15
सुनिश्चित करें कि आप बेहतरीन परिणामों के लिए एक्सटिरेंट
idbrii

17
शायद केव रचनात्मक नहीं है?
फ्लोयड

27
हालांकि closed as not constructiveलगभग दो साल पहले, यह मेरे लिए बहुत रचनात्मक है
sazary

15
मुझे लगता है कि इस प्रश्न को बंद करने का वास्तविक कारण यह होना चाहिए था: "यह प्रश्न, बहुत सहायक होने के बावजूद, प्रश्नोत्तर की StackOverflow नीति में फिट नहीं है। इस प्रश्न और उत्तर को Quora पर ले जाएं और उस साइट को बढ़ने दें, जब हम हठपूर्वक बंद करना बंद करते हैं। सवाल और जवाब"।
डिएगो पीनो

2
मैं समझता हूं कि एसओ के नियमों को देखते हुए इस सवाल को बंद क्यों किया गया। लेकिन एक> के लिए 300 वोट दें जवाब के साथ एक> 400 वोट दें सवाल पर चिह्नित करने विलोपन grumpy तरफ एक सा है, है न?
DevSolar

जवाबों:


394

Ctrl+ ]- परिभाषा पर जाएं
Ctrl+ T- परिभाषा से वापस कूदें।
Ctrl+ W Ctrl+ ]- परिभाषा को एक क्षैतिज विभाजन में खोलें

इन पंक्तियों को vimrc में जोड़ें
map <C-\> :tab split<CR>:exec("tag ".expand("<cword>"))<CR>
map <A-]> :vsp <CR>:exec("tag ".expand("<cword>"))<CR>

Ctrl+ \- परिभाषा को एक नए टैब में खोलें
Alt+ ]- परिभाषा को एक ऊर्ध्वाधर विभाजन में खोलें

टैग उत्पन्न होने के बाद। आप निम्नलिखित कुंजियों का उपयोग टैग करने और कार्यों से बाहर टैग करने के लिए कर सकते हैं:

Ctrl+ Left MouseClick- परिभाषा पर जाएं
Ctrl+ Right MouseClick- परिभाषा से वापस कूदें


8
C -] => (नियंत्रण कुंजी) और] कुंजी C - T => (नियंत्रण कुंजी) और T कुंजी ctags के लिए newbies के लिए। नई टैब ट्रिक के लिए धन्यवाद
कुमार

6
इसी तरह, खिड़की को विभाजित करने के बाद Ctrl-w C-]आप C-w T(उर्फ शिफ्ट-टी) को एक नए टैब में विभाजित करने के लिए बदल सकते हैं।
डैश-टॉम-बैंग

1
@ अगर आप टर्मिनल से विम का उपयोग कर रहे हैं, तो आपको ऑल्ट की तरह व्यवहार करने के लिए ऑप्शन कुंजी को बदलने के लिए टर्मिनल वरीयताओं को बदलना होगा। यदि आप MacVim का उपयोग कर रहे हैं तो इस लाइन को 'macmeta सेट करें' vimrc में जोड़ें। Macmeta के लिए डॉक्टर है: h macmeta।
Amjith

17
g C-]बहुत उपयोगी है। यह कई परिभाषाओं के बीच एक का चयन करने के लिए एक त्वरित संवाद खोलता है।
विन्केन्ज़ो पीआई

3
g]भी उपयोगी है। आप टैग नाम पर कर्सर रख सकते हैं और g]मिलान टैग की सूची प्राप्त करने के लिए दबा सकते हैं।
zeekvfu

176

एक पंक्ति जो हमेशा मेरे .vimrc में जाती है:

set tags=./tags;/

यह "टैग" के लिए वर्तमान निर्देशिका में दिखेगा, और जब तक एक पाया नहीं जाता तब तक पेड़ को जड़ तक काम करें। IOW, आप अपने मूल वृक्ष में कहीं भी हो सकते हैं बजाय इसके मूल के।


37
जड़ तक जाना अत्यधिक है। मैं केवल सुझाव देता हूं कि इसके बजाय घर जा रहा हूं: टैग + = टैग; $ गृह
gotgenes

37
मेरे द्वारा काम किए जाने वाले स्रोत पेड़ हमेशा मेरे घर की निर्देशिका में नहीं होते हैं ... और यह कि $ HOME जड़ से दो निर्देशिका दूर हो जाती है ... ठीक है, मैं दो और निर्देशिका लुकअप खरीद सकता हूं। :)
uzi

6
मैं w / uzi से सहमत हूं। अगर मेरी cwd / home / me / प्रोग्रामिंग / foo / bar / baz / bang / bam है जो केवल 8 डायरेक्टरी लुकअप है। मुझे लगता है कि यह गति के लिए आपकी सहिष्णुता पर निर्भर करता है, लेकिन 1 निर्देशिका को देखने का समय मेरी मशीन पर 8 से अलग नहीं है।
नैट मरे

1
यह आपके परिदृश्य पर निर्भर करता है, मुझे अपनी एक मशीन पर गेटगेन्स सुझाव का उपयोग करने की आवश्यकता है क्योंकि / घर में लगभग 8,000 निर्देशिकाएं हैं, और यह थोड़ा सुस्त हो जाता है।
जकरियन

1
क्या कुछ ऐसा ही है cscope?
szx

45

C विकास के लिए एक और उपयोगी प्लगइन cscope है जिस तरह से Ctags आपको परिभाषाओं पर कूदने की सुविधा देता है, Cscope कॉलिंग फ़ंक्शंस में कूदता है ।

यदि आपके पास अपने ~ / बिन / निर्देशिका में cscope है, तो कॉलिंग फ़ंक्शन पर जाने के लिए अपने .vimrc और g ^] का उपयोग करें (देखें: cscope) देखें।

if has("cscope")
    set csprg=~/bin/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
endif

लगभग भूल गया ... बस ctags के रूप में - आपको डेटाबेस को (और समय-समय पर अद्यतन) उत्पन्न करना होगा। मैं निम्नलिखित स्क्रिप्ट का उपयोग करता हूं

select_files > cscope.files
ctags -L cscope.files
ctags -e -L cscope.files
cscope -ub -i cscope.files

जहाँ 'select_files' एक और स्क्रिप्ट है जो C और हेडर फ़ाइलों की सूची को मेकफाइल से निकालती है। इस तरह मैं केवल उन फाइलों को अनुक्रमित करता हूं जो वास्तव में परियोजना द्वारा उपयोग की जाती हैं।


Ctags पर cscope का क्या फायदा है? क्या वे एक-दूसरे की तारीफ करते हैं?
4

4
वे एक दूसरे के पूरक हैं। Ctags एक प्रतीक या एक फ़ंक्शन की परिभाषा पाता है। Cscope एक फ़ंक्शन को कॉल करने वाले सभी स्थानों को पा सकता है। दोनों का उपयोग बड़े स्रोत के पेड़ों में नेविगेशन को बहुत आसान बनाता है।
नीमरोड

1
हालाँकि, AFAIK cscope में C ++ की सीमित समझ है।
ल्यूक हरमिट

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

2
@Whaledawg हां, जब मैं CTRL + दबाता हूं] मेरा साउंड कार्ड आउटपुट में "clap.wav" भेजता है
Patrizio Rullo

27

आप निर्देशिका को अपने ctags लुकअप में जोड़ सकते हैं। उदाहरण के लिए, मेरे पास Qt4 के लिए बनाया गया ctags सूचकांक है, और यह मेरे .vimrc में है:

set tags+=/usr/local/share/ctags/qt4

23

उपरोक्त सभी और ...

code_complete: फ़ंक्शन पैरामीटर पूरा, कोड स्निपेट और बहुत कुछ।

taglist.vim: सोर्स कोड ब्राउज़र (C / C ++, java, perl, python, tcl, sql, php, आदि का समर्थन करता है)


5
मुझे लगता है कि उस टैगलिस्ट को जोड़ना अच्छा होगा। विम सबसे अधिक डाउनलोड किया जाने वाला विम प्लगइन है।
अमित

16

मैं टैग स्टैक के लिए पॉप / पुश से ALT-बाएँ और ALT-दाएँ का उपयोग करता हूं।

" Alt-right/left to navigate forward/backward in the tags stack
map <M-Left> <C-T>
map <M-Right> <C-]>

यदि आप hjklआंदोलन के लिए उपयोग करते हैं तो आप मैप कर सकते हैं <M-h>और <M-l>इसके बजाय।


ctrl -] और ctrl-t के समान नहीं है - मुझे लगता है, आपका सुझाव थोड़ा साफ है।

@ साशा, क्षमा? पता नहीं तुम क्या कह रहे हो। = एक्स नोट करने के लिए, यह भी इसमें काम करता है: मदद।
strager

2
मुझे लगता है कि यह डिफ़ॉल्ट से अधिक सहज और क्लीनर है।
अयमान सेप

1
@ आयमान लेकिन होमरो से हाथ न हिलाने के सिद्धांत का भी उल्लंघन करता है, जैसे कि hjkl बनाम एरो कीज़ का उपयोग करना।
टैंकरस्मैश

@TankorSmash, क्या सिद्धांत?
strager

10

एक ही नाम की कई परिभाषाएँ

<C-w>g<C-]>परिभाषा को एक विभाजन में खोलें, लेकिन ऐसा भी करें :tjumpजो या तो परिभाषा पर जाए या, यदि कई परिभाषाएँ हैं, तो आपको चुनने के लिए परिभाषाओं की सूची प्रस्तुत करता है।


2
पहले कमांड के समान, विम के पास एक :ptagकमांड है जो एक पूर्वावलोकन विंडो में परिभाषा को खोलता है।
इडबरी

1
पूर्वावलोकन विंडो अच्छी है क्योंकि आप इसे किसी भी अन्य विंडो से पीसी के साथ बंद कर सकते हैं, पहले कर्सर को पूर्वावलोकन विंडो में स्थानांतरित किए बिना।
हिक्की नास्की

Ptag के साथ एक नीट ऑटोकैमड ट्रिक भी है जिस पर :h CursorHold-exampleएक कॉन्फ़िगर करने योग्य टाइमआउट के बाद पूर्वावलोकन विंडो में कर्सर के तहत आइटम के लिए टैग प्रदर्शित करता है।
डैश-टॉम-बैंग

+1 के लिए: tjump अब मेरे पास है: tjump <Cr> <Cw> <CR> <C -] से बेहतर काम करता है: imho इस व्यवहार के साथ गठबंधन करना पसंद करेगा: ptag
Andreas Fliesberg

:helpकभी-कभी कमाल होता है ... देखें :help CTRL-W_g}और:ptjump
एंड्रियास फ्लिस्बर्ग

8

मैं जिस कमांड का सबसे अधिक उपयोग कर रहा हूं वह है C-] जो कर्सर के नीचे फ़ंक्शन की परिभाषा के लिए कूदता है। अधिक कॉल का पालन करने के लिए आप इसका अधिक बार उपयोग कर सकते हैं। उसके बाद, सह आपको एक स्तर पर वापस लाएगा, सीआई फिर से गहरा जाता है।


16
सीटी C-] स्टैक में एक स्तर पर वापस जाता है, जबकि सह एक आंदोलन के बाद पिछले कर्सर स्थिति में वापस जाता है। इसलिए यदि आप C-] किसी फंक्शन में आते हैं, तो नीचे पृष्ठ पर, Ct तुरंत वापस जाएगा जबकि Co फंक्शन की शुरुआत में वापस जाएगा, फिर कॉल पर वापस जाएगा।
ग्रेग हेविगिल

6

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

मैं इसे ज्यादातर पायथन विकास के लिए उपयोग करता हूं, लेकिन यह केवल C / C ++ के लिए बेहतर हो सकता है।


5

मैंने एक प्रयोगात्मक प्लगइन में टैग्स हेरफेर किया है मेरा ।

विम में सी ++ विकास के बारे में, मैं पहले ही वहां जवाब दे चुका हूं: मैं अपने सूट का उपयोग करता हूं, और कुछ अन्य प्लगइन्स का।


5

मैं दो साल के लिए अपने विम प्लग को बड़े पर्याप्त सी + + प्रोजेक्ट का समर्थन करने के लिए तैयार कर रहा हूं। आप उन पर एक नज़र डाल सकते हैं।

वे ctags और cscsope का उपयोग करते हैं।

http://www.vim.org/scripts/script.php?script_id=1638
http://www.vim.org/scripts/script.php?script_id=2507


4

मैंने अपनी .gvimrc फ़ाइल में निम्नलिखित डाला, जो gvim शुरू होने पर टैग फ़ाइल के लिए किसी भी बिंदु से पेड़ को खोजता है:

function SetTags()
    let curdir = getcwd()

    while !filereadable("tags") && getcwd() != "/"
        cd ..
    endwhile

    if filereadable("tags")
        execute "set tags=" . getcwd() . "/tags"
    endif

    execute "cd " . curdir
endfunction

call SetTags()

फिर मैं समय-समय पर अपने स्रोत पेड़ के शीर्ष पर एक टैग फ़ाइल को एक स्क्रिप्ट के साथ पुनर्जीवित करता हूं जो इस तरह दिखता है:

#!/bin/bash

find . -regex ".*\.\(c\|h\|hpp\|cc\|cpp\)" -print | ctags --totals --recurse --extra="+qf" --fields="+i" -L -

7
आपने अभी ऊपर की ओर खोज की है। देखें: h फ़ाइल-खोज यह भी देखें stackoverflow.com/questions/563616/vimctags-tips-and-tricks/…
gotgenes

2

मैं macos में विम का उपयोग करता हूं, और मूल ctags अच्छी तरह से काम नहीं करता है, इसलिए मैं नवीनतम डाउनलोड करता हूं और इसे स्थापित करने के लिए कॉन्फ़िगर करता हूं। मैं / usr / स्थानीय / बिन / ctags में ctgas स्थापित करता हूं (मूल एक रखने के लिए)

"taglist
let Tlist_Ctags_Cmd = "/usr/local/bin/ctags"
let Tlist_WinWidth = 50
map <leader>ta :TlistToggle<cr>
map <leader>bta :!/usr/local/bin/ctags -R .<CR>
set tags=tags;/
map <M-j> <C-]>
map <M-k> <C-T>

1

मैंने cscope के set tags+=./tags;/लिए काम करने के लिए ऊपर SetTags () खोज फ़ंक्शन (जिसे समकक्ष द्वारा प्रतिस्थापित किया जाना चाहिए ) को अनुकूलित किया। काम करने लगता है!

"cscope file-searching alternative
function SetCscope()
    let curdir = getcwd()

    while !filereadable("cscope.out") && getcwd() != "/"
            cd ..
                endwhile

    if filereadable("cscope.out")
            execute "cs add " . getcwd() . "/cscope.out"
                endif

    execute "cd " . curdir
    endfunction

call SetCscope()

3
जैसा कि गेटगेन्स ने कहा, आपने अभी ऊपर की ओर खोज की है। देखें: h फ़ाइल-खोज एक प्रासंगिक उदाहरण के लिए इस प्लगइन को देखें ।
इडबरी

1

ऊपर SetCscope () फ़ंक्शन पर एक और पुनरावृत्ति। वह cscope प्री-पाथ सेट करता है जो कि dir पर होने के बिना मैच पाने के लिए जहां "cscope.out" है:

function s:FindFile(file)
    let curdir = getcwd()
    let found = curdir
    while !filereadable(a:file) && found != "/"
        cd ..
        let found = getcwd()
    endwhile
    execute "cd " . curdir
    return found
endfunction

if has('cscope')    
    let $CSCOPE_DIR=s:FindFile("cscope.out")
    let $CSCOPE_DB=$CSCOPE_DIR."/cscope.out"
    if filereadable($CSCOPE_DB)
        cscope add $CSCOPE_DB $CSCOPE_DIR
    endif

    command -nargs=0 Cscope !cscope -ub -R &
endif

3
जैसा कि गेटगेन्स ने कहा, आपने अभी ऊपर की ओर खोज की है। देखें: h फ़ाइल-खोज एक प्रासंगिक उदाहरण के लिए इस प्लगइन को देखें ।
इदरीबी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.