Получение скрипта оболочки из Emacs

Получение скрипта оболочки из Emacs

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

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

  1. Я запускаю Emacs изzsh
  2. Я хотел бы получить 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
  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
    
    $ 
    

решение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

Связанный контент