2012-03-12 7 views
14

मैं Emacs संकलन मोड के माध्यम से यू-बूट संकलित करने की कोशिश कर रहा हूं, और ऐसा लगता है कि Emacs को पता नहीं है कि बैश पर्यावरण चर कैसे ढूंढें। भले ही मैं उन्हें सेट करता हूं, और Emacs shell emulation के माध्यम से संकलित कर सकता हूं, संकलन मोड अभी भी संकलित करने का प्रयास करता है जैसे कि वे वहां नहीं हैं।मैं इमाक्स को संकलन के लिए बैश पर्यावरण चर को कैसे पहचानूं?

इसे और अधिक पर्यावरण जागरूक बनाने के लिए मुझे क्या करने की ज़रूरत है?

उत्तर

26

आप के लिए की तरह कुछ जोड़ने की कोशिश कर सकते हैं अपने .emacs:

(let ((path (shell-command-to-string ". ~/.bashrc; echo -n $PATH"))) 
    (setenv "PATH" path) 
    (setq exec-path 
     (append 
     (split-string-and-unquote path ":") 
     exec-path))) 

आप .bash_profile या में env चर निर्धारित किया है के आधार पर .bashrc आप इस स्निपेट को थोड़ा समायोजित करने की आवश्यकता हो सकती है। उदाहरण PATH चर के लिए है, जो थोड़ा अधिक विशेष है (क्योंकि आपको Emacs में exec-path भी सेट करना होगा), लेकिन मनमाने ढंग से चर के लिए काम करने के लिए बढ़ाया जा सकता है - आपके पास वेरिएबल की एक सूची हो सकती है जिसे पढ़ना है .bashrc और Emacs में सेट करें।

मुझे यकीन नहीं है कि आप ओएस एक्स या जीएनयू/लिनक्स का उपयोग कर रहे हैं या नहीं। लिनक्स में जीयूआई के मेनू-बार से Emacs शुरू करना आम तौर पर एक Emacs में परिणाम होगा जो कमांड लाइन से लॉन्च किए गए PATH के समान नहीं है। यह समस्या पहले xdm Xsession स्क्रिप्ट पर वापस आती है, और जब वे ठीक करने के लिए काफी आसान हैं (मूल रूप से Xsessionwrapper स्क्रिप्ट का उपयोग करें जो exec $SHELL -c Xsession करता है तो खोल को उपयोगकर्ता के Xsession चलाने से पहले चलाया जाता है), किसी को भी बहुत लंबे समय तक ऐसा करने में परेशानी नहीं होती है समय (और मुझे संदेह है कि कोई भी करेगा)। जहां तक ​​मुझे पता है कि समस्या भी मध्यम xdm वंशजों में kdm और gdm में मौजूद है।

ओएस एक्स पर एनवी चर के हैंडलिंग पूरी तरह से एक और समस्या है और अपने एनएनवी वेरिएबल्स प्राप्त करने के लिए आपको आमतौर पर कमांड लाइन से Emacs चलाने की आवश्यकता है जैसे /Applications/Emacs.app/Contents/MacOS/Emacs या ~/.MacOSX/environment.plist के साथ खेलो। कोड स्निपेट जो मैंने प्रदान किया है, आपको दोनों मामलों में कवर करना चाहिए।

अद्यतन

हाल ही में इस प्रक्रिया exec-path-from-shell विस्तार के द्वारा आसान बना दिया गया था। यह emacs $PATH को कम या ज्यादा तरीके से सेट करता है, लेकिन एक एक्सटेंशन का उपयोग आमतौर पर समाधान को हैक करने के लिए बेहतर होता है।

+0

यह Flymake perlbrew से सही पर्ल का उपयोग नहीं के साथ मेरी समस्या का समाधान। perlbrew-mini.el विपरीत – titanofold

+1

_exec-पथ-से-shell_ महान है और _ensime_ जो प्रारंभ नहीं हो सका और 'फेंक गलत प्रकार तर्क stringp nil' त्रुटि के साथ मेरी समस्या का समाधान। – cyrillk

+0

आप विभाजन स्ट्रिंग और गंदें शब्द बोलना विभाजन स्ट्रिंग के बजाय क्यों प्रयोग करते हैं? –

1

यह आपके प्रश्न का सख्ती से जवाब नहीं देता है, लेकिन आप हमेशा make कमांड लाइन पर पर्यावरण चर पारित कर सकते हैं। उदाहरण के लिए: एमएक्सcompileआरईटीmake -k CXXFLAGS='-Wall'आरईटी

4

यह वह जगह है जहां प्रक्रिया है कि emacs शुरू कर दिया की वातावरण चर हैं:

- कमान: getenv वर

इस समारोह वातावरण चर वर का मान देता है, एक स्ट्रिंग के रूप । var एक स्ट्रिंग होना चाहिए। यदि वातावरण में var अपरिभाषित है, तो getenv शून्य लौटाता है। यह '' ' देता है यदि var सेट है लेकिन शून्य है। Emacs के भीतर, पर्यावरण चर की एक सूची और उनके मान परिवर्तनीय प्रक्रिया-पर्यावरण में रखा जाता है।

 (getenv "USER") 
      ⇒ "lewis" 

- वैरिएबल: प्रक्रिया पर्यावरण

यह चर स्ट्रिंग की एक सूची है, हर एक वातावरण चर का वर्णन। इस चर के माध्यम से फ़ंक्शन getenv और setenv कार्य करता है।

 process-environment 
     ⇒ ("PATH=/usr/local/bin:/usr/bin:/bin" 
      "USER=lewis" 
      "TERM=xterm" 
      "SHELL=/bin/bash" 
      "HOME=/home/lewis" 
      ...) 

आप यह सोचते हैं होने के लिए कि Emacs एक बैश सत्र से शुरू किया गया था लगते हैं। हालांकि, एक्स के तहत अक्सर प्रक्रिया sh सत्र से शुरू की जाती है, जो आपके ~/.bashrc स्क्रिप्ट में सेट किए गए पर्यावरण चर को पढ़ती है। इस नाकाम करने के लिए एक आसान तरीका बैश बजाय उपयोग करने के लिए अपने ~/.xinitrc फ़ाइल को बदलने के लिए है (यह फ़ाइल के शीर्ष पर #!/bin/bash जोड़ने के रूप में सरल हो सकता है)।

स्रोत: gnu.org

+1

क्या आपका मतलब '#!/Bin/bash' था? – Elena

+0

धन्यवाद, @ एलेना। फिक्स्ड। :) – dmvianna

संबंधित मुद्दे