Makefile और संकलन को खोजने के लिए पुनरावर्ती जाएं


9

इसके साथ समस्या M-x compileयह है कि यदि Makefileवर्तमान निर्देशिका में नहीं है, तो यह विफल हो जाता है।

मैं एक ऐसा कार्य करना चाहता हूं जो इस निर्देशिका से खोजने Makefileऔर चलाने के लिए पुनरावर्ती हो make

मैंने यह प्रश्न देखा है , लेकिन यह पथ-विशिष्ट है, और यह कुछ ऐसा है जिसे मुझे चलाने के बारे में सोचना है।


यदि आप उपयोग projectileकर रहे हैं तो संकलन करने के तरीके हैं projectile-project-root। उदाहरण के लिए, github.com/abo-abo/helm-make
abo-abo

@ abo-abo मैंने प्रक्षेप्य की कोशिश नहीं की थी! ऐसा लगता projectile-compile-projectहै कि मुझे जो चाहिए वो करता है। लेकिन मैं इस निर्भरता के बिना कुछ करना चाहूंगा, यदि संभव हो तो।
फ्लोरियन मार्गाइन

धन्यवाद, प्रोजेक्टाइल-कंपाइल-प्रोजेक्ट मेरे लिए काम करता है
netawater

जवाबों:


15

आप फ़ंक्शन की तलाश कर रहे हैं locate-dominating-file। यहाँ इस समारोह के लिए emacs प्रलेखन है:

(locate-dominating-file FILE NAME)

FILEएक निर्देशिका युक्त से पदानुक्रम निर्देशिका को देखें NAME। किसी फ़ाइल वाली पहली मूल निर्देशिका पर रुकें NAME, और निर्देशिका वापस करें। nilनहीं मिला तो लौटो । एक स्ट्रिंग के बजाय, NAMEएक तर्क (एक निर्देशिका) लेने और एक गैर-शून्य मान वापस करने के लिए एक विधेय हो सकता है यदि वह निर्देशिका वह है जिसके लिए हम देख रहे हैं।

इसके प्रयोग से abo-abo के उत्तर को छोटा किया जा सकता है

(defun desperately-compile ()
  "Traveling up the path, find a Makefile and `compile'."
  (interactive)
  (when (locate-dominating-file default-directory "Makefile")
  (with-temp-buffer
    (cd (locate-dominating-file default-directory "Makefile"))
    (compile "make -k"))))

अच्छा! यह फ़ंक्शन मेरे लूप के समान है, लेकिन एक अच्छी तरह से प्रलेखित और किनारे-केस हैंडलिंग तरीके से। मैं इसे मेरी रेसिपी लिस्ट में जोड़ना सुनिश्चित करूँगा, धन्यवाद।
अबो-अबो

अच्छा! vim का एक समान कार्य है जिसका नाम है findfile, मुझे आश्चर्य हुआ कि emacs के पास यह नहीं था।
फ्लोरियन मार्गाइन

क्या लिस्प के समान कुछ नहीं है let? आप locate-dominating-fileदो बार चल रहे हैं ।
फ्लोरियन मार्गाइन

@FlorianMargaine हाँ, आप का उपयोग कर सकते हैं। मैं सीधे परीक्षण के बिना उत्तर टाइप कर रहा था और लगा कि इससे गलत कोष्ठक होने की संभावना कम है :)
प्रधान

काश मैं इस जवाब को और अधिक वोट दे पाता। धन्यवाद।
एरिक

6

पुनरावर्ती संकलन, कोई निर्भरता संलग्न नहीं:

(defun desperately-compile ()
  "Traveling up the path, find a Makefile and `compile'."
  (interactive)
  (with-temp-buffer
    (while (and (not (file-exists-p "Makefile"))
                (not (equal "/" default-directory)))
      (cd ".."))
    (when (file-exists-p "Makefile")
      (compile "make -k"))))

बहुत बढ़िया! जैसा मुझे चाहिए था यह बिल्कुल वैसा ही है।
फ्लोरियन मार्गाइन

ठीक है, बस लूप की अंतिम स्थिति से सावधान रहें। यदि आप विंडोज पर हैं, तो आपको एक अंतहीन लूप मिल सकता है।
अबो-अबो

साइड सवाल: आप क्यों इस्तेमाल कर रहे हैं with-temp-buffer?
फ्लोरियन मार्गाइन

हाँ, मैं खिड़कियों के बारे में परवाह नहीं है, लेकिन यह उल्लेख करने के लिए धन्यवाद।
फ्लोरियन मार्गाइन

मैं उपयोग करता हूं with-temp-buffer, क्योंकि default-directoryबफर-लोकल है। मैं इसे वर्तमान फ़ाइल के लिए बदलना नहीं चाहता।
अबो-अबो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.