Question

Je suis en train d'obtenir une commande de compilation (concombre râteau) pour fonctionner avec une version spécifique rubis sur mon système Mac OS X, j'utilise RVM pour ce faire actuellement dans le terminal. Mon ~ / .MacOSX / environment.plist a le bon chemin en elle, mais emacs insiste sur préfixer sur ce chemin, et donc ce qui rend inutile. J'ai aussi essayé:

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

Ce fut la tentative désespérée d'un débutant emacs pour obtenir ce que je voulais. Il toujours précèder devant, donc mon chemin finit par être:

/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

Je ne veux pas / usr / bin et d'autres préfixer, je veux my chemin premier et le chemin emacs être à ajout initial à la fin, je pense cela résoudre mon problème.

Je teste en ouvrant simplement Aquamacs et en cours d'exécution meta-x compile puis echo $PATH.

Toutes les idées?

Était-ce utile?

La solution

Une petite modification à la solution par sanityinc (n'a pas pu trouver un moyen d'entrer dans les commentaires ci-dessus - est-ce juste moi)

  • I utiliser l'option -l à la coquille pour forcer une coquille de connexion (qui lit .profile ou .bash_profile), plutôt que d'une interface interactive (qui ne lit que .bashrc).
  • Je fais une chaîne de coupe sur le chemin de retour (comme l'inspection montre un saut de ligne se faufilant dans).

Code modifié:

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

Autres conseils

Tout le monde semble avoir mal compris la question d'origine: le chemin est déjà configuré correctement dans Emacs, et le chemin correct est déjà passé à la coquille a commencé par la commande de compilation! Alors qu'est-ce qui se passe? Voici la réponse:

Dans Mac OS X, il y a un petit outil appelé path_helper(1). Il est appelé par défaut à partir /etc/profile, qui est exécuté par Bash au démarrage du shell. Lorsque vous démarrez une compilation à partir Emacs, il lance un shell (qui par défaut est Bash sur Mac OS X), et exécute donc cet outil path_helper. Et voici le point clé: path_helper réarrange votre chemin , le déplacement des répertoires standard comme /usr/bin devant vos répertoires ajoutés personnalisés, peu importe où vous les avez ajoutés à l'origine. Essayez vous-même en ouvrant une coquille et d'abord avoir un regard sur ce chemin est, puis exécutez /usr/lib/path_helper et ont le regard sur! PATH résultant

La solution de la force brute pour vous est peut-être commenter simplement l'appel à path_helper en /etc/profile. Notez toutefois que vous ne sera pas automatiquement les chemins dans la configuration du /etc/paths.d par path_helper, ce qui est le but principal de l'outil.

Je n'ai pas un Mac, donc je ne peux pas tester directement, mais cela peut être trouvé dans le * info * page interactive Shell Inferior.

Lorsque vous démarrez un shell dans Emacs, le processus qui a donné naissance obtient est le programme dans la variable explicit-shell-file-name Emacs (et si tel est nil, les variables d'environnement ESHELL et SHELL sont utilisés).

Il envoie alors le contenu de ~/.emacs_*shellname* (par exemple, si votre shell est csh, alors ~/.emacs_csh serait envoyé plus. De plus, les fichiers .rc appropriés pour le programme de csh est sourcés, vous pouvez mettre à jour cela aussi (dans mon cas .cshrc ). de plus, vous pouvez envelopper personnalisations dans le fichier .rc avec un chèque de l'environnement INSIDE_EMACS variable (qui qu'Emacs fixe avant d'exécuter un shell).

Vous devez mettre à jour ces fichiers pour changer le chemin dans la coquille, pas la exec-path variables Emacs. exec-path - qui est juste une liste de répertoires Emacs utilise pour trouver des programmes exécutables. Le comportement des executables ne sont pas affectés par les changements à exec-path.

Je trouve le système environment.plist sur Mac assez laid, donc j'utilise l'extrait suivant, ce qui suppose que vous souhaitez Emacs utiliser le même chemin que vous voyez dans votre 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))))

(Cela fonctionne pour moi dans Emacs 23;. L'ont pas essayé dans d'autres versions, mais je pense que cela fonctionne)

essayer peut-être. remplacer la chaîne de chemin avec le vôtre.

(add-to-list « load-path "~ / opt / Swank-clojure / src / emacs")

Pour autant que je remarquai, Emacs prend la variable de chemin depuis le shell est lancé à partir, donc une solution consiste à changer $ PATH dans le shell avant de lancer Emacs.

Une autre approche je, qui est plus souple, est d'utiliser un Makefile et ajouter une « source ~ / script_that_set_path » devant chaque faire des commandes que vous avez.

Je l'ai essayé tant de différentes approches de ce qui a fini par ne pas utiliser emacs pour configurer mon environnement de commande de compilation.

Ce que je fais maintenant est de créer un fichier run_helper.sh qui initialisent un environnement propre et utilise ensuite exec $* pour exécuter la commande passée en argument à run_helper.sh

Ce projet est run_helper.sh généralement spécifique, mais je garde un modèle que je l'utilise pour commencer quand je crée un nouveau projet.

Alors je lance simplement compile de emacs comme bash run_helper.sh rspec path/to/tests par exemple.

Si j'utilise ceci pour exécuter des tests de rubis, mon aide RVM à utiliser initialise le rubis et gemset appropriée. Si j'utilise une autre langue, il peut simplement exporter les variables d'environnement nécessaires ou effectuer une autre initialisation, mais cette façon, je peux le faire dans le script bash au lieu d'avoir toujours à salir avec des chemins emacs et elisp chaque fois que je commence un nouveau projet.

Voici un exemple d'un fichier 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 $*

Cela rend également mes tests courir plus vite parce que j'ai beaucoup de choses dans mon .zshrc que je ne veux pas charger juste pour exécuter des tests.

Il a travaillé pour moi deux choses.

D'abord, je suivais des conseils sanityinc

  

Une version améliorée et modifiée de l'extrait de code est maintenant publié en tant que elisp bibliothèque appelée exec-chemin-de-shell; paquets installables sont disponibles dans la marmelade et Melpa

J'avais encore un problème avec les commandes de compilation. Valko Sipuli est juste il y avait un problème impliquant path_helper.

Je commentais la ligne correspondante dans / etc / profile et il n'a pas aidé. Problème toujours là. Je ne l'utilise bash mais zsh. Creuser un peu que je trouve / etc / zshenv. Ce fichier appelle également path_helper.

Après avoir commenté la section path_helper dans / etc / zshenv mon chemin est finalement correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top