exec-path-from-shell有必要在Linux下启用吗?


#1

去掉exec-path-from-shell加快两秒启动时间

也不仅仅是exec-path-from-shell, 还包括其它任何“从shell拷贝环境变量”的配置。

现在还有必要在Linux下启用这类的设置吗?以及如果我真的不在Linux下启用这类配置,我可能会受到什么影响?

另外这里不涉及奇怪的发行版和奇怪的shell以及奇怪的系统配置。只讨论最流行的那些。

谢谢。


#2

YMMV.

配置毕竟是自己的, 我自己的配置就直接写死find-program和一些命令行工具的绝对路径, 因为我用windows, 不手动指定往往会出现很多问题. 所以, 如果你的电脑需要exec-path-from-shell, just do it.

如果你发现某些兼容性配置只有你自己需要, 而你又想写配置让大部分人用. 你可以学习abo-abo的骚气做法.


#3

是个好办法……不过我是要反着来。

我的问题是我不知道其他人需不需要这些兼容性配置

BTW,我极度厌恶甚至憎恨任何有关兼容性的东西……


#4

你试试不就知道了?找不到执行文件再说怎么修复。或者你对比一下Emacs和终端里环境变量有没有不一样也行


#5

关键是我自己的系统配置和shell配置和linux发行版本身就比较奇怪……所以我才会来听大家的看法。


#6

奇怪的话,更应该自己试试了。我觉得别人说的都不如你自己尝试来的明白


#7

呃……原谅我的强迫症……

我自己不用是没任何问题的……但是我发现大家都在用啊……除了Spacemacs——但是Spacemacs自己造了一个轮子 (.spacemacs.env) 来解决这个问题。


#8

Emmmm 那你为啥要给doom提那个issue😂


#9

因为闲的……

而且我确实想听听用的人和不用的人都有什么理由。所以我才给这个package的作者和doom都提了issue


#10

我没用。我用的下面这段code,从自己配置的shell环境抓取PATH

;; Load path from zsh login shell
(when (or IS-LINUX IS-MAC)
  (defvar zsh-executable  "/usr/bin/env zsh")
  (let* ((zshpath (shell-command-to-string
                   (concat zsh-executable " -lc 'printenv PATH'")))
         (pathlst (split-string zshpath ":")))
    (setq exec-path pathlst)
    (setq eshell-path-env zshpath)
    (setenv "PATH" zshpath))

  ;; use zsh as default shell
  (setenv "SHELL" "zsh"))

#11

从来没用过这个包。

环境变量取决于启动 Emacs 的方式,以及 Emacs 版本。

从终端启动

自然 Emacs 就继承了 shell 的环境变量,所以我没必要使用这个包。

先看看终端 PATH 有些什么:(我用的是 macOS,Linux 应该也类似)

⋊> echo $PATH
/Users/dude/.nix-profile/bin:/Library/Frameworks/Python.framework/Versions/3.7\
/bin:/usr/local/opt/qt@5.5/bin:/usr/local/sbin:/Users/dude/flutter/bin:/Users/\
dude/.phpbrew/php/php-7.0.12/bin:/Users/dude/.phpbrew/bin:/Users/dude/.jenv/sh\
ims:/Users/dude/.jenv/bin:/Users/dude/.rbenv/shims:/Users/dude/.rbenv/bin:/Use\
rs/dude/.pyenv/shims:/Users/dude/.pyenv/bin:/Users/dude/.nodenv/shims:/Users/d\
ude/.nodenv/bin:/Users/dude/.dotfiles/bin:/tools:/platform-tools:/usr/bin:/bin\
:/usr/sbin:/sbin:/opt/X11/bin:/usr/local/bin:/Library/TeX/texbin:/Applications\
/Wireshark.app/Contents/MacOS

在终端下启动 -nw 模式:

⋊> emacs -nw -Q --eval '(insert (getenv "PATH"))'
/Users/dude/.nix-profile/bin:/Library/Frameworks/Python.framework/Versions/3.7\
/bin:/usr/local/opt/qt@5.5/bin:/usr/local/sbin:/Users/dude/flutter/bin:/Users/\
dude/.phpbrew/php/php-7.0.12/bin:/Users/dude/.phpbrew/bin:/Users/dude/.jenv/sh\
ims:/Users/dude/.jenv/bin:/Users/dude/.rbenv/shims:/Users/dude/.rbenv/bin:/Use\
rs/dude/.pyenv/shims:/Users/dude/.pyenv/bin:/Users/dude/.nodenv/shims:/Users/d\
ude/.nodenv/bin:/Users/dude/.dotfiles/bin:/tools:/platform-tools:/usr/bin:/bin\
:/usr/sbin:/sbin:/opt/X11/bin:/usr/local/bin:/Library/TeX/texbin:/Applications\
/Wireshark.app/Contents/MacOS

