14

我正在尝试获取一个编译命令(rake cucumber)以在我的 Mac OS X 系统上使用特定的 ruby​​ 版本运行,我目前在终端中使用 rvm 来执行此操作。我的 ~/.MacOSX/environment.plist 中包含正确的路径,但 emacs 坚持要添加到该路径的前面,因此使其无用。我也试过:

(when (equal system-type 'darwin)
  (setenv "PATH" (concat "/Users/fearoffish/.rvm/bin:/Users/fearoffish/.rvm/rubies/ruby-1.8.7-p249/bin:/Users/fearoffish/.rvm/gems/ruby-1.8.7-p249/bin:/Users/fearoffish/.rvm/gems/ruby-1.8.7-p249%global/bin:/Users/fearoffish/.rvm/bin"))
  (push "/Users/fearoffish/.rvm/bin" exec-path)
  (push "/Users/fearoffish/.rvm/rubies/ruby-1.8.7-p249/bin" exec-path)
  (push "/Users/fearoffish/.rvm/gems/ruby-1.8.7-p249/bin" exec-path)
  (push "/Users/fearoffish/.rvm/gems/ruby-1.8.7-p249%global/bin" exec-path)
  (push "/Users/fearoffish/.rvm/bin" exec-path))

这是一个 emacs 初学者拼命尝试得到我想要的东西。它仍然在它前面,所以我的路径最终是:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/Users/fearoffish/.rvm/bin:/Users/fearoffish/.rvm/rubies/ruby-1.8.7-p249/bin:/Users/fearoffish/.rvm/gems/ruby-1.8.7-p249/bin:/Users/fearoffish/.rvm/gems/ruby-1.8.7-p249%global/bin

我不希望 /usr/bin 和其他人在前面,我希望我的路径在前,而 emacs 的路径在最后,我认为这可以解决我的问题。

我通过简单地打开 Aquamacs 并运行meta-x compile然后echo $PATH.

有任何想法吗?

4

8 回答 8

10

大家似乎误解了原来的问题:路径已经在 Emacs 中设置正确,并且正确的路径已经传递给了 compile 命令启动的 shell!那么给了什么?这是答案:

在 MacOS X 中,有一个小工具叫做path_helper(1). 默认情况下从 调用它/etc/profile,由 Bash 在 shell 启动时执行。当您从 Emacs 开始编译时,它会启动一个 shell(在 MacOS X 上默认为 Bash),因此会执行此path_helper工具。关键点来了:path_helper 重新排列路径,将标准目录移动到/usr/bin自定义添加目录的前面,无论您最初将它们添加到何处。通过打开 shell 并首先查看 PATH 是什么,然后执行/usr/lib/path_helper并查看生成的 PATH 来亲自尝试一下!

您的蛮力解决方案可能是简单地注释掉对path_helperin的调用/etc/profile。但是请注意,您不会自动获取/etc/paths.dsetup by中的路径path_helper,这是该工具的主要用途。

于 2011-03-02T18:39:20.453 回答
9

sanityinc 对解决方案的一个小修改(在上面的评论中找不到输入它的方法——只有我一个人吗?)

  • 我使用-lshell 的选项来强制登录 shell(读取.profile.bash_profile),而不是交互式 shell(仅读取.bashrc)。
  • 我对返回的路径进行了一些字符串修剪(因为检查显示换行符潜入)。

修改后的代码:

(defun set-exec-path-from-shell-PATH ()
  (let ((path-from-shell 
      (replace-regexp-in-string "[[:space:]\n]*$" "" 
        (shell-command-to-string "$SHELL -l -c 'echo $PATH'"))))
    (setenv "PATH" path-from-shell)
    (setq exec-path (split-string path-from-shell path-separator))))
(when (equal system-type 'darwin) (set-exec-path-from-shell-PATH))
于 2010-04-02T13:48:07.377 回答
2

我没有 Mac,所以无法直接测试,但这都可以在 *info* 页面Interactive Inferior Shell中找到。

当您在 Emacs 中启动 shell 时,生成的进程是 Emacs 变量中的程序explicit-shell-file-name(如果是nil,则使用环境变量ESHELLSHELL)。

然后它发送的内容~/.emacs_*shellname*(例如,如果你的 shell 是csh,那么~/.emacs_csh将被发送过来。此外,程序的适当 .rc 文件csh是有源的,所以你也可以更新它(在我的情况下.cshrc)。此外,你可以包装自定义在 .rc 文件中检查环境变量INSIDE_EMACS(Emacs 在运行 shell 之前设置的环境变量)。

您需要更新这些文件以更改 shell 中的路径,而不是 Emacs 变量exec-pathexec-path- 这只是Emacs用来查找可执行程序的目录列表。可执行文件的行为不受exec-path.

于 2010-02-15T15:59:37.937 回答
2

我发现 Mac 上的 environment.plist 方案非常难看,所以我使用以下代码段,假设您希望 Emacs 使用您在 Terminal.app 中看到的相同 PATH:

(defun set-exec-path-from-shell-PATH ()
  (let ((path-from-shell (shell-command-to-string "$SHELL -i -c 'echo $PATH'")))
    (setenv "PATH" path-from-shell)
    (setq exec-path (split-string path-from-shell path-separator))))

(这在 Emacs 23 中对我有用;在其他版本中没有尝试过,但我希望它能够工作。)

于 2010-02-16T17:57:29.590 回答
0

试试这个也许。用你的替换路径字符串。

(添加到列表'加载路径“〜/ opt/swank-clojure/src/emacs”)

于 2010-02-15T15:57:51.840 回答
0

据我观察,Emacs 从启动它的 shell 中获取路径变量,因此一种解决方案是在启动 Emacs 之前更改 shell 中的 $PATH。

我使用的另一种更灵活的方法是使用 Makefile 并在您拥有的每个 make 命令前面附加一个“source ~/script_that_set_path”。

于 2010-02-16T15:01:19.387 回答
0

它在两件事上对我有用。

首先,我遵循了 sanityinc 的建议

代码片段的改进和修改版本现已发布为名为 exec-path-from-shell 的 elisp 库;Marmalade 和 Melpa 提供可安装的软件包

我仍然有编译命令的问题。Valko Sipuli 是对的,存在涉及 path_helper 的问题。

我在 /etc/profile 中评论了相应的行,但没有帮助。问题依然存在。我不使用bash,而是使用zsh。稍微挖掘了一下,我发现了 /etc/zshenv。该文件还调用 path_helper。

在 /etc/zshenv 中评论 path_helper 部分后,我的路径终于正确了

于 2013-03-29T22:11:36.350 回答
0

我已经尝试了很多不同的方法,最终没有使用 emacs 来设置我的编译命令环境。

我现在要做的是创建一个 run_helper.sh 文件,它只是初始化一个干净的环境,然后exec $*用来执行作为参数传递给run_helper.sh

run_helper.sh通常是特定于项目的,但我保留了一个模板,当我创建一个新项目时我会使用它。

然后我简单地compile从 emacs运行bash run_helper.sh rspec path/to/tests,例如。

如果我使用它来运行 ruby​​ 测试,我的助手会初始化 RVM 以使用正确的 ruby​​ 和 gemset。如果我使用其他语言,它可能只是导出所需的环境变量或执行其他一些初始化,但这样我可以在 bash 脚本中完成,而不是每次开始一个新项目时都必须弄乱 emacs 路径和 elisp。

这是一个run_helper.sh文件的例子

#!/bin/bash

cd /Users/simao/Documents/sp

export DYLD_LIBRARY_PATH="/usr/local/mysql/lib:$DYLD_LIBRARY_PATH"

source "$HOME/.rvm/scripts/rvm" # This loads the proper ruby and gemset from .rvmrc

export RAILS_ENV=test

exec $*

这也使我的测试运行得更快,因为我有很多东西我.zshrc不想加载只是为了运行一些测试。

于 2012-08-15T16:32:21.257 回答