निष्पादन-पथ और $ पथ


28

मैंने ऑनलाइन उदाहरण देखे हैं जहां लोग Emacs में डिफ़ॉल्ट पथ के साथ पथ जोड़ते हैं:

(add-to-list 'exec-path "/usr/local/bin/")

मैं Elisp के लिए नया हूं, और मुझे लगता है कि मैं समझता हूं कि ऊपर दिया गया कथन क्या है, लेकिन मेरे कुछ प्रश्न हैं:

  • में किस क्रम Emacs निष्पादन रास्तों के माध्यम से खोज करता है? उदाहरण के लिए, क्या यह $PATH(env। चर) के मूल्य पर विचार करता है (और यदि ऐसा है, तो पहले या बाद में exec-path?)

  • मैं कैसे कर सकते हैं पहले जोड़ें कई ऐसे रास्तों? क्या मैं सिर्फ उन्हें समेटता रह सकता हूं? जैसे

    (add-to-list 'exec-path "PATH1", "PATH2")
    

    या मुझे करना चाहिए:

    (add-to-list 'exec-path "PATH1:PATH2:PATH3") 
    

मुझे यह दिलचस्प पैकेज GitHub पर भी मिला: निष्पादन-पथ-से-शेल । इसके लिए पैकेज की आवश्यकता क्यों है?

प्रेरणा

कभी लगता है कि एक कमांड आपके शेल में काम करती है, लेकिन Emacs में नहीं?

यह ओएस एक्स पर बहुत कुछ होता है, जहां जीयूआई से शुरू हुआ एक एमएसीएस उदाहरण पर्यावरण चर का एक डिफ़ॉल्ट सेट विरासत में मिला है।

यह लाइब्रेरी उपयोगकर्ता के शेल से महत्वपूर्ण पर्यावरण चर को कॉपी करके इस समस्या को हल करती है: यह आपके शेल को ब्याज के चर को प्रिंट करने के लिए कहकर काम करती है, फिर उन्हें Emacs वातावरण में कॉपी करती है।


3
Emacs और Elisp में आपका स्वागत है! मैं अभी भी इस विषय के साथ बहुत ताज़ा हूँ और आपके प्रश्नों के उत्तर नहीं जानता, लेकिन मुझे लगा कि मैं कुछ ऐसा उल्लेख करूँगा जिसने जीवन को बहुत आसान बना दिया है: वर्णन कार्य। जैसे (describe-function 'add-to-list)( C-h f) आपको add-to-listफंक्शन के लिए डॉक देगा , साथ ही सोर्स से भी लिंक देगा। वहाँ भी (describe-variable 'exec-path)( C-h v) है। इसका मतलब RTFM टिप्पणी नहीं है - ये डॉक्स आपके द्वारा सूचीबद्ध सभी प्रश्नों का उत्तर नहीं देते हैं, बस कुछ उपयोगी है।
जटमौलिया

धन्यवाद @jtmoulia! भविष्य के सवालों के लिए मैं इसे ध्यान में रखूंगा।
एमिलियो वाज़केज़-रीना

इसके अलावा C-h v exec-path, मैनुअल (एस) और एमएसीएस और एलिसिप का उपयोग करें। एक मैनुअल में, i exec-pathआपको एक सहायक स्पष्टीकरण के लिए निर्देशित करता है। Emacs से पहले पूछें - आपको खेद है कि आपने ऐसा नहीं किया।
आकर्षित किया

जवाबों:


23

1) PATHऔरexec-path

Emacs स्टार्टअप exec-pathके मूल्य से सेट करता है PATH, लेकिन बाद में इसे फिर से नहीं देखेगा। लेकिन अगर आप एक कमांड चलाते हैं, तो यह विरासत में मिलेगा PATH, नहीं exec-path, इसलिए उपप्रकारक इमैकस की तुलना में अलग-अलग कमांड पा सकते हैं।

जैसा कि फ्रांसेस्को कहता है, यह विशेष रूप से भ्रमित करने वाला हो सकता है shell-command, क्योंकि यह एक प्रक्रिया को सीधे नहीं चलाता है, लेकिन इसे चलाने के लिए एक शेल को कॉल करता है, जो उपयोग करेगा PATH, नहीं exec-path

2) कई रास्तों को जोड़ना exec-path

बस add-to-listबार-बार फोन करें :

(add-to-list 'exec-path "PATH1")
(add-to-list 'exec-path "PATH2")

ध्यान दें कि क्या add-to-listसूची की शुरुआत करने के लिए कहते हैं, तो यह साथ खत्म हो जाएगा "PATH2"में किया जा रहा exec-pathसे पहले "PATH1"

आप सूचियों तक अधिक "निम्न-स्तरीय" पहुंच का उपयोग कर सकते हैं:

(setq exec-path (append '("PATH1" "PATH2")
                        exec-path))

यह आपके "PATH1"और उस क्रम में जोड़ देगा ।"PATH2"exec-path

3) मैक ओएस 'पथ

मैक ओएस एक्स पर समस्या यह है कि मैक ओएस पर्यावरण को एक ही सेट नहीं करता है जब आप किसी प्रोग्राम को वैश्विक यूआई से कॉल करते हैं या जब आप इसे शेल से कॉल करते हैं। इसका मतलब यह है कि एमएसीएस को एक खोल से चलाने के परिणामस्वरूप अलग-अलग पर्यावरणीय चर सेट होंगे जब आप इसे खोजक से चलाते हैं। यह विशेष रूप से कष्टप्रद है यदि आप पर्यावरण चर को .bashrcया इसके समान सेट करते हैं , क्योंकि यह "वैश्विक" Emacs को प्रभावित नहीं करेगा।

पैकेज स्पष्ट रूप से एक शेल शुरू करता है और वहां से पर्यावरण चर का आयात करता है, जो आपको एक शेल से प्राप्त पर्यावरण को विश्व स्तर पर शुरू किए गए ईएमआई को नकल करता है।


धन्यवाद जोर्गेन। Q3 के बारे में: क्या आप जानते हैं PATHकि वैश्विक UI (डेस्कटॉप वातावरण) से शुरू होने वाले कार्यक्रमों के लिए डिफ़ॉल्ट को कहाँ परिभाषित किया गया है? मैं के साथ एक ही समस्या हो PYTHONPATHरही है elpy:)। जब मैं डेस्कटॉप से ​​Emacs शुरू करता हूं, तो Emacs को PYTHONPATHमेरी .zshenvफ़ाइल (init फ़ाइल के लिए zsh) में मेरी परिभाषा के बारे में पता नहीं है , जो बहुत निराशा होती है, क्योंकि elpyतब पता नहीं होता है कि मेरे पायथन पैकेजों को कहां खोजना है। मुझे इन PYTHONPATHपरिभाषाओं को एक अलग शेल initफ़ाइल में ले जाने में खुशी हो रही है (हालांकि आदर्श रूप से मैं अपनी परिभाषाओं का उपयोग करने के लिए Emacs चाहूंगा .zshenv)
Amelio Vazquez-Reina

मुझे डर है कि मुझे मैक ओएस एक्स के बारे में अधिक जानकारी नहीं है। एक त्वरित Google ने मुझे stackoverflow.com/questions/135688/… पर प्राप्त किया जो इंगित करता है कि लॉन्चड.कॉन्फ़ सही जगह है। यदि आप Emacs के लिए इसकी आवश्यकता है, तो आप निश्चित रूप से दोनों exec-pathऔर PATHअपने में सेट कर सकते हैं .emacs। आप PATHका उपयोग कर सेट कर सकते हैं (setenv "PATH" (format "%s:%s" "/new/path/element" (getenv "PATH")))
जोर्गेन शेफर

धन्यवाद। मुझे पता है कि निम्न क्यू ओपी से थोड़ा भिन्न होता है, लेकिन क्या एमएसीएस में निर्दिष्ट करने का कोई तरीका है PYTHONPATHजो elpyइसका उपयोग करना चाहिए?
अमिलियो वाज़केज़-रीना

process-environmentउदाहरण के लिए, आप संशोधित कर सकते हैं setenv। आप ऐसा कर सकते हैं elpy-mode-hook, लेकिन यह एक ग्लोब्ल चर है और इसे बफर-लोकल बनाने से भ्रामक व्यवहार आसानी से हो सकता है।
जोर्गन शेफर

9

जब Emacs आदिम कार्यों का उपयोग करके एक नई बाहरी प्रक्रिया शुरू करता है call-processया start-process, निष्पादन योग्य exec-path(और नहीं $PATH) में खोजा जाता है

हालाँकि, एक फ़ंक्शन जैसे shell-commandकि शेल को एक उपप्रकार के रूप में शुरू करता है और इसे वह कमांड देता है जिसे आप चलाना चाहते हैं। इस आदेश को निष्पादित करने के लिए, शेल तब निष्पादन योग्य $PATH(और नहीं exec-path) को खोजने का प्रयास करेगा ।

इसलिए, exec-pathबाहरी प्रक्रियाओं के लिए सबसे अधिक जो मायने रखता है , जो स्वयं emacs द्वारा शुरू किया जाता है, जबकि $PATHवही है जो आप अपने आप को उच्च-स्तरीय फ़ंक्शन ( M-!उदाहरण के लिए उपयोग करते हुए ) के साथ कमांड के लिए गिनते हैं


यदि आप कई निर्देशिकाओं को जोड़ना चाहते हैं exec-path, तो आपको add-to-listकई बार उपयोग करना चाहिए ।

आप इसे मैन्युअल रूप से कर सकते हैं

(add-to-list 'exec-path "dir1")
(add-to-list 'exec-path "dir2")

या लूप का उपयोग करना

(dolist (dir '("dir1" "dir2"))
  (add-to-list 'exec-path dir))

आपके तीसरे प्रश्न के बारे में, यदि डेस्कटॉप वातावरण से emacs लॉन्च किया गया था, तो यह उससे पर्यावरण को विरासत में मिला है, जो पूर्ण शेल की तुलना में कम हो सकता है।

इसका अर्थ है कि $PATHएक नियमित शेल को देखने के लिए कभी-कभी Emacs के मूल्य को पूरा करना आवश्यक हो सकता है। यह exec-path-from-shellआपके द्वारा उल्लिखित पुस्तकालय का उद्देश्य है ।

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