如何在emacs中获取我的.zshrc?

时间:2012-02-24 17:12:10

标签: emacs zsh zshrc

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

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

6 个答案:

答案 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-pathC-h v exec-path RET用于文档和状态)。 exec-path已从PATHEMACSPATH初始化。您似乎没有从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的方式如何。