Unstimmigkeiten zwischen Emacs und der Befehlszeile $ PATH unter OSX


17

Einige Probleme mit PATHEinstellungen auf Emacs, die sich auf meine Haskell-Umgebung auswirken:

Ich verwende ZSH. Wenn ich zur Befehlszeile gehe und aufrufe, wird Folgendes zurückgegeben echo $PATH:/Users/g/Library/Haskell/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

Dies kommt von der .zprofileKonfiguration, wo ich habe:

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

Wenn ich also über die Befehlszeile anrufe, which cabalerhalte ich Folgendes richtig:/Users/g/Library/Haskell/bin/cabal

Wenn ich Emacs starte und zu shellund anrufe which cabal, bekomme ich: /usr/bin/cabalwas mir Probleme bereitet, da es eine andere Version ist.

Wenn ich echo $PATHvom Emacs aus inspiziere shell, sehe ich:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/g/Library/Haskell/bin:/usr/local/sbin

Ich habe keine Ahnung, wie um PATHalles in der Welt das anders sein kann ...

Weiß jemand, wie man meine ZSHShell und Emacs dazu bringt, sich auf dasselbe zu einigen PATH? Ich vermute, das ist es, was steuert, woher cabalgeladen wird.

UPDATE : Ausführen echo $SHELLvon Emacs-Ausdrucken:/bin/zsh

UPDATE 2 : Dies ist unter OSX .

