Frage

Ich versuche, einen Kompilierungsbefehl (Rake Gurke) zu erhalten mit einer bestimmten Ruby-Version auf meinem Mac OS X-System laufen zu lassen, verwende ich rvm dies im Terminal zur Zeit zu tun. My ~ / .MacOSX / environment.plist hat den richtigen Pfad in ihm, aber Emacs beharrt auf diesem Weg auf das Voranstellen und daher ist es nutzlos. Ich habe auch versucht:

(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))

Es war der verzweifelte Versuch eines Emacs Anfänger zu bekommen, was ich wollte. Es noch wird vorangestellt vor ihm, so dass mein Weg endet als:

/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

Ich möchte nicht, / usr / bin und andere voranstellen, ich will mein Pfad erste und der Emacs voran Pfad am Ende zu sein, glaube, ich würde dies mein Problem beheben.

Ich teste dies durch einfaches Aquamacs Öffnen und meta-x compile laufen und dann echo $PATH.

Irgendwelche Ideen?

War es hilfreich?

Lösung

Eine kleine Änderung an die Lösung von sanityinc (konnte nicht einen Weg finden, es in den Kommentaren eingeben oben - ist das nur ich)

  • I Verwendung -l Option an die Shell eine Login-Shell zu zwingen (die .profile oder .bash_profile liest), anstatt eine interaktive Shell (die nur liest .bashrc).
  • Ich mache eine Schnur auf den zurückgegebenen Pfad Trimmen (wie Inspektion zeigt ein Newline in schleichen).

Modifizierte Code:

(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))

Andere Tipps

Jeder scheint das ursprüngliche Problem zu haben, falsch verstanden: Der Weg ist bereits Setup richtig in Emacs, und der richtige Pfad ist bereits an der Schale durch die Kompilierungsbefehl gestartet bestanden! Also, was soll das? Hier ist die Antwort:

In MacOS X gibt es ein kleines Tool namens path_helper(1). Es wird standardmäßig von /etc/profile genannt, die von Bash auf Shell-Start ausgeführt wird. Wenn Sie eine Zusammenstellung von Emacs starten, startet es eine Shell (standardmäßig Bash auf MacOS X ist), und somit führt dieses path_helper Werkzeug. Und hier kommt der entscheidende Punkt: path_helper umlagert Ihren Weg , die Standard-Verzeichnisse wie /usr/bin vor Ihrer benutzerdefinierten hinzugefügt Verzeichnisse zu bewegen, egal wo Sie sie ursprünglich aufgenommen. Versuchen Sie es selbst durch eine Shell öffnen und zunächst einen Blick auf das, was mit PATH ist, und dann /usr/lib/path_helper ausführen und haben Blick auf die resultierende PATH!

Die Brute-Force-Lösung für Sie sein könnte, den Anruf zu path_helper in /etc/profile einfach auf Kommentar. Beachten Sie jedoch, dass dann werden Sie nicht automatisch die Pfade in /etc/paths.d Setup von path_helper bekommen, was der Hauptzweck des Werkzeugs ist.

Ich habe keinen Mac, so dass ich dies nicht direkt testen kann, aber das alles kann in der * Info * Seite Interactive Inferior Shell .

Wenn Sie eine Shell in Emacs starten, der Prozess, der das Programm in der Emacs Variable explicit-shell-file-name hervorgebracht wird (und wenn das nil ist, werden die Umgebungsvariablen ESHELL und SHELL verwendet wird).

Es sendet dann den Inhalt von ~/.emacs_*shellname* (zB wenn die Shell csh, dann würde ~/.emacs_csh geschickt werden. Auch die entsprechenden RC-Dateien für csh Programm stammen, so dass Sie das auch (in meinem Fall .cshrc aktualisieren ). Darüber hinaus können Sie für die Umgebungsvariable INSIDE_EMACS (welche die Emacs-Sets mit einem Scheck von Anpassungen in der RC-Datei wickeln, bevor es eine Shell läuft).

Sie müssen diese Dateien aktualisieren Sie den Pfad in der Shell zu ändern, nicht die Emacs Variable exec-path. exec-path - die nur eine Liste von Verzeichnissen ist Emacs Anwendungen ausführbare Programme zu finden. Das Verhalten der ausführbaren Dateien werden nicht durch Änderungen an exec-path betroffen.

ich das environment.plist Schema auf Macs ziemlich hässlich finden, so dass ich das folgende Snippet verwenden, die Sie Emacs wollen übernimmt den gleichen Weg verwenden, die Sie in Ihrem Terminal.app sehen:

(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))))

(Dies funktioniert für mich in Emacs 23;. Habe es nicht in anderen Versionen ausprobiert, aber ich würde es an der Arbeit erwarten)

vielleicht versuchen dies. ersetzen Sie den Pfad String mit Ihnen.

(Add-to-Liste ‚load-path "~ / opt / Swank-clojure / src / Emacs")

Soweit ich beobachtet, nimmt Emacs die Pfadvariable aus der Shell aus gestartet wird, so ist eine Lösung $ PATH in der Shell zu ändern, bevor Sie Emacs starten.

Ein weiterer Ansatz, den ich verwendet, die flexibler ist, ist ein Makefile zu verwenden und eine „Quelle ~ / script_that_set_path“ vor jedem Make-Befehle Sie haben anhängen.

Ich habe das so viele verschiedene Ansätze versucht, die nicht Emacs-Setup-Umgebung meine Kompilation Befehl endete.

Was ich tue, ist jetzt eine run_helper.sh-Datei zu erstellen, die einfach eine saubere Umgebung initialisiert und verwendet dann exec $* den Befehl als Argument übergeben ausführen zu run_helper.sh

Dieses run_helper.sh ist in der Regel projektspezifische, aber ich halte eine Vorlage, die ich mit beginnen verwenden, wenn ich ein neues Projekt erstellen.

Dann habe ich einfach laufen compile von Emacs wie bash run_helper.sh rspec path/to/tests zum Beispiel.

Wenn ich dies mit Ruby Tests laufe, mein Helfer initialisiert RVM den richtigen Rubin und gemset zu verwenden. Wenn ich eine andere Sprache verwende kann es nur erforderlich Umgebungsvariablen exportieren oder eine andere Initialisierung durchführen, aber auf diese Weise kann ich es in Bash-Skript tun, anstatt immer mit Emacs Pfaden zu Chaos mit und elisp ich jedes Mal ein neues Projekt starten.

Hier ist ein Beispiel für eine run_helper.sh Datei

#!/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 $*

Dies macht auch meine Tests schneller laufen, weil ich viele Sachen in meinem .zshrc habe, dass ich will nicht nur laden einige Tests laufen zu lassen.

Es ist für mich mit zwei Dingen.

Zuerst folgte ich sanityinc Beratung

  

Eine verbesserte und die Version des Codeausschnitt geändert wird jetzt veröffentlicht als elisp Bibliothek exec-Weg-von-Shell aufgerufen; installierbare Pakete sind in Marmalade und Melpa

Ich hatte immer noch ein Problem mit der Kompilierung Befehlen. Valko Sipuli ist richtig, es ein Problem im Zusammenhang mit path_helper war.

Ich kommentierte die entsprechende Zeile in / etc / profile und es hat nicht geholfen. Problem ist immer noch da. Ich benutze keine bash aber zsh. Graben ein wenig ich fand / etc / zshenv. Diese Datei ruft auch path_helper.

Nach Kommentierung des path_helper Abschnitts in / etc / zshenv meinen Weg ist endlich richtig

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top