【问题标题】:Emacs is ignoring my path when it runs a compile commandEmacs 在运行编译命令时忽略了我的路径
【发布时间】:2011-01-17 00:53:43
【问题描述】:

我正在尝试在我的 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))

这是一个 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 和其他人在前面,我希望 my 路径在前,emacs 路径在最后,我认为这可以解决我的问题。

我只需打开 Aquamacs 并运行 meta-x compile 然后运行 ​​echo $PATH 即可对此进行测试。

有什么想法吗?

【问题讨论】:

  • 所有的答案都是关于shell命令的,但它们与编译命令不同,不是吗?
  • 我遇到了这种情况,即使我在 /etc/profile 中注释掉了 path_helper,并且我的 $SHELL 是 zsh。

标签: ruby macos emacs rvm


【解决方案1】:

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

(add-to-list 'load-path "~/opt/swank-clojure/src/emacs")

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 在 Mac 上,情况并非如此;从 Finder 启动的 GUI 程序不会继承桌面环境或用户 shell。
      • 抱歉,我从没用过 Mac;我的观察只适用于 windows 和 linux。从终端(或 Mac 中的等价物)启动 Emacs 是否有效?我会(再次)建议尝试 Makefile 方法,因为这是我发现可靠工作的唯一方法(我也为使 PATH 正确编译而苦苦挣扎)。
      【解决方案4】:

      我发现 Mac 上的 environment.plist 方案非常难看,所以我使用以下 sn-p,它假定您希望 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 中适用于我;尚未在其他版本中尝试过,但我希望它可以工作。)

      【讨论】:

        【解决方案5】:

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

        • 我在 shell 中使用-l 选项来强制登录 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))
        

        【讨论】:

        • 不错!我尝试了 sanityinc 并且很困惑,但你的更改为我解决了问题!
        • @spacemanaki:实际上,我已经从 Carbon Emacs 切换到了 Aquamacs (aquamacs.org),其中包括许多其他优点,开箱即用。起初它并没有让人感觉很糟糕,但它确实在我身上成长了。
        • 我实际上是在八月份第一次拿到这台 Macbook 时开始使用 Aquamacs,但由于某种原因我改用了 Carbon Emacs,但我不记得为什么了。回去在 Aquamacs 中尝试这个实际上是导致我检查 Emacs 认为 PATH 是什么的原因。再次感谢!
        • 是的,我的答案中代码的问题是 shell 命令输出中的尾随空格。 string-rtrimreplace-regexp-in-string 整理得更简洁。为了将来参考,我的最新代码在这里:github.com/purcell/emacs.d/blob/master/init-exec-path.el
        • 我很困惑;这个函数如何影响编译外壳?我的 exec-path 已经 正确,但 compilation 缓冲区中的 PATH 错误。
        【解决方案6】:

        大家好像误解了原来的问题:路径已经在 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!

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

        【讨论】:

        • 这个问题依然存在,这个答案是正确的。我不得不编辑 /etc/zshenv 但同样的想法。要查看区别,请查看:(defun my-compile-test () "tests path in compile" (interactive) (compile "echo $SHELL; echo $PATH; exit 1") ) 如果您定义并运行该函数,您可以了解 编译 缓冲区中发生的情况。推荐!
        • 抱歉格式化。奇怪的降价引擎。
        【解决方案7】:

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

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

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

        然后我从 emacs 中简单地运行 compile,例如 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 中有很多东西我不想加载只是为了运行一些测试。

        【讨论】:

          【解决方案8】:

          它在两件事上对我有用。

          首先我听从了 sanityinc 的建议

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

          我仍然有编译命令的问题。 Valko Sipuli 说得对,path_helper 存在问题。

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-07-18
            • 2011-12-18
            • 1970-01-01
            • 2019-04-16
            • 1970-01-01
            • 2012-05-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多