Ich habe Beispiele online gesehen, in denen Leute dem Standardpfad in Emacs Pfade hinzufügen mit:
(add-to-list 'exec-path "/usr/local/bin/")
Ich bin neu bei Elisp und ich denke, ich verstehe, was die obige Aussage bewirkt, aber ich habe ein paar Fragen:
In welcher Reihenfolge durchsucht Emacs die Ausführungspfade? Berücksichtigt es beispielsweise den Wert von
$PATH
(Umgebungsvariable) überhaupt (und wenn ja, davor oder danachexec-path
?)Wie kann ich mehrere solcher Pfade voranstellen ? Kann ich sie einfach weiter verketten? z.B
(add-to-list 'exec-path "PATH1", "PATH2")
oder soll ich tun:
(add-to-list 'exec-path "PATH1:PATH2:PATH3")
Ich fand dieses interessante Paket auch auf GitHub: exec-path-from-shell . Warum braucht man dafür ein Paket?
Motivation
Finden Sie jemals heraus, dass ein Befehl in Ihrer Shell funktioniert, aber nicht in Emacs?
Dies passiert häufig unter OS X, wo eine über die GUI gestartete Emacs-Instanz einen Standardsatz von Umgebungsvariablen erbt.
Diese Bibliothek löst dieses Problem, indem sie wichtige Umgebungsvariablen aus der Shell des Benutzers kopiert: Sie fordert Ihre Shell auf, die gewünschten Variablen auszudrucken und sie dann in die Emacs-Umgebung zu kopieren.
(describe-function 'add-to-list)
(C-h f
) gibt Ihnen das Dokument für dieadd-to-list
Funktion sowie Links zur Quelle. Es gibt auch(describe-variable 'exec-path)
(C-h v
). Dies ist kein RTFM-Kommentar. Diese Dokumente beantworten nicht alle Fragen, die Sie aufgeführt haben, sondern sind nur nützlich.C-h v exec-path
, verwenden Sie die manuelle (n) (Emacs und Elisp).i exec-path
Leitet Sie in einem Handbuch zu einer hilfreichen Erklärung. Fragen Sie zuerst Emacs - Sie werden es nicht bereuen.Antworten:
1)
PATH
undexec-path
Emacs setzt
exec-path
den Wert vonPATH
beim Start ab, wird ihn aber später nicht erneut betrachten. Wenn Sie jedoch einen Befehl ausführen, wird dieser erbenPATH
, nichtexec-path
, sodass Unterprozesse andere Befehle finden können als Emacs.Wie Francesco sagt, kann dies besonders verwirrend sein
shell-command
, da dies keinen Prozess direkt ausführt, sondern eine Shell aufruft, um ihn auszuführen, die dies jedochPATH
nicht verwendetexec-path
.2) Hinzufügen mehrerer Pfade zu
exec-path
Rufen Sie einfach
add-to-list
wiederholt an:Beachten Sie, dass dies
add-to-list
am Anfang der Liste steht, so dass es sich letztendlich um"PATH2"
dasexec-path
Vorherige handelt"PATH1"
.Sie können auch mehr "Low-Level" -Zugriff auf Listen verwenden:
Dies fügt
"PATH1"
und"PATH2"
zu Ihrer hinzuexec-path
, in dieser Reihenfolge.3) Mac OS-PFAD
Das Problem unter Mac OS X ist, dass Mac OS die Umgebung nicht gleich einstellt, wenn Sie ein Programm von der globalen Benutzeroberfläche oder von einer Shell aus aufrufen. Das bedeutet, dass beim Ausführen von Emacs von einer Shell aus andere Umgebungsvariablen festgelegt werden als beim Ausführen über den Finder. Dies ist besonders ärgerlich, wenn Sie Umgebungsvariablen
.bashrc
oder ähnliches setzen, da dies keinen Einfluss auf den "globalen" Emacs hat.Das Paket startet anscheinend eine Shell und importiert Umgebungsvariablen von dort und ahmt die Umgebung nach, die Sie von einer Shell in einem global gestarteten Emacs erhalten.
quelle
PATH
für Programme definiert ist, die über die globale Benutzeroberfläche (Desktop-Umgebung) gestartet wurden? Ich habe das gleiche Problem mitPYTHONPATH
inelpy
:). Wenn ich Emacs vom Desktop aus starte, sind Emacs meinePYTHONPATH
Definitionen in meiner.zshenv
Datei (eine Init-Datei fürzsh
) nicht bekannt, was sehr frustrierend ist, daelpy
ich dann nicht weiß, wo ich meine Python-Pakete finde. Ich bin froh, diesePYTHONPATH
Definitionen in eine andere Shell-init
Datei zu verschieben (obwohl ich Emacs im Idealfall bitten würde, die Definitionen aus meiner zu verwenden.zshenv
)exec-path
als auchPATH
in Ihren einstellen.emacs
. Sie können einstellen ,PATH
verwenden(setenv "PATH" (format "%s:%s" "/new/path/element" (getenv "PATH")))
.PYTHONPATH
, welches verwendet werdenelpy
soll?process-environment
zum Beispiel mit ändernsetenv
. Sie können dies tunelpy-mode-hook
, aber es ist eine globsl-Variable, und wenn Sie sie pufferlokal machen, kann dies leicht zu verwirrendem Verhalten führen.Wenn emacs einen neuen externen Prozess mit primitiven Funktionen wie
call-process
oder startetstart-process
, wird die ausführbare Datei durchsuchtexec-path
(und nicht$PATH
)Eine Funktion wie
shell-command
startet die Shell jedoch als Unterprozess und übergibt ihr den Befehl, den Sie ausführen möchten. Um diesen Befehl auszuführen, versucht die Shell, die ausführbare Datei in$PATH
(und nicht inexec-path
) zu finden.exec-path
Für externe Prozesse, die von emacs selbst gestartet werden , zählt daher am meisten, während$PATH
für Befehle, die Sie selbst mit einer übergeordneten Funktion ausführen ( M-!z. B. mithilfe von), das gilt.Wenn Sie mehrere Verzeichnisse hinzufügen möchten
exec-path
, sollten Sieadd-to-list
mehrere Male verwenden.Sie können es entweder manuell tun
oder mit einer Schleife
Was Ihre dritte Frage betrifft, wenn Emacs über die Desktop-Umgebung gestartet wurde, erbt es die Umgebung, die möglicherweise weniger vollständig ist als die einer vollständigen Shell.
Dies bedeutet, dass es manchmal erforderlich sein kann, den Wert von Emacs zu vervollständigen, um das zu
$PATH
verwenden, was eine reguläre Shell sieht. Dies ist der Zweck derexec-path-from-shell
Bibliothek, die Sie erwähnen.quelle