我在不同的文件中有不同的环境变量,通常使用source
来加载/卸载这些变量。现在我想在使用emacs时更改我的环境变量。在emacs中有source
的任何方法吗?
答案 0 :(得分:1)
为了改变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缓冲区中提供环境,因此不易出错。