Ein Shell-Skript aus Emacs heraus beziehen

Ein Shell-Skript aus Emacs heraus beziehen

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:

  1. Ich starte Emacs vonzsh
  2. Ich möchte ein zshSkript 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_PATHum 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_PATHzuerst, um Emacs zu starten, also müsste ichSatzes später, damit ich es emacs-jediinnerhalb 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, vimaber dasselbe sollte auch für die emacsBeispieldatei zur Quelle gelten.

$ more ~/vars.bash 
export VAR=somevalue
  1. Ursprüngliche übergeordnete Umgebung $VARist nicht festgelegt

    $ echo $VAR
    
    $
    
  2. 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
    
  3. 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 ~/.emacsoder 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 diffvergleicht exportund dann setenventsprechend die Funktion aufruft: https://gist.github.com/ffevotte/9345586

verwandte Informationen