在终端下启动 GUI 模式:

⋊> emacs -Q --eval '(insert (getenv "PATH"))'
/Users/dude/.nix-profile/bin:/Library/Frameworks/Python.framework/Versions/3.7\
/bin:/usr/local/opt/qt@5.5/bin:/usr/local/sbin:/Users/dude/flutter/bin:/Users/\
dude/.phpbrew/php/php-7.0.12/bin:/Users/dude/.phpbrew/bin:/Users/dude/.jenv/sh\
ims:/Users/dude/.jenv/bin:/Users/dude/.rbenv/shims:/Users/dude/.rbenv/bin:/Use\
rs/dude/.pyenv/shims:/Users/dude/.pyenv/bin:/Users/dude/.nodenv/shims:/Users/d\
ude/.nodenv/bin:/Users/dude/.dotfiles/bin:/tools:/platform-tools:/usr/bin:/bin\
:/usr/sbin:/sbin:/opt/X11/bin:/usr/local/bin:/Library/TeX/texbin:/Applications\
/Wireshark.app/Contents/MacOS

双击启动

在双击运行之前,把 ~/.emacs.d/ 改名以避免配置文件修改到环境变量,影响到观察(或者在 Script Editor.app 中运行 do shell script "/Applications/Emacs.app/Contents/MacOS/Emacs -Q --eval '(insert (getenv \"PATH\"))' 模拟整个操作)。

双击 Emacs.app:

/usr/bin:/bin:/usr/sbin:/sbin:/Applications/Emacs.app/Contents/MacOS/bin-x86_6\
4-10_10:/Applications/Emacs.app/Contents/MacOS/libexec-x86_64-10_10

双击 Emacs-mac.app:

/Users/dude/.nix-profile/bin:/Library/Frameworks/Python.framework/Versions/3.7\
/bin:/usr/local/opt/qt@5.5/bin:/usr/local/sbin:/Users/dude/flutter/bin:/Users/\
dude/.phpbrew/php/php-7.0.12/bin:/Users/dude/.phpbrew/bin:/Users/dude/.jenv/sh\
ims:/Users/dude/.jenv/bin:/Users/dude/.rbenv/shims:/Users/dude/.rbenv/bin:/Use\
rs/dude/.pyenv/shims:/Users/dude/.pyenv/bin:/Users/dude/.nodenv/shims:/Users/d\
ude/.nodenv/bin:/Users/dude/.dotfiles/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/l\
ocal/bin:/opt/X11/bin:/Library/TeX/texbin:/Applications/Wireshark.app/Contents\
/MacOS:/tools:/platform-tools

可见 Emacs-mac 是有继承 login shell 的 PATH,只是顺序稍微不一样。


#12

然而我的Awesome WM的应用启动器不会继承$HOME/.zshenv以及其他地方自行设置的PATH……


#13

真awesome

哈哈哈哈哈


#14

不仅仅是awesome,好多WM的launcher都不会加载用户设定的环境变量,只会加载全局的


#15

个人觉得有必要用,尤其是PYTHONPATHGOPATH之类的需要导入。启动慢可以用-l参数来解决,所有需要导入的变量放在.zshenv。 参考Centaur Emacshttps://github.com/seagle0128/.emacs.d/blob/2646a36501a301e4b5408efdc4bbab46122782cb/lisp/init-basic.el#L53


#16

这类变量我就从没想过自动导入的事情……


#17

只是举例。主要是保证 terminal 和 emacs 的环境变量一致。


#18

升级了10.15.1之后,emacs-mac双击好像不会继承PATH了?


#19

自己的环境变量里加个flag,emacs启动时检查一下呗,没有就加载,有就不用加载咯。因为我自己的shell环境为了避免重复加载部分配置,把一些变量单独定义出来然后加到zprofile里了,但有些如xession不会加载这个文件我就检查一下,自动加载了。


#20

有必要,我需要各种方式启动的 emacs 体验一致。