Eps*_*tor 18 emacs compilation
我试图通过Emacs的编译模式编译u-boot,看起来Emacs不知道如何找到bash环境变量.即使我设置了它们,并且可以通过Emacs shell仿真进行编译,编译模式仍然会尝试编译,就好像它们不存在一样.
我需要做些什么来使其更具环保意识?
Boz*_*sov 29
您可以尝试添加以下内容.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)))
Run Code Online (Sandbox Code Playgroud)
取决于您是否设置了env变量,.bash_profile或者.bashrc您可能需要稍微调整此代码段.该示例适用于PATH变量,它更加特殊(因为您还必须exec-path在Emacs中设置),但可以扩展为适用于任意变量 - 您可以拥有必须从中读取.bashrc和设置的变量列表进入Emacs.
我不确定你是使用OS X还是GNU/Linux.从Linux的GUI菜单栏启动Emacs通常会导致Emacs PATH与从命令行启动的Emacs不同.这个问题可以追溯到第一个xdmXsession脚本,虽然它们很容易修复(基本上使用的Xsessionwrapper脚本exec $SHELL -c Xsession可以在运行用户的Xsession之前运行shell),没有人在很长一段时间内都这么做(和我怀疑有谁会).据我所知,问题甚至存在于现代的xdm后代,如kdm和gdm.
在OS X上,env变量的处理完全是另一个问题,要获得ENV变量,通常必须从命令行运行Emacs /Applications/Emacs.app/Contents/MacOS/Emacs或者使用~/.MacOSX/environment.plist.我提供的代码片段应该涵盖两种情况.
更新
最近,exec-path-from-shell扩展使这个过程变得更容易.它$PATH以大致相同的方式设置emacs ,但使用扩展通常比自己破解解决方案更可取.
这是启动进程的环境变量的emacs位置:
— 命令:getenv var
此函数以字符串形式返回环境变量 var 的值。var 应该是一个字符串。如果环境中的 var 未定义,则 getenv 返回 nil。如果设置了 var 但为 null,则返回 '""'。在 Emacs 中,环境变量及其值的列表保存在变量 process-environment 中。
Run Code Online (Sandbox Code Playgroud)(getenv "USER") ? "lewis"— 变量:过程环境
这个变量是一个字符串列表,每个字符串描述一个环境变量。函数 getenv 和 setenv 通过这个变量工作。
Run Code Online (Sandbox Code Playgroud)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