Ich möchteQuelleein Shell-Skript, das meine Umgebungsvariablen innerhalb von Emacs ändert. Das heißt, ich möchte, dass das Shell-Skript die Umgebung ändert, in der Emacs ausgeführt wird, und ich möchte dies innerhalb einer laufenden Emacs-Sitzung tun.
Mit anderen Worten:
- Ich starte Emacs von
zsh
- Ich möchte ein
zsh
Skript aus Emacs heraus erstellen, das Umgebungsvariablen ändert, wieLD_LIBRARY_PATH
Hintergrund:
Dies ist ein Versuch, das von mir beschriebene Problem zu umgehenHier, wo ich mussSatz LD_LIBRARY_PATH
um Emacs auszuführen, aber ich mussnicht gesetztes, eine bestimmte Python-Distribution auszuführen (Anakonda).
Insbesondere möchte ich ein Emacs-Paket verwenden (Emacs-Jedi), das Zugriff auf diese Python-Distribution erfordert, aber derzeit muss ichnicht gesetzt LD_LIBRARY_PATH
zuerst, um Emacs zu starten, also müsste ichSatzes später, damit ich es emacs-jedi
innerhalb von Emacs verwenden kann.
Ist das überhaupt möglich?
Antwort1
Ich glaube nicht, dass dies möglich ist, da Sie jedes Mal, wenn Sie eine Subshell aufrufen, um das Skript als Quelle zu verwenden, einen untergeordneten Prozess des ursprünglichen Prozesses aufrufen, in dem die Emacs-Anwendung gestartet wurde.
Das Exportieren von Umgebungsvariablen ist eine Einbahnstraße, bei der nur das übergeordnete Element den untergeordneten Prozessen Variablen bereitstellen kann, aber kein untergeordneter Prozess die Umgebung des übergeordneten Elements manipulieren kann.
Experiment
Ich verwende, vim
aber dasselbe sollte auch für die emacs
Beispieldatei zur Quelle gelten.
$ more ~/vars.bash
export VAR=somevalue
Ursprüngliche übergeordnete Umgebung
$VAR
ist nicht festgelegt$ echo $VAR $
Starten Sie
vim
. Rufen Sie dann eine Subshell auf, um die obige Datei als Quelle zu verwenden (:sh
).# check variable $ echo $VAR $ # source and re-check $ source ~/vars.bash $ echo $VAR somevalue
Beenden Sie die Subshell und kehren Sie zu vim zurück. Rufen Sie dann eine weitere Subshell (
:sh
) auf.$ exit ... back in vim, do another `:sh` ... # check variable $ echo $VAR $
Antwort2
Wenn Sie LD_LIBRARY_PATH nach dem Laden von Emacs nur löschen möchten, fügen Sie einfach hinzu
(setenv "LD_LIBRARY_PATH")
zu ~/.emacs
oder einer anderen Init-Datei.
Wenn Sie hin und her wechseln müssen, speichern Sie das Ergebnis (getenv "LD_LIBRARY_PATH")
zuerst in einer Variablen, damit Sie es später wiederherstellen können.
Antwort3
Ich habe dieses nette Stück Emacs Lisp gefunden, das die Befehlsausgaben vor und nach der Beschaffung diff
vergleicht export
und dann setenv
entsprechend die Funktion aufruft:
https://gist.github.com/ffevotte/9345586