환경 변수 재로드


10

이 질문은 수퍼 유저 is-re-way-to-reload-environment-variables-in-emacs 에서 요청되었지만 좋은 해결책은 없습니다.

쉘에서 환경 변수를 변경하면 EmacsClient를 종료하고 (모든 버퍼를 다시 열어야 함) Emacs에서도 환경 변수를 수동으로 설정해야합니다. Emacs에서 환경 변수를 쉽게 업데이트 할 수 없다는 것이 짜증납니다. 어떤 제안?


상위 프로세스에서 환경 변수를 변경해도 해당 값이 하위로 내 보내질 때 해당 값이 업데이트되지 않으므로이를 수행하는 간단한 방법은 없습니다.
Erik Hetzner 2016 년

답변:


7

exec-path-from-shellexec-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/프로세스 실행을 위해 유사한 API를 검사 하거나 유사한 API를 사용 하지 않으면 이러한 변수를 추출 할 수 없습니다 .


후자 / 일시적 값과 관련하여 Emacs가 서버로 실행 중이면 업데이트 된 값을 해당 쉘에서 직접 emacsclient로 전달하는 것이 충분합니다.
phils

@ phils 감사합니다, 내 업데이트 답변을 참조하십시오.
Håkon Hægland

5

해결 방법으로 다음을 사용할 수 있습니다 (Linux, Bash).

  • 먼저 printenv -0 > env.txtBash 터미널 창에서 실행 하십시오.
  • 그런 다음 이맥스에서
(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: Bash 스크립트 정의 update_emacs_env:

#! /bin/bash

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

여기서 server_nameEmacs 서버 이름 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_env쉘 명령 행에서 간단히 입력 하여 Emacs 환경 변수를 업데이트 할 수 있습니다 .


그리고 함수
안에서도

@mankoff 사실, 나는 당신이 할 수 없다고 생각합니다. : :) (이전 값을 인쇄합니다)
Håkon Hægland

로그인 플래그가있는 쉘을 생성 할 수 없습니까? 아니면 source.bashrc, .bash_profile 등?
mankoff

예 ..하지만 명령 행에서 직접 쉘로 내 보내면export VAR=value
Håkon Hægland

예, 그런 생각은하지 않았습니다. 클라이언트와 우아한 솔루션!
mankoff

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
}

명명 된 변수 EG를 내보낼 수 있습니다.

export EDITOR=vim
export-emacs EDITOR
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.