Поиск сценария оболочки из Emacs

Я хотел бы загрузить сценарий оболочки, который изменяет мои переменные среды из Emacs. То есть, я хотел бы, чтобы сценарий оболочки изменял среду, в которой запускался Emacs, и я хотел бы сделать это из текущей сессии Emacs.

Другими словами:

  1. Я запускаю Emacs из zsh
  2. Я хотел бы создать zsh скрипт из Emacs, который изменяет переменные окружения, такие как LD_LIBRARY_PATH

Задний план:

Это попытка обойти проблему, описанную здесь , где мне нужно установить LD_LIBRARY_PATH для запуска Emacs, но мне нужно отменить ее для запуска определенного дистрибутива Python ( Anaconda ).

В частности, я хочу использовать пакет Emacs ( emacs-jedi ), который требует доступа к этому дистрибутиву Python, но в настоящее время мне нужно сначала отключить LD_LIBRARY_PATH чтобы запустить Emacs, поэтому мне нужно будет установить его позже, чтобы я мог использовать emacs-jedi изнутри Emacs.

Это вообще возможно?

Я не верю, что это возможно, так как каждый раз, когда вы вызываете подоболочку для источника сценария, вы вызываете дочерний процесс из исходного процесса, в котором запускались приложения emacs.

Экспортирование переменных среды – это односторонняя улица, где только родитель может предоставлять переменные для любых дочерних процессов, но никакие дочерние процессы не могут манипулировать окружением родителя.

эксперимент

Я использую vim но то же самое должно относиться к emacs . Пример файла для источника.

 $ more ~/vars.bash export VAR=somevalue 
  1. Начальная родительская среда, $VAR не задана

     $ echo $VAR $ 
  2. Запустите vim . Затем вызовите подоболочку, чтобы загрузить указанный файл ( :sh ).

     # check variable $ echo $VAR $ # source and re-check $ source ~/vars.bash $ echo $VAR somevalue 
  3. Выйдите из подоболочки, вернитесь в vim. Затем вызовите другую подоболочку ( :sh ).

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

Если вам нужно отключить LD_LIBRARY_PATH после загрузки Emacs, просто добавьте

 (setenv "LD_LIBRARY_PATH") 

на ~/.emacs или другой файл инициализации.

Если вам нужно поменять местами назад и вперед, сначала сохраните результат (getenv "LD_LIBRARY_PATH") в переменной, чтобы вы могли восстановить его позже.

Я нашел этот приятный фрагмент Emacs lisp, который использует diff для сравнения выходов команды export до и после поиска, а затем вызывает функцию setenv соответственно: https://gist.github.com/ffevotte/9345586