この質問はスーパーユーザーis-there-to-reload-environment-variables-in-emacsで行われましたが、適切な解決策はありませんでした。
EmacsClientを使用していて、30を超えるバッファが開いていることがよくあります。シェルで環境変数を変更した場合は、EmacsClientを終了して(すべてのバッファを再度開く)、Emacsでも環境変数を手動で設定する必要があります。Emacsで環境変数を簡単に更新できないのは不愉快です。助言がありますか?
この質問はスーパーユーザーis-there-to-reload-environment-variables-in-emacsで行われましたが、適切な解決策はありませんでした。
EmacsClientを使用していて、30を超えるバッファが開いていることがよくあります。シェルで環境変数を変更した場合は、EmacsClientを終了して(すべてのバッファを再度開く)、Emacsでも環境変数を手動で設定する必要があります。Emacsで環境変数を簡単に更新できないのは不愉快です。助言がありますか?
回答:
exec-path-from-shellは、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/
プロセスを実行するためのAPIまたは同様のAPIを検査する複雑なハックなしでは一般に不可能です。
回避策として、以下を使用できます(Linux、Bash)。
printenv -0 > env.txt
Bashターミナルウィンドウから実行します。(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
:Bashスクリプトを定義します:
#! /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_env
、シェルコマンドラインから入力するだけで、Emacs環境変数を更新できます。
source
.bashrc、.bash_profileなど?
export VAR=value