如何在emacs中将环境变量设置为缓冲区本地范围

Mar*_*orn 9 emacs elisp

在Emacs中,我想在不同的缓冲区中改变环境变量的值.

我的emacs环境依赖于环境变量(flymake,编译等),但是我希望能够在一个emacs会话中同时打开多个项目,但这些项目可能存在冲突的环境.

例如,类似于flymake的不同INCLUDE_PATH环境变量.

use*_*342 15

你可以通过建立process-environment缓冲区本地来做到这一点:

(defun setup-some-mode-env ()
  (make-local-variable 'process-environment)
  ;; inspect buffer-file-name and add stuff to process-environment as necessary
  ...)
(add-hook 'some-major-mode 'setup-some-mode-env)
Run Code Online (Sandbox Code Playgroud)

更详细的示例是此代码导入由外部脚本创建的Guile环境设置.该脚本设计为在shell中"源",但此处将其结果导入到单个Emacs缓冲区中:

(defun my-guile-setup ()
  (make-local-variable 'process-environment)
  (with-temp-buffer
    (call-process "bash" nil t nil "-c"
          "source ~/work/guileenv; env | egrep 'GUILE|LD_LIBRARY_PATH'")
    (goto-char (point-min))
    (while (not (eobp))
      (setq process-environment
        (cons (buffer-substring (point) (line-end-position))
          process-environment))
      (forward-line 1))))

(add-hook 'guile-hook 'my-guile-setup)
Run Code Online (Sandbox Code Playgroud)