从emacs中获取来加载环境变量

时间:2014-02-25 06:44:53

标签: bash emacs elisp zsh

我在不同的文件中有不同的环境变量,通常使用source来加载/卸载这些变量。现在我想在使用emacs时更改我的环境变量。在emacs中有source的任何方法吗?

1 个答案:

答案 0 :(得分:1)

为了改变Emacs本身的环境(它将由它运行的所有命令继承,比如编译命令或shell),我使用以下设置:

  1. 在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)
    
  2. 在我的~/.bashrc文件中,以下函数允许获取s​​hell脚本并将生成的环境导出到$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 )
    }
    
  3. 所有这些都设置好了,当我想在一个项目中开发时,我打开一个shell / term / multi-term缓冲区,而在其中,我运行

    E-source my-env.sh
    

    在运行编译命令之前,我需要在这个特定的项目中进行开发。

  4. 所有这一切都有些复杂,但我发现它不像使用source my-env.sh为所有编译命令添加前缀,并且还在所有shell / term / multi-term缓冲区中提供环境,因此不易出错。