Emacs 内からシェルスクリプトをソースする

Emacs 内からシェルスクリプトをソースする

私はしたいと思いますソースEmacs 内から環境変数を変更するシェル スクリプト。つまり、シェル スクリプトを使用して Emacs が実行される環境を変更し、実行中の Emacs セッション内からこれを実行したいのです。

言い換えると:

  1. Emacsを起動するとzsh
  2. zshEmacs内から環境変数を変更するスクリプトをソースにしたいのですが、LD_LIBRARY_PATH

背景:

これは私が説明した問題を回避するための試みであるここ、必要なところでセット LD_LIBRARY_PATHEmacsを実行するには、設定解除特定のPythonディストリビューションを実行するには(アナコンダ)。

具体的には、Emacsパッケージ(emacs ジェダイ)にアクセスする必要があるのですが、現在は設定解除 LD_LIBRARY_PATHまずEmacsを起動する必要があるのでセットemacs-jedi後でEmacs 内から使用できるようにします。

これは本当に可能なのでしょうか?

答え1

これは可能ではないと思います。なぜなら、スクリプトをソースするためにサブシェルを呼び出すたびに、emacs アプリケーションが起動された元のプロセスから子プロセスを呼び出すからです。

環境変数のエクスポートは一方通行であり、親プロセスのみが子プロセスに変数を提供できますが、子プロセスは親の環境を操作することはできません。

実験

私は を使用していますvimが、同じことが にも適用されるはずですemacs。ソースへのサンプル ファイル。

$ more ~/vars.bash 
export VAR=somevalue
  1. 初期親環境は$VAR未設定です

    $ echo $VAR
    
    $
    
  2. を起動しますvim。次に、サブシェルを呼び出して上記のファイル ( :sh) をソースします。

    # check variable
    $ echo $VAR
    
    $
    
    # source and re-check
    $ source ~/vars.bash
    $ echo $VAR
    somevalue
    
  3. サブシェルを終了し、vim に戻ります。次に、別のサブシェル ( :sh) を呼び出します。

    $ exit
    
    ... back in vim, do another `:sh` ...
    
    # check variable
    $ echo $VAR
    
    $ 
    

答え2

Emacsをロードした後にLD_LIBRARY_PATHの設定を解除するだけなら、以下を追加するだけです。

(setenv "LD_LIBRARY_PATH")

~/.emacsまたは他の init ファイルに追加します。

前後に入れ替える必要がある場合は、(getenv "LD_LIBRARY_PATH")まず結果を変数に保存して、後で復元できるようにします。

答え3

ソースの前後のコマンドdiffの出力を比較し、それに応じて関数 を呼び出す、Emacs Lisp の優れた部分を見つけました。exportsetenvhttps://gist.github.com/ffevotte/9345586

関連情報