如何让Emacs识别bash环境变量进行编译



我试图通过Emacs的编译模式编译u-boot,但看起来Emacs不知道如何找到bash环境变量。即使我设置了它们,并且可以通过Emacs shell仿真进行编译,编译模式仍然会尝试像不存在它们一样进行编译。

我需要做些什么才能让它更有环保意识?

您可以尝试在.emacs:中添加类似的内容

(let ((path (shell-command-to-string ". ~/.bashrc; echo -n $PATH")))
  (setenv "PATH" path)
  (setq exec-path 
        (append
         (split-string-and-unquote path ":")
         exec-path)))

根据您是否在.bash_profile.bashrc中设置了env变量,您可能需要稍微调整此代码段。这个例子是针对PATH变量的,它有点特殊(因为你也必须在Emacs中设置exec-path),但可以扩展到适用于任意变量——你可以有一个必须从.bashrc读取并设置到Emacs中的变量列表。

我不确定您使用的是OS X还是GNU/Linux。在Linux中,从GUI的菜单栏启动Emacs通常会导致Emacs的PATH与从命令行启动的不同。这个问题可以追溯到第一个xdmXsession脚本,虽然它们很容易修复(基本上使用一个执行exec $SHELL -c XsessionXsessionwrapper脚本,这样shell就可以在运行用户的Xsession之前运行),但在很长一段时间内,没有人会这么做(我怀疑是否有人会这样做)。据我所知,即使是kdmgdm这样的现代xdm后代也存在这个问题。

在OSX上,env变量的处理完全是另一个问题,要获得env变量,通常必须从命令行运行Emacs,如/Applications/Emacs.app/Contents/MacOS/Emacs或使用~/.MacOSX/environment.plist。不过,我提供的代码片段应该涵盖这两种情况。

更新

最近,shell扩展的exec路径使这个过程变得更容易。它以或多或少相同的方式设置emacs $PATH,但使用扩展通常比自己破解解决方案更可取。

这是启动emacs的进程的环境变量的位置:

--命令:getenv-var

此函数返回环境变量var,作为字符串。var应该是一个字符串。如果var在环境中未定义,getenv返回nil。它返回"如果var已设置但为null。在Emacs中,环境变量列表并且它们的值被保持在可变过程环境中。

      (getenv "USER")
           ⇒ "lewis"

--变量:过程环境

此变量是字符串列表,每个描述一个环境变量。函数getenv和setenv通过这个变量工作。

      process-environment
      ⇒ ("PATH=/usr/local/bin:/usr/bin:/bin"
          "USER=lewis"
          "TERM=xterm"
          "SHELL=/bin/bash"
          "HOME=/home/lewis"
          ...)

您似乎假设emacs是从bash会话启动的。但是,X下的进程通常是从sh会话启动的,该会话不会读取您在~/.bashrc脚本中设置的环境变量。避免这种情况的一个简单方法是将~/.xinitrc文件更改为使用bash,而不是sh(可以简单到在文件顶部添加#!/bin/bash)。

来源:gnu.org

它并不能严格回答您的问题,但您始终可以在make命令行上传递环境变量。例如:M-xcompileRETmake -k CXXFLAGS='-Wall'

最新更新