我在不同的文件中有不同的环境变量,通常使用source
来加载/卸载这些变量。现在,我想在使用emacs时更改环境变量。有没有办法从emacs内部访问source
?
为了更改Emacs本身的环境(它将被它运行的所有命令继承,如编译命令或shell),我使用以下设置:
-
在emacs init文件中,以下代码段定义(并调用)一个函数,该函数启动服务器并将其名称导出到
EMACS_SERVER
环境变量中。(defun my/server-start () "Start an emacs server using an automatically generated name. If an emacs server is already running, it is restarted. The EMACS_SERVER environment variable is set, so that child processes can know which emacs server to contact." (if (and (boundp 'server-process) server-process (memq (process-status server-process) '(connect listen open run))) ;; There is already an instance running; just restart it (server-start) ;; Start a new server (let ((i 0) (max-try 100) (ok nil)) (while (and (< i max-try) (not ok)) (setq server-name (format "server%d" i)) (setq i (1+ i)) (unless (server-running-p server-name) (setq ok t))) (if (>= i max-try) (display-warning 'my/server-start "Could not find any unused server name." :warning) (message "Starting server with name %s." server-name) (server-start)))) (setenv "EMACS_SERVER" server-name)) (my/server-start)
-
在我的
~/.bashrc
文件中,以下函数允许获取shell脚本,并将生成的环境导出到$EMACS_SERVER
:引用的emacs服务器E-source () { ( if [ -n "$1" ]; then source "$1"; fi; export | perl -pn -e 's/^declare -x //;' -e 's/([^=]+)=(.*)$/(setenv "$1" $2)/' | while read line; do emacsclient -s ${EMACS_SERVER} -e "$line"; done ) }
-
所有这些都设置好了,当我想在一个项目中开发时,我打开一个shell/term/multi-term缓冲区,在其中运行
E-source my-env.sh
在运行我在这个特定项目中开发所需的编译命令之前。
所有这些都有点复杂,但我发现它比无休止地在所有编译命令前加上source my-env.sh
,以及在所有shell/term/multi-term缓冲区中查找环境更不容易出错。