Emacs et ligne de commande $ PATH désaccords sur OSX

18

Avoir des problèmes avec les PATHparamètres d'Emacs qui affectent mon environnement Haskell:

J'utilise ZSH, et quand je vais sur la ligne de commande et que j'appelle echo $PATH, il renvoie:/Users/g/Library/Haskell/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

Cela vient de la .zprofileconfiguration où j'ai:

# Set the list of directories that Zsh searches for programs.
path=(
  ~/Library/Haskell/bin
  /usr/local/{bin,sbin}
  $path
)

Ainsi, à partir de la ligne de commande, lorsque j'appelle which cabal, j'obtiens correctement:/Users/g/Library/Haskell/bin/cabal

Quand je démarre Emacs et que je vais sur shellet j'appelle which cabal, je reçois: /usr/bin/cabalce qui me pose problème car c'est une version différente.

Quand j'inspecte echo $PATHdepuis Emacs shell, je vois:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/g/Library/Haskell/bin:/usr/local/sbin

Je ne sais pas comment ça PATHpeut être différent ...

Tout le monde sait comment obtenir mon ZSHshell et Emacs d'accord sur le même sujet PATH? Je soupçonne que c'est ce qui contrôle d'où cabalvient le chargement.

MISE À JOUR : Exécution à echo $SHELLpartir des impressions Emacs:/bin/zsh

MISE À JOUR 2 : C'est sur OSX .

MISE À JOUR 3 : J'ai essayé d'utiliser le module exec-path-from-shell et cela ne fonctionne pas. J'ai toujours les mêmes problèmes, et comme effet secondaire, cela gâche les couleurs de mon thème de terminal :(

MISE À JOUR 4 : J'ai installé Emacs via brew install --cocoa --srgb emacset je lance emacs qui est lié de cette façon:

~ ❯❯❯ which emacs
/usr/local/bin/emacs
~ ❯❯❯ l /usr/local/bin/emacs
lrwxr-xr-x  1 g  admin    30B 29 Jan 18:34 /usr/local/bin/emacs -> ../Cellar/emacs/24.4/bin/emacs
~ ❯❯❯ l /usr/local/Cellar/emacs/24.4/bin/emacs
-r-xr-xr-x  1 g  admin    87B 29 Jan 18:34 /usr/local/Cellar/emacs/24.4/bin/emacs
Galder Zamarreño
la source
Utilisez-vous ZSH comme shell de connexion?
wasamasa
Je ne sais pas exactement ce que vous entendez par shell de connexion exactement, mais je suppose que j'ai chsh...rappelé dans la journée pour changer mon shell par défaut
Galder Zamarreño
J'utilise iTerm2 btw ...
Galder Zamarreño
2
Apparemment non, modifiez PATH dans ~/.profileou /etc/profileensuite.
wasamasa
1
Définissez vos variables d'environnement dans ~/.zshenv, qui proviendront de manière cohérente quel que soit le shell démarré (interactif ou non interactif). Si exec-path-from-shellsalit vos couleurs du thème du terminal, vous pouvez définir exec-path-from-shell-argumentsà nilavant d' appeler exec-path-from-shell-initializepour vous assurer qu'il ne court pas les parties interactives de votre config zsh.
sanityinc

Réponses:

14

Vous pouvez également installer le package exec-path-from-shell et l'ajouter à votre fichier init:

(exec-path-from-shell-initialize)
Basak
la source
1
La question serait meilleure avec un lien vers le package cité .
Drew
Vous avez raison, je viens de modifier ma réponse.
Basak
1
C'est tout ce que je voulais.
djhaskin987
8

Il s'agit d'un problème d'environnement OSX ennuyeux, l' $PATHapparence dans Emacs provient d'un /etc/pathsfichier, qui est ensuite ajouté avec tout ce que j'ai défini dans le shell. J'ai ajouté /Users/g/Library/Haskell/binen haut du /etc/pathsfichier et cela a bien fonctionné.

Entrer dans le shell et appeler echo $PATHEmacs montre maintenant:/Users/g/Library/Haskell/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin

Et caballa version est en effet cabal-install version 1.22.2.0: D

Merci a tous!!

Galder Zamarreño
la source
Merci à beOn pour ses conseils dans ce post$PATH sur OSX .
Galder Zamarreño
2
Une meilleure solution consiste à modifier le chemin d'accès ~/.zshenv. Les changements y sont reflétés dans le CHEMIN d'Emacs
Galder Zamarreño
Je peux confirmer que faire simplement echo export PATH=$PATH > ~/.zshenvincite Emacs à le M-x shellreprendre lors de la prochaine invocation.
Linus Arver
5

