当我启动emacs GUI时,根据我的.zshrc设置PATH。如何获取我的.zshrc来正确设置它?
编辑:我正在尝试使用swank-clojure,但它找不到lein,因为它不在PATH
上。
答案 0 :(得分:11)
已编辑添加(2014):现在有package in MELPA名为exec-path-from-shell
,可解决此问题。 (另见Github repository)。安装该软件包几乎肯定更好,而不是复制和粘贴此代码段。除了正确维护之外,它还支持从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
进行自定义。
答案 1 :(得分:4)
FWIW,这个问题不是特定于Mac OS X,因为它也会影响GNU / Linux系统,从GUI的菜单栏启动Emacs通常会导致Emacs没有与从命令行。这个问题可以追溯到第一个`xdm'Xsession脚本,虽然它们很容易修复(基本上使用Xsessionwrapper脚本执行“exec $ SHELL -c Xsession”所以shell在运行用户的Xsession之前运行),这里我们20年后患上了同样的老问题。不知怎的,我不希望gdm3解决这个问题; - (
答案 2 :(得分:1)
变量Emacs使用而不是PATH
被称为exec-path
(C-h v exec-path RET
用于文档和状态)。 exec-path
已从PATH
或EMACSPATH
初始化。您似乎没有从zsh
启动Emacs,因此您的Emacs路径与您的shell中的路径不完全匹配。
您可以尝试在exec-path
或.emacs
中设置init.el
,但您必须同时保留两者。我没有看到任何直接获取shell配置的方法,但也许你可以从中重新编写你的路径。
答案 3 :(得分:1)
这个答案适用于以后发现此问题且由于Mac上的Emacs默认行为而出现此问题的人,
如果你在Mac上并且想知道如何从shell开始使用emacs 它将以图形方式而不是文本方式拾取你的自定义ENV,那么从zsh开始使用这样的东西:
/Applications/Emacs.app/Contents/MacOS/Emacs
这会导致emacs看到所有shell(zsh或其他)自定义。
答案 4 :(得分:1)
Mac OS X有一个special environment file,允许为特定用户启动的流程设置环境变量。这允许您为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>
答案 5 :(得分:0)
您还可以在.zshenv
文件中指定PATH变量 - 这是为子shell分配环境的首选约定。只要将zsh配置为您的用户的默认shell,emacs就会搜索您的.zshenv
,无论调用emacs的方式如何。