从 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

相关内容