Я хотел быисточникскрипт оболочки, который изменяет переменные моей среды изнутри Emacs. То есть, я хотел бы, чтобы скрипт оболочки изменял среду, в которой работает Emacs, и я хотел бы сделать это изнутри работающего сеанса Emacs.
Другими словами:
- Я запускаю Emacs из
zsh
- Я хотел бы получить
zsh
скрипт из Emacs, который изменяет переменные среды, такие какLD_LIBRARY_PATH
Фон:
Это попытка обойти проблему, которую я описал.здесь, где мне нужнонабор LD_LIBRARY_PATH
для запуска Emacs, но мне нужноне установлендля запуска определенного дистрибутива Python (Анаконда).
В частности, я хочу использовать пакет Emacs (emacs-джедай), который требует доступа к этому дистрибутиву Python, но в данный момент мне нужноне установлен LD_LIBRARY_PATH
сначала запустить Emacs, поэтому мне нужно будетнаборпозже, чтобы я мог использовать его emacs-jedi
из Emacs.
Это вообще возможно?
решение1
Я не верю, что это возможно, поскольку каждый раз, когда вы вызываете подоболочку для получения скрипта, вы вызываете дочерний процесс исходного процесса, в котором было запущено приложение emacs.
Экспорт переменных среды — это улица с односторонним движением, где только родительский процесс может предоставлять переменные любым дочерним процессам, но ни один дочерний процесс не может манипулировать средой родительского процесса.
Эксперимент
Я использую, vim
но то же самое должно применяться и к emacs
. Файл-образец для источника.
$ more ~/vars.bash
export VAR=somevalue
Исходная родительская среда,
$VAR
не установлена$ echo $VAR $
Запустите
vim
. Затем вызовите подоболочку для получения указанного выше файла (:sh
).# check variable $ echo $VAR $ # source and re-check $ source ~/vars.bash $ echo $VAR somevalue
Выйти из подоболочки, вернуться в vim. Затем вызвать другую подоболочку (
:sh
).$ exit ... back in vim, do another `:sh` ... # check variable $ echo $VAR $
решение2
Если вам нужно всего лишь сбросить LD_LIBRARY_PATH после загрузки Emacs, просто добавьте
(setenv "LD_LIBRARY_PATH")
или ~/.emacs
другой файл инициализации.
Если вам нужно поменять местами значения, (getenv "LD_LIBRARY_PATH")
сначала сохраните результат в переменной, чтобы можно было восстановить его позже.
решение3
Я нашел этот замечательный фрагмент Emacs lisp, который diff
сравнивает выходные данные export
команды до и после источника, а затем вызывает setenv
соответствующую функцию:
https://gist.github.com/ffevotte/9345586