Obtendo um script de shell no Emacs

Obtendo um script de shell no Emacs

Eu gostaria defonteum script de shell que altera minhas variáveis ​​de ambiente no Emacs. Ou seja, eu gostaria que o shell script alterasse o ambiente no qual o Emacs é executado e gostaria de fazer isso dentro de uma sessão do Emacs em execução.

Em outras palavras:

  1. Eu inicio o Emacs a partir dezsh
  2. Gostaria de obter um zshscript do Emacs que altere variáveis ​​de ambiente comoLD_LIBRARY_PATH

Fundo:

Esta é uma tentativa de contornar o problema que descreviaqui, onde eu precisodefinir LD_LIBRARY_PATHpara executar o Emacs, mas precisodesarmarpara executar uma distribuição Python específica (Anaconda).

Especificamente, quero usar um pacote Emacs (emacs-jedi) que requer acesso a esta distribuição Python, mas atualmente precisodesarmar LD_LIBRARY_PATHprimeiro a iniciar o Emacs, então eu precisariadefinirmais tarde para que eu possa usar emacs-jedino Emacs.

Tudo isso é possível?

Responder1

Não acredito que isso seja possível, pois cada vez que você invoca um subshell para obter o script, está invocando um processo filho do processo original onde os aplicativos emacs foram iniciados.

A exportação de variáveis ​​de ambiente é uma via de mão única onde apenas o pai pode fornecer variáveis ​​para qualquer processo filho, mas nenhum processo filho pode manipular o ambiente do pai.

Experimentar

Estou usando, vimmas o mesmo deve se aplicar ao emacs. Arquivo de amostra para a fonte.

$ more ~/vars.bash 
export VAR=somevalue
  1. Ambiente pai inicial, $VARnão está definido

    $ echo $VAR
    
    $
    
  2. Lançar vim. Em seguida, invoque um subshell para obter o arquivo acima ( :sh).

    # check variable
    $ echo $VAR
    
    $
    
    # source and re-check
    $ source ~/vars.bash
    $ echo $VAR
    somevalue
    
  3. Saia do subshell e retorne ao vim. Em seguida, invoque outro subshell ( :sh).

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

Responder2

Se tudo que você precisa é desabilitar LD_LIBRARY_PATH após carregar o Emacs, basta adicionar

(setenv "LD_LIBRARY_PATH")

para ~/.emacsou outro arquivo init.

Se você precisar alternar, salve o resultado em (getenv "LD_LIBRARY_PATH")uma variável primeiro para poder restaurá-lo mais tarde.

Responder3

Eu encontrei este belo pedaço de lisp do Emacs que usa diffpara comparar as saídas do exportcomando antes e depois do sourcing e, em seguida, chama setenva função de acordo: https://gist.github.com/ffevotte/9345586

informação relacionada