路径和exec-path已设置,但是emacs找不到可执行文件。

40

我的.emacs文件包含

(setenv "PATH" (concat ".:/usr/texbin:/opt/local/bin" (getenv "PATH")))
(setq exec-path (append exec-path '(".:/usr/texbin:/opt/local/bin")))

(add-to-list 'load-path "/usr/local/share/emacs/site-lisp")
(require 'tex-site)
(load "auctex.el" nil t t)
(load "preview-latex.el" nil t t)

/usr/texbin是存放latex/pdflatex等文件的位置。 /opt/local/bin/是gs的存放位置。

然而,当我运行preview-at-point时(该命令需要latex和gs),我却遇到了问题。

Preview-DviPS finished at Thu Dec 22 11:25:46
DviPS sentinel: Searching for program: No such file or directory, gs

这意味着latex可以找到,但gs没有被找到。

我不确定是否需要设置exec-path,也许PATH足够了,但我已经将其设置为调试措施。

为什么emacs不能找到gs,即使它所在的目录在PATH和exec-path中都存在?

4个回答

73
如果你在Emacs中设置了$PATH,那么你可能使用的是OS X操作系统。GUI应用程序不是通过shell启动的,因此它们会看到不同的环境变量。
这里有一个技巧,我用来确保Emacs内部的$PATH与我在终端中看到的一致(但请参见下面的“更新”):
(defun set-exec-path-from-shell-PATH ()
  "Set up Emacs' `exec-path' and PATH environment variable to match that used by the user's shell.

This is particularly useful under Mac OSX, where GUI apps are not started from a shell."
  (interactive)
  (let ((path-from-shell (replace-regexp-in-string "[ \t\n]*$" "" (shell-command-to-string "$SHELL --login -i -c 'echo $PATH'"))))
    (setenv "PATH" path-from-shell)
    (setq exec-path (split-string path-from-shell path-separator))))

那么,只需从您的Emacs初始化文件中调用set-exec-path-from-shell-PATH函数即可。顺便说一下,我将该代码放在了Github上
更新:现在这段代码已经得到改进,并作为一个名为exec-path-from-shell的elisp库发布;可以在MELPA中获取可安装的软件包。

2
@Calaf 承诺的答案已经更新了。我不涉足其他的 StackExchange 网站,而 Emacs 问题的正确归属地是一个长期存在争议的话题,所以我会拒绝移动这个问题。 - sanityinc
2
是的。GUI应用程序不是通过您的shell启动的,因此它们看不到任何shell的环境设置。如果您通过从shell运行/Applications/Emacs.app/Contents/MacOS/Emacs来启动Emacs,它可能会看到正确的$PATH。OSX使用environment.plist文件来确定GUI应用程序看到的环境变量,但我上面的方法避免了编辑该文件和.bash_profile的需要。 - sanityinc
@sanityinc:在exec-path中,exec-directory通常是最后一个元素。也许可以将其添加到你的代码中? - hruvulum
@hruvulum 感谢您的指引 - 这段代码的“精简”版本现在正好做到了这一点:https://github.com/purcell/exec-path-from-shell - sanityinc
1
@Zelphir exec-path-from-shell 通常会设置 eshell-path-env。如果您需要帮助,请随时在 repo 上提交问题。 - sanityinc
显示剩余9条评论

12

试着将第二行替换为以下内容:

(setq exec-path (append exec-path '("/usr/texbin" "/opt/local/bin")))

1
这解决了gs问题,但现在又出现了另一个问题,似乎与由gs生成的文件的权限有关。让我单独提出这个问题。 - Calaf

1

我遇到了类似的问题,但是我的路径是正确的,包括尾随的冒号。后来发现内部的emacs shell程序缺失,导致出现“搜索程序:找不到文件或目录”的消息。使用以下方法进行修复:

(setq shell-file-name "bash").

-3

看起来你的路径字符串末尾缺少路径分隔符:


使用“.:/usr/texbin:/opt/local/bin:”(注意末尾的: - Drew
在添加终止路径分隔符(并重新启动emacs)后,我仍然收到相同的错误。 - Calaf
不!绝对不能这样做。这是针对shell PATH而不是exec-path变量的,后者只是一个列表。 - Thomas

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