पर्यावरण चर को पुनः लोड करें


10

यह सवाल सुपरसुअर से पूछा गया है, वहाँ-से-फिर-फिर-फिर-फिर-लोड-पर्यावरण-चर-इन-एमएसीएस है , लेकिन कोई अच्छा समाधान नहीं दिया गया था।

मैं 30 से अधिक बफ़र्स के साथ अक्सर EmacsClient का उपयोग कर रहा हूं, अगर मैं शेल में एक पर्यावरण चर को बदलता हूं, तो मुझे EmacsClient से बाहर निकलने की आवश्यकता है (और सभी बफ़र्स को फिर से खोलें) या मुझे मैन्युअल रूप से Emacs में पर्यावरण चर भी सेट करना होगा। मुझे यह कष्टप्रद लगता है कि मैं एमएसीएस में पर्यावरण चर को आसानी से अपडेट नहीं कर सकता। कोई सुझाव?


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

जवाबों:


7

निष्पादन-पथ-से-शेलexec-path-from-shell-copy-env कमांड प्रदान करता है , जो आपको Emacs सत्रों के लिए पर्यावरण चर के मूल्य की प्रतिलिपि बनाने देता है। उदाहरण के लिए, Emacs में भी M-x exec-path-from-shell-copy-env RET FOOमान सेट करता है $FOO

ध्यान दें कि पर्यावरण चर का मान निकालने के लिए exec-path-from-shell-copy-envएक नया शेल खोलता है । इसलिए यह केवल उन चर के लिए काम करेगा जो आप अपनी शेल कॉन्फ़िगरेशन फ़ाइलों (जैसे .bashrc) में सेट करते हैं , लेकिन केवल एक रनिंग शेल के साथ सेट किए गए चर के लिए नहीं export। इन वैरिएबल्स को निकालना आम तौर पर बिना कन्फ्यूज्ड हैक के असंभव है जो /proc/चल रही प्रक्रियाओं के लिए एपीआई या इसी तरह का निरीक्षण करता है।


बाद के / क्षणिक मूल्यों के बारे में, यदि Emacs एक सर्वर के रूप में चल रहा है, तो उस शेल से सीधे emacsclient के माध्यम से अद्यतन मूल्यों को पारित करना काफी आसान होगा।
फिल्स

@phils धन्यवाद, मेरा अद्यतन उत्तर देखें ..
Håkon Hongland

5

वर्कअराउंड के रूप में, निम्नलिखित का उपयोग किया जा सकता है (लिनक्स, बैश):

  • printenv -0 > env.txtबैश टर्मिनल विंडो से पहली बार चलाएं ,
  • फिर Emacs के भीतर से, भागो
(defun my-update-env ()
  (interactive)
  (let ((str 
         (with-temp-buffer
           (insert-file-contents "env.txt")
           (buffer-string))) lst)
    (setq lst (split-string str "\000"))
    (while lst
      (setq cur (car lst))
      (when (string-match "^\\(.*?\\)=\\(.*\\)" cur)
        (setq var (match-string 1 cur))
        (setq value (match-string 2 cur))
        (setenv var value))
      (setq lst (cdr lst)))))

अपडेट करें

मुझे पता चला है कि यह कमांड के --evalविकल्प का उपयोग करके अधिक सुरुचिपूर्ण ढंग से किया जा सकता है emacsclient: बैश स्क्रिप्ट को परिभाषित करें update_emacs_env:

#! /bin/bash

fn=tempfile
printenv -0 > "$fn" 
emacsclient -s server_name -e '(my-update-env "'"$fn"'")' >/dev/null

server_nameआपका Emacs सर्वर नाम कहां है, और my-update-envआपकी ~/.emacsफ़ाइल द्वारा परिभाषित एक फ़ंक्शन है :

(defun my-update-env (fn)
  (let ((str 
         (with-temp-buffer
           (insert-file-contents fn)
           (buffer-string))) lst)
    (setq lst (split-string str "\000"))
    (while lst
      (setq cur (car lst))
      (when (string-match "^\\(.*?\\)=\\(.*\\)" cur)
        (setq var (match-string 1 cur))
        (setq value (match-string 2 cur))
        (setenv var value))
      (setq lst (cdr lst)))))

अब आप बस update_emacs_envEmacs पर्यावरण चर को अद्यतन करने के लिए शेल कमांड लाइन से टाइप कर सकते हैं ।


और आप फ़ंक्शन के अंदर से भी "प्रिंटेनव" चला सकते हैं ...
मैनकॉफ़

@ मांकॉफ वास्तव में, मुझे लगता है कि आप नहीं कर सकते थे .. :) (यह पुराने मूल्यों को तब प्रिंट करेगा)
एचकॉन हॉगलैंड

क्या आप लॉगिन ध्वज के साथ एक शेल नहीं खोल सकते हैं? या source.bashrc, .bash_profile, इत्यादि?
mankoff

हां .. लेकिन यह विशेष मामले के लिए मदद नहीं करेगा, अगर मैं सीधे कमांड लाइन से शेल में निर्यात करता हूं, तोexport VAR=value
Håkon H 6gland

हां, मैंने उस मामले के बारे में नहीं सोचा था। ग्राहक के साथ सुरुचिपूर्ण समाधान!
3

3

मैं इसका उपयोग करता था:

function export-emacs {
    if [ "$(emacsclient -e t)" != 't' ]; then
        return 1
    fi

    for name in "${@}"; do
        value=$(eval echo \"\$${name}\")
        emacsclient -e "(setenv \"${name}\" \"${value}\")" >/dev/null
    done
}

आपको एक नामित चर निर्यात करने देता है, जैसे:

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