Emacs Mac Port 能自动从 ~/.profile 继承环境变量

很是蛋疼,exec-path-from-shell提供的默认arguement 是-l -i,但是zsh -l -i -c 'echo $PATH'并不从.zshenv读取环境变量,然而官方默认却说要写在.zshenv里面...zsh -i -c 'echo $PATH'倒是能读取到zshenv,但是.zshrc 的也一并读取了...求教解决方案:sweat_smile:

(use-package exec-path-from-shell
  :defer t
  :init
  (setq exec-path-from-shell-check-startup-files nil) ;; only from .zshenv
  (setq exec-path-from-shell-arguments '("-l"))  ;; remove -i read form .zshenv
  (setq exec-path-from-shell-variables '("PATH"))
  (exec-path-from-shell-initialize))

这是参考论坛某个帖子的,据我观察,每次启动并不读.zshrc

其实让他读.zshrc启动时间也没有差多少,我觉得主要是package-initialize太慢了

你没有用 export PATH=$PATH:xxxx吧?

我在.zshenv里面添加了

export PATH=/usr/local/sbin:/usr/local/bin:/usr/bin

terminal中执行

$ zsh -l  -c 'echo $PATH' 
/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl

也就是使用login shell并不会读取.zshenv,很奇怪,官方文档明明写了大多zsh都会run.A User's Guide to the Z-Shell 实际测试下来,只有interactive shellzsh -i -c 'echo $PATH'才会load .zshenv中定义的path...

你在 zshrc 或者别的地方覆盖了吗……

我的问题跟这个一样...就是使用login shell会在run .zshenv后会调用/etc/zsh/profile,然后path就被覆盖了. https://bbs.archlinux.org/viewtopic.php?id=180845

解决方法应该是使用.zprofile而不用.zshenv :boom: https://bugs.gentoo.org/show_bug.cgi?id=19924#c50

升级了10.15之后貌似没有继承了?

我还没升级 macOS,不过我没依赖 Mac Port 的这个特性,而是自己手动设置的

;; [[https://emacs-china.org/t/topic/5507][Mac 下给 Emacs 设置 PATH 和 exec-path - Emacs-general - Emacs China]]
;; NOTE: When PATH is changed, run the following command
;; $ sh -c 'printf "%s" "$PATH"' > .path
(when *is-mac*
  (condition-case err
      (let ((path (with-temp-buffer
                    (insert-file-contents-literally "~/.path")
                    (buffer-string))))
        (setenv "PATH" path)
        (setq exec-path (append (parse-colon-path path) (list exec-directory))))
    (error (warn "%s" (error-message-string err)))))

这样完全不用运行个 Shell 来获得 PATH。

我用的也是类似手动储存PATH和其他几个环境变量到一个文件里,Emacs再导入的方法。之前尝试改变launchd的环境变量但没有作用:launchd的变量是改变了,但是从spotlight/dock开启的Emacs并没有继承这些环境变量,不知道是什么问题。 忘了这么打开Emacs不是从launchd继承环境变量,我回去重启spotlight再试试 重启了也不行。


我所有环境设置都在~/.profile里,然后再在其他shell的配置文件里source ~/.profile。这样只用维护一份环境配置,所有shell都能用。


写:

echo "(setenv \"PATH\" \"$PATH\") (setenv \"CPATH\" \"$CPATH\") (setenv \"MANPATH\" \"$MANPATH\")" > ~/.emacsenv

读:

(defun luna-load-env ()
  "Load PATH and CPATH from a file."
  (interactive)
  (condition-case err
      (progn (load "~/.emacsenv")
             (setq exec-path (split-string (getenv "PATH") ":")))
    (error (message (error-message-string err)))))