Obtendo um script de shell no Emacs

4

Eu gostaria de fornecer um script de shell que altere minhas variáveis de ambiente dentro do 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. inicio o Emacs em zsh
  2. Gostaria de criar um script zsh no Emacs que altere as variáveis de ambiente, como LD_LIBRARY_PATH

Antecedentes:

Esta é uma tentativa de contornar o problema que descrevi aqui , onde preciso set LD_LIBRARY_PATH para executar o Emacs, mas eu preciso desanimá-lo para executar uma distribuição específica do Python ( Anaconda ).

Especificamente, eu quero usar um pacote Emacs ( emacs-jedi ) que requer acesso a esta distribuição Python, mas atualmente eu preciso remover LD_LIBRARY_PATH primeiro para iniciar o Emacs, então eu precisaria definir mais tarde para que eu possa usar emacs-jedi de dentro do Emacs.

Isso é possível?

    
por Josh 07.10.2013 / 17:10

3 respostas

4

Eu não acredito que isso seja possível, já que toda vez que você está invocando um subshell para obter o script, você está invocando um processo filho do processo original no qual os aplicativos emacs foram lançados.

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

Experiência

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

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

    $ echo $VAR
    
    $
    
  2. Inicie o 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, retorne ao vim. Em seguida, invoque outro subshell ( :sh ).

    $ exit
    
    ... back in vim, do another ':sh' ...
    
    # check variable
    $ echo $VAR
    
    $ 
    
por 07.10.2013 / 17:23
1

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

(setenv "LD_LIBRARY_PATH")

para ~/.emacs ou outro arquivo init.

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

    
por 07.10.2013 / 17:32
0

Eu encontrei este pedaço de Emacs que usa diff para comparar as saídas do comando export antes e depois do sourcing, e então chama a função setenv de acordo: link

    
por 24.05.2016 / 23:02