從 Emacs 中取得 shell 腳本

從 Emacs 中取得 shell 腳本

我想來源一個從 Emacs 更改環境變數的 shell 腳本。也就是說,我希望 shell 腳本能夠更改 Emacs 運行的環境,並且我希望在正在運行的 Emacs 會話中執行此操作。

換句話說:

  1. 我從以下位置啟動 Emacszsh
  2. 我想zsh從 Emacs 中獲取一個腳本來更改環境變量,例如LD_LIBRARY_PATH

背景:

這是試圖規避我所描述的問題這裡,我需要的地方 LD_LIBRARY_PATH運行 Emacs,但我需要未設定它運行特定的Python發行版(蟒蛇)。

具體來說,我想使用 Emacs 套件(emacs絕地)需要訪問這個Python發行版,但目前我需要未設定 LD_LIBRARY_PATH首先啟動 Emacs,所以我需要稍後我可以emacs-jedi在 Emacs 中使用它。

這是可能嗎?

答案1

我不認為這是可能的,因為每次呼叫子 shell 來取得腳本時,您都會從啟動 emacs 應用程式的原始進程中呼叫子進程。

環境變數的導出是一種單向方式,只有父進程可以向任何子進程提供變量,但子進程不能操縱父進程的環境。

實驗

我正在使用,vim但同樣應該適用於emacs.來源範例文件。

$ more ~/vars.bash 
export VAR=somevalue
  1. 初始父環境$VAR未設定

    $ echo $VAR
    
    $
    
  2. 發射vim。然後呼叫子 shell 來取得上述檔案 ( :sh)。

    # check variable
    $ echo $VAR
    
    $
    
    # source and re-check
    $ source ~/vars.bash
    $ echo $VAR
    somevalue
    
  3. 退出子shell,返回vim。然後呼叫另一個子shell ( :sh)。

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

答案2

如果您只需要在載入 Emacs 後取消設定 LD_LIBRARY_PATH,只需新增

(setenv "LD_LIBRARY_PATH")

~/.emacs其他初始化檔案。

如果需要來回交換,請先將結果保存(getenv "LD_LIBRARY_PATH")在變數中,以便稍後恢復。

答案3

我發現了 Emacs lisp 的這個不錯的部分,它用於比較採購前後命令diff的輸出,然後相應地調用函數: exportsetenvhttps://gist.github.com/ffevotte/9345586

相關內容