如何在Emacs中引用我的.zshrc文件?

5
当我启动emacs GUI时,PATH没有根据我的.zshrc文件进行设置。如何使用source命令正确设置它?
编辑:我正在尝试使用swank-clojure,但它找不到lein,因为它不在PATH中。

õ¢áµÿ»µîçÕ£¿shell-modeµêûeshellõ©¡õ¢┐þö¿þÜäPATHÕÉù´╝ƒ - pmr
6个回答

15
编辑补充(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


2
顺便提一下,自从我写了这个答案之后,现在在MELPA中有一个可以解决这个问题,名为exec-path-from-shell。最好安装该软件包而不是复制和粘贴此代码片段。除了得到适当的维护外,它还允许从您的正常shell设置中复制其他环境变量,因此从Emacs启动的任何子进程都将按预期工作。 - user725091

4

本答案适用于那些因为Mac上Emacs的默认行为而遇到此问题的人,

如果你正在使用Mac并想知道如何让emacs从shell启动,以图形模式而不是纯文本模式运行,在zsh中使用类似以下命令启动:

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

这应该会让emacs看到你所有的shell(zsh或其他)自定义。

1
这肯定可以解决问题,但是在Mac OS上有没有改变登录shell的方法呢?那将是最终的解决方案。 - pmr
我也对此感兴趣,我认为这是一个非常适合超级用户的问题。 - Arthur Ulfeldt
@pmr,@ArthurUlfeldt 可以通过chsh命令更改登录shell(就像在许多其他Un * ces中一样)。我不确定这是否会影响Emacs。 - Matthias Benkard
1
您也可以在OS X上正常启动Emacs,并使用一个名为exec-path-from-shell的elisp库来设置Emacs的$PATH,以匹配在shell中看到的路径。可在Marmalade和Melpa中获取可安装的软件包。 - sanityinc

4

值得一提的是,这个问题并不仅限于Mac OS X,它也会影响GNU/Linux系统,在GUI菜单栏启动Emacs通常会导致与从命令行启动的Emacs不具有相同PATH。该问题可以追溯到第一个“xdm”的Xsession脚本,并且虽然它们很容易修复(基本上使用一个Xsessionwrapper脚本,执行“exec $ SHELL -c Xsession”,以便在运行用户的Xsession之前运行shell),但我们在20年后仍然遭受着同样的老问题。而且我不指望gdm3会解决这个问题;-(


虽然这并不是一个真正的答案,但它具有很大的趣味性。 - pmr
大多数情况下,这个问题在gdm2中得到了解决,它会源. profile和.xprofile,但据我所知,在gdm3中又出现了问题。当检测到zsh并开始通过zsh运行所有内容而不使用兼容模式时,Kdm似乎会做一些疯狂的事情。 - Arrowmaster

2
Mac OS X有一个特殊的环境文件,用于允许为特定用户启动的进程设置环境变量。这允许您为GUI应用程序设置环境变量。在您的情况下,您可以使用它来为通过单击Dock或Finder中的图标启动的任何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>

1

Emacs 使用的变量是 PATH 的替代,被称为 exec-path(用 C-h v exec-path RET 查看文档和状态)。exec-path 是从 PATH 或者 EMACSPATH 初始化的。看起来你没有从你的 zsh 启动 Emacs,因此你的 Emacs 路径与你的 shell 中的路径不完全匹配。

你可以尝试在你的 .emacs 或者 init.el 中设置 exec-path,尽管你需要同时维护两者。我没有找到直接引用你的 shell 配置的方法,但也许你可以通过正则表达式从中提取出你的路径。


0

你也可以在 .zshenv 文件中指定你的 PATH 变量 -- 这是为子 shell 分配环境的首选约定。只要 zsh 被配置为你的用户默认 shell,无论如何调用 emacs,它都会源化你的 .zshenv


你确定吗?对我来说似乎并非如此。 - hbogert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接