Emacs是无视我的路径时运行,一个编译命令
题
我试图得到一个编译命令(瑞克黄瓜)运行与特定的红宝石上我的Mac OS X系统,我使用的功能要做到这一目前在终端。我~/.MacOSX/环境。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
.
任何想法?
解决方案
一个小的修改,以解决由sanityinc(找不到的方式进入其中的上述评论--这些只是我?)
- 我用
-l
选择壳强制登录的外壳(其中读取.profile
或.bash_profile
),而不是一个互动的外壳(只读.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))
其他提示
每个人似乎误解了原来的问题:路径已正确设置在Emacs,和正确的路径已经被传递给所有由编译命令启动的shell!那么是什么原因?下面是答案:
在MacOS X的,有一个被称为path_helper(1)
小工具。它是由/etc/profile
,这是对的Bash shell启动执行默认调用。当你开始从Emacs的汇编,它会启动一个shell(默认为猛砸在MacOS X),因此执行该path_helper
工具。这里谈到的关键点:path_helper
的重新排列你的路径的,移动的标准目录,如/usr/bin
在您的自定义添加目录,前面不管你最初加入他们。通过打开壳可以先看看我们在走什么路是自己试用,然后执行/usr/lib/path_helper
和具有看看生成的路径!
你的蛮力解决方案可能是简单地注释掉呼叫path_helper
到/etc/profile
。但是请注意,那么你就不会自动/etc/paths.d
得到path_helper
设置的路径,这是该工具的主要目的。
我没有一台Mac,所以我不能直接测试,但是这都可以在* *信息页面的交互式下壳。
当你开始在Emacs一个壳,其被衍生过程是在Emacs的可变explicit-shell-file-name
程序(和如果是nil
,环境变量ESHELL
和SHELL
被使用)。
据然后发送~/.emacs_*shellname*
的内容(例如,如果你的shell是csh
,然后~/.emacs_csh
会送过来。另外,csh
程序中的相应文件.RC其来源,所以你可以更新,以及(在我的情况.cshrc
)。此外,还可以包装在rc文件定制与用于环境变量INSIDE_EMACS
(这其中的Emacs设置它运行一个壳)之前的检查。
您需要更新这些文件,以改变外壳,而不是Emacs的变量exec-path
路径。 exec-path
- 这仅仅是一个目录列表的的Emacs 的用于查找可执行程序。该可执行文件的行为不受改变exec-path
。
我觉得在Mac上的environment.plist方案很丑陋,所以我用下面的代码片段,你想Emacs的使用您在Terminal.app看到相同的路径即假设:
(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对我的作品;还没有尝试过其他的版本,但是我希望它的工作)
也许试试这个。与你的替换路径串。
(添加到列表“负载路径 “〜/选择/斯旺克-的Clojure / SRC / emacs的”)
我观察到据时,Emacs采取的路径从可变它从推出的外壳,所以一个解决办法是改变$ PATH在壳在启动之前的Emacs
我使用的一个其它方法,这是更灵活,是使用生成文件,并附加在每个前面的“源〜/ script_that_set_path”使你有命令。
我已经尝试了许多不同的方法来这一点,结束了不使用emacs设置我的编译命令环境。
我现在要做的就是创建一个简单的初始化一个干净的环境run_helper.sh文件,然后使用exec $*
执行作为参数传递给run_helper.sh
命令
这run_helper.sh
通常是项目的具体,但我一直,我用它来开始,当我创建一个新项目的模板。
然后,从像compile
例如emacs的我简单运行bash run_helper.sh rspec path/to/tests
。
如果我使用它来运行红宝石测试,帮助我的初始化RVM使用适当的红宝石和宝石。如果我使用其他语言,可能只是出口所需的环境变量或执行一些其他初始化,但这样一来,我可以在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
,我不希望只加载运行一些测试。
这工作对我来说有两件事情。
首先,我接着sanityinc建议
代码段的改进和修改版本现在公布为elisp的文库称为EXEC - 路径 - 从壳;安装的包可在果酱和Melpa
我仍然有与编译指令的问题。 Valko Sipuli是正确的有涉及path_helper的问题。
我评论在/ etc /简档的相应行,并没有帮助。问题仍然存在。 我不使用bash,但zsh中。挖一点,我发现在/ etc / zshenv。此文件还调用path_helper。
在评论的path_helper部分后的/ etc / zshenv我的路径是最后正确