14

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や他の人の前に付けたくない、最初に自分のパスを、最後にemacsの前に付けたパスを付けたい、これで問題が解決すると思います。

Aquamacsを開いて実行meta-x compileし、次に実行するだけでこれをテストしecho $PATHます。

何か案は?

4

8 に答える 8

10

誰もが元の問題を誤解しているようです:パスはすでにEmacsで正しく設定されており、正しいパスはコンパイルコマンドによって開始されたシェルにすでに渡されています!では、何が得られるのでしょうか?答えは次のとおりです。

MacOS Xには、と呼ばれる小さなツールがありますpath_helper(1)。デフォルトでは、から呼び出され/etc/profile、シェルの起動時にBashによって実行されます。Emacsからコンパイルを開始すると、シェル(MacOS XではデフォルトでBash)が起動するため、このpath_helperツールが実行されます。そして、ここで重要なポイントがありpath_helper ます。パスを再配置/usr/binし、最初に追加した場所に関係なく、カスタムで追加したディレクトリの前のように標準ディレクトリを移動します。シェルを開いて、最初にPATHが何であるかを確認してから、実行/usr/lib/path_helperして結果のPATHを確認することにより、これを自分で試してください。

あなたのための強引な解決策は、path_helperinへの呼び出しを単にコメントアウトすることかもしれません/etc/profile。ただし、ツールの主な目的である/etc/paths.dによって、セットアップでパスが自動的に取得されないことに注意してください。path_helper

于 2011-03-02T18:39:20.453 に答える
9

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))
于 2010-04-02T13:48:07.377 に答える
2

私はMacを持っていないので、これを直接テストすることはできませんが、これはすべて*info*ページのInteractiveInferiorShellにあります。

Emacsでシェルを開始すると、生成されるプロセスはEmacs変数のプログラムですexplicit-shell-file-name(その場合はnil、環境変数ESHELLSHELLが使用されます)。

次に、の内容を送信し~/.emacs_*shellname*ます(たとえば、シェルがcshの場合、~/.emacs_csh送信されます。また、プログラムに適切な.rcファイルcshが供給されるため、それも更新できます(私の場合.cshrc)。さらに、カスタマイズをラップすることもできます。 .rcファイルで環境変数INSIDE_EMACS(Emacsがシェルを実行する前に設定する)をチェックします。

Emacs変数ではなく、シェルのパスを変更するには、これらのファイルを更新する必要がありますexec-path-これは、 Emacsが実行可能プログラムを見つけるために使用するexec-pathディレクトリの単なるリストです。実行可能ファイルの動作は、への変更による影響を受けません。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

私が観察した限りでは、Emacsは起動元のシェルからパス変数を取得するため、1つの解決策は、Emacsを起動する前にシェルの$PATHを変更することです。

私が使用したもう1つのアプローチは、より柔軟で、Makefileを使用して、使用している各makeコマンドの前に「source〜/script_that_set_path」を追加することです。

于 2010-02-16T15:01:19.387 に答える
0

多分これを試してみてください。パス文字列を自分のものに置き換えます。

(リストに追加'ロードパス"〜/ opt / swank-clojure / src / emacs")

于 2010-02-15T15:57:51.840 に答える
0

私はこれに対して非常に多くの異なるアプローチを試しましたが、最終的にはemacsを使用してコンパイルコマンド環境をセットアップしませんでした。

私が今していることは、クリーンな環境を初期化するだけでexec $*、引数として渡されたコマンドを実行するために使用するrun_helper.shファイルを作成することです。run_helper.sh

これrun_helper.shは通常プロジェクト固有ですが、新しいプロジェクトを作成するときに最初に使用するテンプレートを保持しています。

次に、たとえばcompile、emacsから単純に実行します。bash run_helper.sh rspec path/to/tests

これを使用してrubyテストを実行している場合、ヘルパーはRVMを初期化して適切なrubyとgemsetを使用します。他の言語を使用している場合は、必要な環境変数をエクスポートするか、他の初期化を実行するだけですが、この方法では、新しいプロジェクトを開始するたびにemacsパスをいじったり、elispを実行したりする代わりに、bashスクリプトで実行できます。

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 に答える
0

それは2つのことで私のために働いた。

最初に私はsanityincのアドバイスに従いました

コードスニペットの改良および変更されたバージョンは、exec-path-from-shellと呼ばれるelispライブラリとして公開されるようになりました。インストール可能なパッケージは、マーマレードとメルパで利用できます

コンパイルコマンドにまだ問題がありました。Valko Sipuliは、path_helperに関連する問題があったのは正しいです。

/ etc / profileの対応する行にコメントしましたが、役に立ちませんでした。まだ問題があります。私はbashではなくzshを使用しています。少し掘り下げると、/ etc/zshenvが見つかりました。このファイルはpath_helperも呼び出します。

/ etc / zshenvのpath_helperセクションにコメントした後、私のパスは最終的に正しいです

于 2013-03-29T22:11:36.350 に答える