4

当我启动 emacs GUI 时,PATH 没有根据我的 .zshrc 设置。如何获取我的 .zshrc 以正确设置它?

编辑:我正在尝试使用 swank-clojure 但它找不到 lein 因为它不在PATH.

4

6 回答 6

12

编辑添加(2014):现在在 MELPA 中有一个名为的包exec-path-from-shell,它解决了这个确切的问题。(另见Github 存储库)。安装该软件包几乎肯定比复制和粘贴此代码段要好。除了得到适当维护之外,它还支持从您的 shell 设置中复制其他环境变量,因此从 Emacs 启动的任何子进程都将按预期工作。


原始答案: 这是我解决这个问题的方法,它不需要总是从 shell 启动 Emacs(我有时在我的 mac 上也对此感到困扰):

(let ((path (shell-command-to-string ". ~/.zshrc; echo -n $PATH")))
  (setenv "PATH" path)
  (setq exec-path 
        (append
         (split-string-and-unquote path ":")
         exec-path)))

它设置了 Emacs 的PATH环境变量概念(因此它将被子 shell 继承)和 Lisp 变量exec-path,它用于从 Lisp 代码中查找可执行文件并用于某些自动完成目的。您可能还需要检查shell-file-name是否针对您的zsh二进制文件的位置而不是默认的/bin/bash.

于 2012-02-24T21:19:44.190 回答
4

此答案适用于后来发现此问题并由于 Mac 上的 Emacs 默认行为而遇到此问题的人,

如果您在 Mac 上并且想知道如何让 emacs 从 shell 启动,它将以图形模式而不是仅获取文本来获取您自定义的 ENV,然后从 zsh 启动它,如下所示:

 /Applications/Emacs.app/Contents/MacOS/Emacs  

这应该会导致 emacs 看到你所有的 shell(zsh 或其他)定制。

于 2012-02-24T18:08:20.283 回答
4

FWIW,这个问题并不特定于 Mac OS X,因为它也会影响 GNU/Linux 系统,从 GUI 的菜单栏启动 Emacs 通常会导致 Emacs 的 PATH 与从命令启动的 Emacs 不同 -线。这个问题可以追溯到第一个 `xdm' Xsession 脚本,虽然它们很容易修复(基本上使用执行“exec $SHELL -c Xsession”的 Xsessionwrapper 脚本,因此 shell 在运行用户的 Xsession 之前运行),这里20 年后,我们面临着同样的老问题。不知何故,我不希望 gdm3 解决这个问题 ;-(

于 2012-02-25T05:22:45.613 回答
2

Mac OS X 有一个特殊的环境文件,允许为特定用户启动的进程设置环境变量。这允许您为 GUI 应用程序设置环境变量。在您的情况下,您可以使用它为通过单击停靠栏或查找器中的图标启动的任何 emacs 设置 PATH。

该文件位于

~/.MacOSX/environment.plist

您可以在 XCode 中创建文件,但它只是普通的 xml,因此文件的内容如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>PATH</key>
    <string>~/bin:/usr/local/bin:/usr/local/sbin:/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11/bin:</string>
</dict>
</plist>
于 2012-02-25T18:53:17.987 回答
1

调用Emacs 使用的变量而不是PATH调用exec-pathC-h v exec-path RET用于文档和状态)。exec-pathPATH或初始化EMACSPATH。您似乎没有从您的 Emacs 启动 Emacs,zsh因此您的 Emacs 路径与您的 shell 中的路径不完全匹配。

您可以尝试将exec-path其设置在您的.emacsinit.el尽管您必须同时维护两者。我没有看到任何直接获取 shell 配置的方法,但也许你可以正则表达式你的路径。

于 2012-02-24T17:54:09.557 回答
0

您还可以在.zshenv文件中指定 PATH 变量——为子 shell 分配环境的首选约定。只要 zsh 被配置为您用户的默认 shell,.zshenv无论如何调用 emacs,emacs 都会为您提供源。

于 2016-09-28T20:06:41.483 回答