编辑:我正在尝试使用swank-clojure,但它找不到lein,因为它不在PATH中。
exec-path-from-shell
的软件包,可以解决这个问题。(另请参见Github存储库)。安装该软件包几乎肯定比复制和粘贴此代码片段更好。除了得到适当维护之外,它还支持从您的shell设置中复制其他环境变量,因此从Emacs启动的任何子进程都将按预期工作。
(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
。
exec-path-from-shell
。最好安装该软件包而不是复制和粘贴此代码片段。除了得到适当的维护外,它还允许从您的正常shell设置中复制其他环境变量,因此从Emacs启动的任何子进程都将按预期工作。 - user725091本答案适用于那些因为Mac上Emacs的默认行为而遇到此问题的人,
如果你正在使用Mac并想知道如何让emacs从shell启动,以图形模式而不是纯文本模式运行,在zsh中使用类似以下命令启动:
/Applications/Emacs.app/Contents/MacOS/Emacs
chsh
命令更改登录shell(就像在许多其他Un * ces中一样)。我不确定这是否会影响Emacs。 - Matthias Benkard值得一提的是,这个问题并不仅限于Mac OS X,它也会影响GNU/Linux系统,在GUI菜单栏启动Emacs通常会导致与从命令行启动的Emacs不具有相同PATH。该问题可以追溯到第一个“xdm”的Xsession脚本,并且虽然它们很容易修复(基本上使用一个Xsessionwrapper脚本,执行“exec $ SHELL -c Xsession”,以便在运行用户的Xsession之前运行shell),但我们在20年后仍然遭受着同样的老问题。而且我不指望gdm3会解决这个问题;-(
~/.MacOSX/environment.plist
<?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>
Emacs 使用的变量是 PATH
的替代,被称为 exec-path
(用 C-h v exec-path RET
查看文档和状态)。exec-path
是从 PATH
或者 EMACSPATH
初始化的。看起来你没有从你的 zsh
启动 Emacs,因此你的 Emacs 路径与你的 shell 中的路径不完全匹配。
你可以尝试在你的 .emacs
或者 init.el
中设置 exec-path
,尽管你需要同时维护两者。我没有找到直接引用你的 shell 配置的方法,但也许你可以通过正则表达式从中提取出你的路径。
你也可以在 .zshenv
文件中指定你的 PATH 变量 -- 这是为子 shell 分配环境的首选约定。只要 zsh 被配置为你的用户默认 shell,无论如何调用 emacs,它都会源化你的 .zshenv
。
shell-mode
或eshell
õ©¡õ¢┐þö¿þÜäPATH
ÕÉù´╝ƒ - pmr