emacs的环境变量
背景
安装了go之后添加了 ~/go/bin
到PATH,然而在emacs中使用 getenv
却没有找到,
而且 (getenv "PATH")
的结果和普通shell中 echo $PATH
结果完全不同.
因此需要探究下emacs的 getenv
是如何工作的.
emacs获取环境变量需要看调用方式
- 终端中调用,通常emacs会继承与shell结果相同的环境变量.(有时候emacs会多一些重复的内容)
- 直接从GUI启动,那么需要看使用的launcher是如何调用程序的.
- windows下极大可能无法继承系统的环境变量
- linux下则有可能会继承环境变量
问题的解决
已知的方案有两种
- spacemacs会制作
~/.spacemacs.d/.spacemacs.env
文件,之后读取环境变量都从这里读- 没有的话会自动生成一次
- 如果在emacs中强制生成,可以使用
spacemacs/force-init-spacemacs-env
- emacs中查看可使用
spacemacs/edit-env
- 允许手动编辑env文件,然后使用
dotspacemacs/call-user-env
来重新加载
- 有人写了emacs包
exec-path-from-shell
, 可以在启动时专门加载一次-
使用spacemacs则无需使用该包
-
核心配置方式如下,但和emacs配置集成的方式需要自行考虑
1
2
3(when (memq window-system '(mac ns x))
(require 'exec-path-from-shell)
(exec-path-from-shell-initialize))
-
getenv的特别处
- 会帮忙去掉重复元素
- 会添加emacs自己的bin路径
重复元素哪里来
目前遇到的,仅有一个的特殊情况.
- 使用了zsh作为默认shell
- 将配置文件分散在
.zshenv
和.zshrc
中,而.zshenv
在non-login, login, interactive, non-interactive shell中都会加载 - emacs中使用
shell-command
, 运行的是非交互的shell(即使是人在输入内容,但结果不可保留,没有历史) - 导致emacs运行时先继承一次环境变量(zshenv和zshrc),等运行
shell-command
时又加载一次zshenv.