如何使Emacs识别bash环境变量以进行编译?

如何使Emacs识别bash环境变量以进行编译?,emacs,compilation,Emacs,Compilation,我正试图通过Emacs的编译模式编译u-boot,看起来Emacs不知道如何找到bash环境变量。即使我设置了它们,并且可以通过Emacs shell仿真进行编译,编译模式仍然会尝试编译,就好像它们不存在一样 我需要做些什么才能使它更环保?它并没有严格地回答您的问题,但您始终可以在make命令行上传递环境变量。例如:M-xcompileRETmake-k CXXFLAGS='-Wall'RET您可以尝试向中添加类似的内容。emacs: (let ((path (shell-command-to-

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


我需要做些什么才能使它更环保?

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

您可以尝试向
中添加类似的内容。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\u profile
.bashrc
中设置了环境变量,您可能需要稍微调整此代码段。这个例子是针对
PATH
变量的,这个变量有点特殊(因为您也必须在Emacs中设置
exec PATH
),但是可以扩展到适用于任意变量-您可以有一个变量列表,这些变量必须从
.bashrc
读取并设置到Emacs中

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

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

更新


最近,通过扩展,这一过程变得更加容易。它以大致相同的方式设置emacs
$PATH
,但使用扩展通常比自己破解解决方案更可取。

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

-命令:getenv 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


来源:

这解决了我对Flymake未使用perlbrew提供的正确Perl的问题。与perlbrew-mini.elexec-path-from-shell不同,它很好地解决了ensime的问题,ensime无法启动并抛出
错误类型的参数stringp nil
error。为什么要使用拆分字符串和unquote而不是拆分字符串?尽管答案很清楚,但对于快速浏览的人来说,这个答案的前两行是我要搜索的:(let((MYVAR(shell命令到字符串“~/.bashrc;echo-n$MYVAR”))(setenv“MYVAR”MYVAR))你的意思是
#/bin/bash
?谢谢,@Elena。固定的。:)