Emacs在运行编译命令时忽略了我的路径

Jam*_*yke 13 ruby macos emacs rvm

我正在尝试在我的Mac OS X系统上使用特定的ruby版本运行编译命令(rake cucumber),我使用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))
Run Code Online (Sandbox Code Playgroud)

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

我不希望/ usr/bin和其他人在前面,我希望我的路径首先和emacs前置路径到底,我认为这将解决我的问题.

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

有任何想法吗?

Mar*_*ann 10

每个人似乎都误解了原始问题:路径已在Emacs中正确设置,并且正确的路径已经传递给由compile命令启动的shell!什么给出了什么?这是答案:

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

对你的蛮力解决方案可能是简单地调用注释掉path_helper/etc/profile.但请注意,然后您将不会自动获取/etc/paths.d设置中的路径path_helper,这是工具的主要目的.


Jan*_*nus 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))
Run Code Online (Sandbox Code Playgroud)