从emacs中获取源以加载环境变量



我在不同的文件中有不同的环境变量,通常使用source来加载/卸载这些变量。现在,我想在使用emacs时更改环境变量。有没有办法从emacs内部访问source

为了更改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文件中,以下函数允许获取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 )
    }
    
  3. 所有这些都设置好了,当我想在一个项目中开发时,我打开一个shell/term/multi-term缓冲区,在其中运行

    E-source my-env.sh
    

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

所有这些都有点复杂,但我发现它比无休止地在所有编译命令前加上source my-env.sh,以及在所有shell/term/multi-term缓冲区中查找环境更不容易出错。

相关内容

  • 没有找到相关文章

最新更新