Me gustaríafuenteun script de shell que cambia mis variables de entorno desde Emacs. Es decir, me gustaría que el script de shell cambiara el entorno en el que se ejecuta Emacs, y me gustaría hacerlo desde una sesión de Emacs en ejecución.
En otras palabras:
- Empiezo Emacs desde
zsh
- Me gustaría obtener un
zsh
script desde Emacs que cambie las variables de entorno comoLD_LIBRARY_PATH
Fondo:
Este es un intento de evitar el problema que describí.aquí, donde necesitocolocar LD_LIBRARY_PATH
para ejecutar Emacs, pero necesitodesarmadopara ejecutar una distribución de Python específica (Anaconda).
Específicamente, quiero usar un paquete de Emacs (emacs-jedi) que requiere acceso a esta distribución de Python, pero actualmente necesitodesarmado LD_LIBRARY_PATH
primero en iniciar Emacs, por lo que necesitaríacolocarmás tarde para poder usarlo emacs-jedi
desde Emacs.
¿Es esto posible?
Respuesta1
No creo que esto sea posible, ya que cada vez que invocas un subshell para generar el script, estás invocando un proceso hijo del proceso original donde se iniciaron las aplicaciones de emacs.
La exportación de variables de entorno es una vía de sentido único donde solo el padre puede proporcionar variables a cualquier proceso hijo, pero ningún proceso hijo puede manipular el entorno del padre.
Experimento
Lo estoy usando vim
pero lo mismo debería aplicarse a emacs
. Archivo de muestra a la fuente.
$ more ~/vars.bash
export VAR=somevalue
Entorno principal inicial,
$VAR
no está configurado$ echo $VAR $
Lanzamiento
vim
. Luego invoque un subshell para generar el archivo anterior (:sh
).# check variable $ echo $VAR $ # source and re-check $ source ~/vars.bash $ echo $VAR somevalue
Salga del subshell y regrese a vim. Luego invoca otra subcapa (
:sh
).$ exit ... back in vim, do another `:sh` ... # check variable $ echo $VAR $
Respuesta2
Si todo lo que necesita es desarmar LD_LIBRARY_PATH después de cargar Emacs, simplemente agregue
(setenv "LD_LIBRARY_PATH")
a ~/.emacs
u otro archivo de inicio.
Si necesita intercambiar de un lado a otro, (getenv "LD_LIBRARY_PATH")
primero guarde el resultado en una variable para poder restaurarlo más tarde.
Respuesta3
Encontré esta buena pieza de Emacs lisp que se utiliza diff
para comparar las salidas del export
comando antes y después del abastecimiento, y luego llama a setenv
la función en consecuencia:
https://gist.github.com/ffevotte/9345586