如何使Emacs识别bash环境变量以进行编译?
我正试图通过Emacs的编译模式编译u-boot,看起来Emacs不知道如何找到bash环境变量。即使我设置了它们,并且可以通过Emacs shell仿真进行编译,编译模式仍然会尝试编译,就好像它们不存在一样如何使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-
我需要做些什么才能使它更环保?它并没有严格地回答您的问题,但您始终可以在
make
命令行上传递环境变量。例如:M-xcompile
RETmake-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。固定的。:)