Si vous démarrez emacs à partir de votre environnement GUI (gnome, kde, ...), vos scripts de démarrage du shell ne proviendront pas de votre environnement. Ainsi, le $PATHque vous avez soigneusement défini dans votre .zshne sera pas chargé. Les environnements GUI ne génèrent généralement pas ces sources, bien qu'ils puissent charger votre ~/.profilefichier.

Vous pouvez essayer d'ajouter ceci à votre .pam_environment:

PATH DEFAULT=${PATH}:/MYHOMEDIR/Library/Haskell/bin:/usr/local/bin:/usr/local/sbin

Vous devrez redémarrer votre session GUI pour la charger.

Ce document peut vous aider à obtenir votre $PATHensemble de variables correctement:

https://help.ubuntu.com/community/EnvironmentVariables#Session-wide_environment_variables

J'utilise le ~/.pam_environmentfichier pour gérer les variables d'environnement dont j'ai besoin pour être accessible à partir de mes processus shell ou emacs.

PS: Un commentateur astucieux souligne que vous êtes probablement sur Mac. Je ne sais pas comment configurer votre $PATHdans l'interface graphique de Mac, mais le point demeure concernant la différence entre l'environnement de votre shell et l'environnement GUI. La configuration $PATHde l'interface graphique semble dépendre de la version du système d'exploitation. Cependant, vous pouvez utiliser:

(setenv "PATH" (concat (getenv "PATH") ":/foo/bar"))

dans votre ~/.emacs.d/initsi vous voulez juste une solution qui devrait fonctionner.

PPS: Si vous voulez exécuter un shell dans emacs, il vaut mieux utiliser ansi-termplutôt que shell.

Erik Hetzner
la source
Je doute que la question porte sur Linux étant donné que l'intervenant a mentionné l'utilisation d' iTerm 2 .
wasamasa
3

Si une partie du PATH est perdue, vous pouvez l'ajouter dans votre ~ / .emacs

;;; We add /path/to/something/extra by appending it to the path
(setenv "PATH" (concat (getenv "PATH") ":/path/to/something/extra"))
;;; /path/to/something/extra is now at the end of the PATH.
;;; or you can use:
;(setenv "PATH" (concat "/path/to/something/extra:" (getenv "PATH")))
;;; /path/to/something/extra is now at the beginning of the PATH.

Pour éviter les problèmes de PATH, je démarre toujours emacs à partir de la ligne de commande avec le PATH exporté de ~ / .bashrc.

m43cap
la source
2

Une autre façon d'accomplir cela est de simplement dire au shell qu'il s'agit d'un shell de connexion afin qu'il source tous les bons fichiers. Je fais cela pour bash en définissant explicit-bash-argssur ("--noediting" "--login"). Il semble que l'équivalent de zsh soit défini explicit-zsh-argssur ("-l").

Donc dans mon .emacs:

(setq explicit-bash-args '("--noediting" "--login"))

Dans le vôtre, quelque chose comme:

(setq explicit-zsh-args '("-l"))

Je pense que ce "--noediting"n'est pas nécessaire, et il ne semble pas y avoir de moyen d'en parler à zsh, mais cela pourrait être quelque chose à étudier si cela ne fonctionne pas aussi bien que vous l'espérez.

Ted Lemon
la source
1
Cela fonctionne pour un shell exécuté sous Emacs. Cela ne fonctionne pas pour les commandes exécutées directement dans Emacs, comme via M-x shell-command.
mernst
1

Vous pouvez également définir un chemin par défaut à l'échelle de l'OS X en enregistrant par exemple une liste de propriétés comme celle-ci en tant que ~/Library/LaunchAgents/my.startup.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>my.startup</string>
  <key>ProgramArguments</key>
  <array>
    <string>sh</string>
    <string>-c</string>
    <string>launchctl setenv PATH /usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

Le nouveau chemin doit être affiché dans les shells, Emacs et autres applications après vous être déconnecté et reconnecté.

Cette méthode ne modifie pas le chemin d'accès dans les applications ouvertes en tant qu'éléments de connexion ou lorsque les applications sont rouvertes à la connexion après un arrêt forcé. Si vous avez Emacs, une application de terminal ou d'autres applications dont vous souhaitez modifier le chemin dans les éléments de connexion, vous devrez les supprimer.

Dans 10.9 et versions antérieures, vous pouvez également ajouter une ligne comme celle-ci à /etc/launchd.conf:

setenv PATH /usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

Cependant, le support pour a /etc/launchd.confété supprimé en 10.10.

nisetama
la source