UPDATE 3 : Ich habe versucht, das Exec-Path-From-Shell- Modul zu verwenden, aber es funktioniert nicht. Ich habe immer noch die gleichen Probleme und als Nebeneffekt bringt es meine Terminal-Designfarben durcheinander :(

UPDATE 4 : Ich habe Emacs über installiert brew install --cocoa --srgb emacsund starte Emacs, das folgendermaßen verknüpft ist:

~ ❯❯❯ 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

Verwenden Sie ZSH als Login-Shell?
Wasamasa

Ich bin mir nicht sicher, was Sie mit Login-Shell genau meinen, aber ich schätze, ich habe am chsh...
selben

Ich benutze iTerm2 übrigens ...
Galder Zamarreño

2
Anscheinend nicht, ändern Sie PATH in ~/.profile oder /etc/profiledann.
Wasamasa

1
Setzen Sie Ihre Umgebungsvariablen in ~/.zshenv, die beim Starten der Shell konsistent bezogen werden (interaktiv oder nicht interaktiv). Wenn die exec-path-from-shellFarben Ihres Terminaldesigns durcheinander geraten, können Sie vor dem Aufruf die Option einstellen exec-path-from-shell-arguments, um sicherzustellen, dass die interaktiven Teile Ihrer zsh-Konfiguration nicht ausgeführt werden. nilexec-path-from-shell-initialize
Sanityinc

Antworten:



8

Dies ist ein ärgerliches OSX-Problem $PATH in Emacs auftretende stammt aus einer /etc/pathsDatei, an die dann alles angehängt wird, was ich in der Shell festgelegt habe. Ich /Users/g/Library/Haskell/binhabe oben in der /etc/pathsDatei hinzugefügt und es hat dann gut funktioniert.

Wenn Sie in die Shell gehen und echo $PATHEmacs aufrufen , sehen Sie jetzt:/Users/g/Library/Haskell/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin

Und cabaldie Version ist in der Tat cabal-install version 1.22.2.0: D

Vielen Dank an alle !!


Vielen Dank an beOn für seine Hinweise in diesem $PATHOSX- Beitrag .
Galder Zamarreño

2
Eine bessere Lösung besteht darin, den Pfad in zu ändern ~/.zshenv. Die dortigen Änderungen spiegeln sich in Emacs 'PATH
Galder Zamarreño,

Ich kann bestätigen, dass echo export PATH=$PATH > ~/.zshenvEmacs M-x shelles einfach beim nächsten Aufruf abholt.
Linus Arver

5

Wenn Sie Emacs über Ihre GUI-Umgebung (Gnome, KDE, ...) starten, werden Ihre Shell-Startskripte nicht in Ihre Umgebung importiert. Also das $PATH, was du sorgfältig in deine.zsh haben, nicht geladen. GUI-Umgebungen geben diese im Allgemeinen nicht als Quelle aus, obwohl sie möglicherweise Ihre ~/.profileDatei laden .

Sie können versuchen, dies zu Ihrem hinzuzufügen .pam_environment:

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

Sie müssen Ihre GUI-Sitzung neu starten, um sie zu laden.

Dieses Dokument hilft Ihnen möglicherweise dabei, Ihre $PATHVariablen richtig festzulegen:

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

Ich verwende die ~/.pam_environmentDatei, um Umgebungsvariablen zu verwalten, auf die ich von meinen Shell- oder Emacs-Prozessen aus zugreifen muss.

PS: Ein scharfsinniger Kommentator weist darauf hin, dass Sie sich wahrscheinlich auf einem Mac befinden. Ich weiß nicht, wie Sie Ihre $PATHin der Mac-GUI einrichten sollen , aber der Punkt bezieht sich immer noch auf den Unterschied zwischen der Umgebung Ihrer Shell und der GUI-Umgebung. Wie Sie die $PATHfür die GUI einrichten, scheint von der Betriebssystemversion abzuhängen. Sie können jedoch Folgendes verwenden:

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

in deinem ~/.emacs.d/initwenn du nur eine lösung willst die funktionieren soll.

PPS: Wenn Sie eine Shell in Emacs ausführen möchten, ist es wahrscheinlich besser, sie zu verwenden ansi-termals shell.


Ich bezweifle, dass die Frage Linux betrifft, da der Fragesteller die Verwendung von iTerm 2 erwähnt hat .
Wasamasa

3

Wenn ein Teil des PFADS verloren geht, können Sie ihn in Ihre ~ / .emacs einfügen

;;; 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.

Um PATH-Probleme zu vermeiden, starte ich Emacs immer von der Kommandozeile mit dem aus ~ / .bashrc exportierten PATH.


2

Eine andere Möglichkeit, dies zu erreichen, besteht darin, der Shell einfach mitzuteilen, dass es sich um eine Anmeldeshell handelt, sodass sie alle richtigen Dateien bezieht. Ich tue dies für bash , indem explicit-bash-argsan ("--noediting" "--login"). Es sieht aus wie das Äquivalent für zsh zu Satz wäre explicit-zsh-argszu ("-l").

Also in meinem .emacs:

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

In deinem, etwas wie:

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

Ich denke, das "--noediting"ist unnötig, und es scheint keine Möglichkeit zu geben, zsh darüber zu erzählen, aber das könnte etwas zu untersuchen sein, wenn dies nicht so gut funktioniert, wie Sie es sich erhoffen.


1
Dies funktioniert für einen Shell-Run unter Emacs. Es funktioniert nicht für Befehle, die direkt in Emacs ausgeführt werden, z. B. via M-x shell-command.
30.

1

Sie können auch einen OS X-weiten Standardpfad festlegen, indem Sie beispielsweise eine Eigenschaftsliste wie die folgende speichern ~/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>

Der neue Pfad sollte in Shells, Emacs und anderen Anwendungen angezeigt werden, nachdem Sie sich ab- und wieder angemeldet haben.

Diese Methode ändert den Pfad in Anwendungen, die als Anmeldeelemente geöffnet werden, oder wenn Anwendungen nach einem erzwungenen Herunterfahren beim Anmelden erneut geöffnet werden, nicht. Wenn Sie über Emacs, eine Terminalanwendung oder andere Anwendungen verfügen, in denen Sie den Pfad in Anmeldeelementen ändern möchten, müssen Sie diese entfernen.

In 10.9 und früheren Versionen können Sie auch eine Zeile wie die folgende hinzufügen /etc/launchd.conf:

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

Die Unterstützung für /etc/launchd.confwurde jedoch in 10.10 entfernt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.