emacs的环境变量

背景

安装了go之后添加了 ~/go/bin 到PATH,然而在emacs中使用 getenv 却没有找到,
而且 (getenv "PATH") 的结果和普通shell中 echo $PATH 结果完全不同.
因此需要探究下emacs的 getenv 是如何工作的.

emacs获取环境变量需要看调用方式

  1. 终端中调用,通常emacs会继承与shell结果相同的环境变量.(有时候emacs会多一些重复的内容)
  2. 直接从GUI启动,那么需要看使用的launcher是如何调用程序的.
    1. windows下极大可能无法继承系统的环境变量
    2. linux下则有可能会继承环境变量

问题的解决

已知的方案有两种

  1. spacemacs会制作 ~/.spacemacs.d/.spacemacs.env 文件,之后读取环境变量都从这里读
    1. 没有的话会自动生成一次
    2. 如果在emacs中强制生成,可以使用 spacemacs/force-init-spacemacs-env
    3. emacs中查看可使用 spacemacs/edit-env
    4. 允许手动编辑env文件,然后使用 dotspacemacs/call-user-env 来重新加载
  2. 有人写了emacs包 exec-path-from-shell, 可以在启动时专门加载一次
    1. 使用spacemacs则无需使用该包

    2. 核心配置方式如下,但和emacs配置集成的方式需要自行考虑

      1
      2
      3
      (when (memq window-system '(mac ns x))
      (require 'exec-path-from-shell)
      (exec-path-from-shell-initialize))

getenv的特别处

  1. 会帮忙去掉重复元素
  2. 会添加emacs自己的bin路径

重复元素哪里来

目前遇到的,仅有一个的特殊情况.

  1. 使用了zsh作为默认shell
  2. 将配置文件分散在 .zshenv.zshrc 中,而 .zshenv 在non-login, login, interactive, non-interactive shell中都会加载
  3. emacs中使用 shell-command, 运行的是非交互的shell(即使是人在输入内容,但结果不可保留,没有历史)
  4. 导致emacs运行时先继承一次环境变量(zshenv和zshrc),等运行 shell-command 时又加载一次zshenv.

参考

  1. emacs中国
  2. exec-path-from-shell