Emacs игнорирует мой путь, когда запускает команду компиляции - PullRequest
13 голосов
/ 15 февраля 2010

Я пытаюсь заставить команду компиляции (rake cucumber) работать с определенной версией ruby ​​в моей системе Mac OS X, я использую rvm, чтобы сделать это в настоящее время в терминале. Мой ~ / .MacOSX / environment.plist содержит правильный путь, но emacs настаивает на том, чтобы предварять этот путь и поэтому делать его бесполезным. Я также попробовал:

(when (equal system-type 'darwin)
  (setenv "PATH" (concat "/Users/fearoffish/.rvm/bin:/Users/fearoffish/.rvm/rubies/ruby-1.8.7-p249/bin:/Users/fearoffish/.rvm/gems/ruby-1.8.7-p249/bin:/Users/fearoffish/.rvm/gems/ruby-1.8.7-p249%global/bin:/Users/fearoffish/.rvm/bin"))
  (push "/Users/fearoffish/.rvm/bin" exec-path)
  (push "/Users/fearoffish/.rvm/rubies/ruby-1.8.7-p249/bin" exec-path)
  (push "/Users/fearoffish/.rvm/gems/ruby-1.8.7-p249/bin" exec-path)
  (push "/Users/fearoffish/.rvm/gems/ruby-1.8.7-p249%global/bin" exec-path)
  (push "/Users/fearoffish/.rvm/bin" exec-path))

Это была отчаянная попытка новичка Emacs получить то, что я хотел. Он все еще стоит перед ним, так что мой путь заканчивается:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/Users/fearoffish/.rvm/bin:/Users/fearoffish/.rvm/rubies/ruby-1.8.7-p249/bin:/Users/fearoffish/.rvm/gems/ruby-1.8.7-p249/bin:/Users/fearoffish/.rvm/gems/ruby-1.8.7-p249%global/bin

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

Я проверяю это, просто открыв Aquamacs и запустив meta-x compile, а затем echo $PATH.

Есть идеи?

Ответы [ 8 ]

10 голосов
/ 02 марта 2011

Кажется, что все неправильно поняли исходную проблему: путь уже настроен правильно в Emacs, и правильный путь уже передан оболочке, запущенной командой compile! Так что же дает? Вот ответ:

В MacOS X есть небольшой инструмент под названием path_helper(1). Он вызывается по умолчанию из /etc/profile, который выполняется Bash при запуске оболочки. Когда вы запускаете компиляцию из Emacs, он запускает оболочку (по умолчанию это Bash в MacOS X) и поэтому запускает этот инструмент path_helper. И вот ключевой момент: path_helper перестраивает ваш путь , перемещая стандартные каталоги, такие как /usr/bin, перед вашими пользовательскими добавленными каталогами, независимо от того, где вы изначально добавили их. Попробуйте сами, открыв оболочку и сначала посмотрев, что такое PATH, а затем выполните /usr/lib/path_helper и посмотрите на полученный PATH!

Решение проблемы грубой силы для вас может заключаться в том, чтобы просто закомментировать вызов path_helper в /etc/profile. Однако обратите внимание, что тогда вы не получите автоматически пути в настройках /etc/paths.d с помощью path_helper, что является основной целью инструмента.

9 голосов
/ 02 апреля 2010

Небольшая модификация решения от sanityinc (не удалось найти способ ввести его в комментариях выше - это только я?)

  • Я использую опцию -l для оболочки, чтобы заставить оболочку входа в систему (которая читает .profile или .bash_profile), а не интерактивную оболочку (которая читает только .bashrc).
  • Я выполняю некоторую обрезку строки в возвращаемом пути (поскольку проверка показывает, что в нее пробивается новая строка).

Модифицированный код:

(defun set-exec-path-from-shell-PATH ()
  (let ((path-from-shell 
      (replace-regexp-in-string "[[:space:]\n]*$" "" 
        (shell-command-to-string "$SHELL -l -c 'echo $PATH'"))))
    (setenv "PATH" path-from-shell)
    (setq exec-path (split-string path-from-shell path-separator))))
(when (equal system-type 'darwin) (set-exec-path-from-shell-PATH))
2 голосов
/ 16 февраля 2010

Я нахожу схему environment.plist на Mac довольно уродливой, поэтому я использую следующий фрагмент, который предполагает, что вы хотите, чтобы Emacs использовал тот же PATH, который вы видите в вашем Terminal.app:

(defun set-exec-path-from-shell-PATH ()
  (let ((path-from-shell (shell-command-to-string "$SHELL -i -c 'echo $PATH'")))
    (setenv "PATH" path-from-shell)
    (setq exec-path (split-string path-from-shell path-separator))))

(Это работает для меня в Emacs 23; не пробовал в других версиях, но я ожидал, что это сработает.)

2 голосов
/ 15 февраля 2010

У меня нет Mac, поэтому я не могу проверить это напрямую, но все это можно найти на * info * page Interactive Inferior Shell .

Когда вы запускаете оболочку в Emacs, порождаемый процесс - это программа в переменной Emacs explicit-shell-file-name (а если это nil, то используются переменные окружения ESHELL и SHELL). 1009 *

Затем отправляется содержимое ~/.emacs_*shellname* (например, если ваша оболочка csh, тогда будет отправлено ~/.emacs_csh. Кроме того, получены соответствующие файлы .rc для программы csh, поэтому вы можете обновить это также (в моем случае .cshrc). Кроме того, вы можете обернуть настройки в файле .rc проверкой переменной среды INSIDE_EMACS (которую Emacs устанавливает перед запуском оболочки).

Вам необходимо обновить эти файлы, чтобы изменить путь в оболочке, а не переменную Emacs exec-path. exec-path - это просто список каталогов, которые Emacs использует для поиска исполняемых программ. На поведение исполняемых файлов не влияют изменения exec-path.

0 голосов
/ 30 марта 2013

У меня сработало две вещи.

Сначала я последовал совету sanityinc

Улучшенная и измененная версия фрагмента кода теперь публикуется как библиотека elisp под названием exec-path-from-shell; Устанавливаемые пакеты доступны в Marmalade и Melpa

У меня все еще была проблема с командами компиляции. Валько Сипули прав: возникла проблема с path_helper.

Я прокомментировал соответствующую строку в / etc / profile, и это не помогло. Проблема все еще там. Я не использую Bash, но Zsh. Немного покопавшись я нашел / etc / zshenv. Этот файл также вызывает path_helper.

После комментирования раздела path_helper в / etc / zshenv мой путь, наконец, правильный

0 голосов
/ 15 августа 2012

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

Что я делаю сейчас, так это создаю файл run_helper.sh, который просто инициализирует чистую среду изатем использует exec $* для выполнения команды, переданной в качестве аргумента run_helper.sh

Этот run_helper.sh обычно специфичен для проекта, но я сохраняю шаблон, который использую для запуска при создании нового проекта.

Затем я просто запускаю compile из emacs, например, bash run_helper.sh rspec path/to/tests.

Если я использую это для запуска тестов ruby, мой помощник инициализирует RVM для использования правильных ruby ​​и gemset.Если я использую какой-то другой язык, он может просто экспортировать необходимые переменные окружения или выполнить какую-то другую инициализацию, но таким образом я могу сделать это в скрипте bash, вместо того, чтобы всегда связываться с путями emacs и elisp каждый раз, когда я запускаю новый проект.1014 *

Вот пример run_helper.sh файла

#!/bin/bash

cd /Users/simao/Documents/sp

export DYLD_LIBRARY_PATH="/usr/local/mysql/lib:$DYLD_LIBRARY_PATH"

source "$HOME/.rvm/scripts/rvm" # This loads the proper ruby and gemset from .rvmrc

export RAILS_ENV=test

exec $*

Это также ускоряет мои тесты, потому что в моем .zshrc есть много вещей, которые я не хочу загружать простозапустить несколько тестов.

0 голосов
/ 16 февраля 2010

Насколько я заметил, Emacs берет переменную пути из оболочки, из которой он запущен, поэтому одним из решений является изменение $ PATH в оболочке перед запуском Emacs.

Еще один подход, который я использовал, который является более гибким, заключается в использовании Makefile и добавлении «source ~ / script_that_set_path» перед каждой вашей командой make.

0 голосов
/ 15 февраля 2010

попробуйте это возможно. замените строку пути на вашу.

(add-to-list 'путь загрузки "~ / opt / swank-clojure / src / emacs")

...