2009-04-08 13 views
18

के साथ कुशलतापूर्वक "बनाना" कैसे करें मैं जो करने की कोशिश कर रहा हूं वह बहुत ही बुनियादी चीजें लगता है, लेकिन मुझे इसके बारे में कुछ भी नहीं मिला। मैं सामान्य रूप से निर्मित एक परियोजना पर काम कर रहा हूं:विम

project 
|-- bin 
|-- inc 
`-- src 

मैं विम में शामिल कमांड कमांड का उपयोग करके अपना प्रोजेक्ट बनाना चाहता हूं। लेकिन हर बार मुझे :make -C ../ निर्दिष्ट करना होगा। मैं पसंद करूंगा, अगर वर्तमान निर्देशिका में मेकफ़ाइल फ़ाइल नहीं है, तो मूल निर्देशिका में जाएं। मैं पहले से ही

set tags+=./tags;/ 

मेरे .vimrc में पहले से ही करता हूं।

इसके अलावा, मेकअप डिफ़ॉल्ट रूप से बदसूरत है। क्या बनाने के लिए रंग जोड़ने के विकल्प हैं, और त्रुटियों तक सीधे पहुंच (जैसे Emacs में) की अनुमति दें।

धन्यवाद

उत्तर

7

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

यहां मेरा समाधान (+ टैबन्यू के साथ अतिरिक्त)।

fun! SetMkfile() 
    let filemk = "Makefile" 
    let pathmk = "./" 
    let depth = 1 
    while depth < 4 
    if filereadable(pathmk . filemk) 
     return pathmk 
    endif 
    let depth += 1 
    let pathmk = "../" . pathmk 
    endwhile 
    return "." 
endf 

command! -nargs=* Make tabnew | let $mkpath = SetMkfile() | make <args> -C $mkpath | cwindow 10 
1

सेट makecmd = आप विम में quickfix कार्यक्षमता का उपयोग त्रुटियों के माध्यम से नेविगेट कर सकते हैं अपने दूसरे प्रश्न का उत्तर देने के लिए अपने .vimrc

+0

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

+0

जो इतना आसान नहीं है। अपने मेकसीएमडी को एक स्क्रिप्ट बनने के लिए सेट करें जो उस स्थिति का परीक्षण करता है ... यह करना मुश्किल नहीं है :) –

+0

यही वही है जो मैं पूछ रहा हूं। मुझे नहीं पता कि फ़ाइल कैसे मौजूद है या नहीं, vimrc –

3

में "-सी बनाने के ..",। क्विकफिक्स त्रुटियों को एक बफर में संग्रहीत करता है और आपको उनके माध्यम से आगे/पीछे की ओर नेविगेट करने की अनुमति देता है।

आपको वीआईएम को मेक आउटपुट से पहचानने की अनुमति देने के लिए त्रुटि regexp को परिभाषित करना पड़ सकता है, लेकिन मुझे याद है कि यह बॉक्स के बाहर काम करता है (मुझे यह संशोधित करना होगा कि यह कैसे काम करता है जावा चींटी बनाता है - स्पष्ट रूप से यहाँ लागू नहीं होता)

15

what Adam said का थोड़ा सा संशोधन:

:set makeprg=[[\ -f\ Makefile\ ]]\ &&\ make\ \\\|\\\|\ make\ -C\ .. 

न छोड़े गए, इस

[[ -f Makefile ]] && make || make -C .. 

जिसका अर्थ है, दिखावटी है ओ कोड शैली

if file-exists(Makefile) 
then make 
else make -C .. 

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

+15

कोई इस तरह के व्यापक भागने से बचने के लिए' लेट 'क्लॉज का उपयोग कर सकता है:': let and makeprg = '[[-एफ मेकफ़ाइल]] && बनाना || मेक-सी .. ''। –

+2

'[[ए]] && बी || सी' बिल्कुल ठीक नहीं है 'अगर ए तो बी और सी'। यदि 'ए' सत्य है और गैर-शून्य निकास कोड के साथ' बी' रिटर्न है, तो 'c' भी निष्पादित किया जाएगा। –

+0

रेइनर-टर्नबेक: अच्छा बिंदु। कैसे '[[ए]] && (b ; सच) || c'। – rampion

3

अब तक सबसे आसान समाधान अपने src निर्देशिका, जो तरीका है कि कई, कई परियोजनाओं संपादक/आईडीई की परवाह किए बिना स्थापित कर रहे हैं है में एक Makefile है। आपके पास अभी भी एक शीर्ष-स्तरीय मेकफ़ाइल हो सकती है जो make -C src पर कॉल करती है, जहां वे स्रोत में स्थित स्रोत में निर्माण के नियम हैं।

+0

मुझे नहीं पता कि परियोजनाएं जब भी संभव हो शीर्ष स्तर के मेकफ़ाइल का चयन नहीं करती हैं। –

2

एक और दृष्टिकोण अगर आप परियोजना रूट निर्देशिका पर एक makefile है इस्तेमाल किया जा सकता:

project 
|-- bin 
|-- inc 
|-- src 
| Makefile 
चर में अपनी परियोजना पथ के साथ b:projectDir तरह

यह एक "autocommand" का उपयोग करने से पहले उस निर्देशिका के लिए बदलना संभव है :make या :lmake को क्रियान्वित करने शुरू:

augroup changeMakeDir 
    au! 
    autocmd QuickfixCmdPre *make 
       \ if exists("b:projectDir") && 
            \ b:projectDir != expand("%:p:h") | 
        \ exe 'cd ' . b:projectDir | 
       \ endif 
augroup END 

Projectroot plugin 01 सेट करने के लिए इस्तेमाल किया जा सकता; यह प्रोजेक्ट रूट निर्देशिका में वर्तमान निर्देशिका को बदलने के लिए कमांड भी प्रदान करता है:

augroup changeMakeDir 
    au! 
    autocmd QuickfixCmdPre make ProjectRootCD 
augroup END