PATH和exec-path设置,但emacs找不到可执行文件

Cal*_*laf 35 emacs dot-emacs

我的.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)
Run Code Online (Sandbox Code Playgroud)

/ usr/texbin是latex/pdflatex/..所在的位置./ opt/local/bin /是可以找到gs的地方.

然而,当我运行预览时,显然需要乳胶和gs,我得到了

Preview-DviPS finished at Thu Dec 22 11:25:46
DviPS sentinel: Searching for program: No such file or directory, gs
Run Code Online (Sandbox Code Playgroud)

这意味着可以找到乳胶,但不是gs.

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

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

san*_*inc 62

如果您在$PATHEmacs中进行设置,则可能是OS X. GUI应用程序不是通过shell启动的,因此它们会看到不同的环境变量.

这是一个技巧,我用它来确保$PATH内部Emacs与我看到的相同,如果我启动终端(但请参阅下面的"更新"):

(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))))
Run Code Online (Sandbox Code Playgroud)

然后只需set-exec-path-from-shell-PATH从您的Emacs init文件中调用该函数即可.我把这些代码保存在github上,BTW.

更新:此代码现已改进并作为名为exec-path-from-shell的elisp库发布; MELPA中提供可安装的软件包.

  • @卡拉夫答案已经按照承诺进行了更新。我没有参与其他stackexchange网站,并且Emacs问题的正确答案是一个长期存在争议的话题,因此我将拒绝提出该问题。 (2认同)
  • 是的。GUI 应用程序不是通过 shell 启动的,因此它们看不到 shell 的任何环境设置。如果您通过从 shell 运行 `/Applications/Emacs.app/Contents/MacOS/Emacs` 来启动 Emacs,它可能会看到正确的 $PATH。OSX 使用“environment.plist”文件来确定 GUI 应用程序看到的环境变量,但我上面的方法避免了编辑该文件*和*“.bash_profile”的需要。 (2认同)

hua*_*uan 11

尝试用这个替换第二行:

(setq exec-path (append exec-path '("/usr/texbin" "/opt/local/bin")))
Run Code Online (Sandbox Code Playgroud)