Emacs игнорирует мой путь, когда он выполняет команду компиляции
Я пытаюсь получить команду компиляции (rake cucumber) для запуска с конкретной рубиновой версией в моей системе 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
.
Любые идеи?
Ответы
Ответ 1
Небольшая модификация решения 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
Кажется, что кто-то неправильно понял исходную проблему: путь уже правильно настроен в Emacs, и правильный путь уже передан в оболочку, запущенную командой компиляции! Так что же дает? Вот ответ:
В 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
, что является основной целью инструмента.
Ответ 3
У меня нет Mac, поэтому я не могу проверить это напрямую, но все это можно найти на странице * info * Interactive Inferior Shell.
Когда вы запускаете оболочку в Emacs, процесс, который генерируется, является программой в переменной Emacs explicit-shell-file-name
(и если это nil
, то используются переменные среды ESHELL
и SHELL
).
Затем он отправляет содержимое ~/.emacs_*shellname*
(например, если ваша оболочка csh
, тогда будет отправлено ~/.emacs_csh
. Также будут созданы соответствующие файлы .rc для программы csh
, поэтому вы можете обновить (в моем случае .cshrc
). Кроме того, вы можете обернуть настройки в файле .rc с проверкой на переменную среды INSIDE_EMACS
(которую Emacs устанавливает перед запуском оболочки).
Вам необходимо обновить эти файлы, чтобы изменить путь в оболочке, а не переменную Emacs exec-path
. exec-path
- это всего лишь список каталогов, которые Emacs использует для поиска исполняемых программ. Изменения в свойствах исполняемых файлов не влияют на exec-path
.
Ответ 4
Я нахожу схему 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, не пробовал в других версиях, но я бы ожидал, что он сработает.)
Ответ 5
попробуйте это возможно. замените строку пути вашей.
(добавить к списку "load-path" ~/opt/swank- clojure/src/emacs ")
Ответ 6
Насколько я заметил, Emacs берет переменную пути из оболочки, из которой она запускается, поэтому одно решение заключается в изменении $PATH в оболочке перед запуском Emacs.
Еще один подход, который был более гибким, заключается в использовании Makefile и добавлении "source ~/script_that_set_path" перед каждой командой make.
Ответ 7
Я пробовал так много разных подходов к этому, что в конечном итоге не использовал emacs для настройки моей среды команд компиляции.
Теперь я создаю файл run_helper.sh, который просто инициализирует чистую среду, а затем использует exec $*
для выполнения команды, переданной как аргумент run_helper.sh
Этот run_helper.sh
обычно зависит от проекта, но я сохраняю шаблон, который я использую для начала, когда создаю новый проект.
Затем я просто запускаю compile
из emacs, например bash run_helper.sh rspec path/to/tests
.
Если я использую это для запуска тестов ruby, мой помощник инициализирует RVM для использования правильного рубина и gemset. Если я использую какой-либо другой язык, он может просто экспортировать требуемые переменные среды или выполнить какую-то другую инициализацию, но таким образом я могу сделать это в bash script, а не всегда путаться с путями emacs и elisp каждый раз, когда я запускаю новый проект.
Вот пример файла 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
, которые я не хочу загружать, просто для запуска некоторых тестов.
Ответ 8
Это сработало для меня с двумя вещами.
Сначала я последовал совету sanityinc
Улучшенная и измененная версия фрагмента кода теперь публикуется как библиотека elisp, называемая exec-path-from-shell; устанавливаемые пакеты доступны в Marmalade и Melpa
У меня все еще была проблема с командами компиляции. Valko Sipuli - это проблема, связанная с path_helper.
Я прокомментировал соответствующую строку в файле /etc/profile, и это не помогло. Проблема все еще там.
Я не использую bash, но zsh. Копая немного, я нашел /etc/zshenv. Этот файл также вызывает path_helper.
После комментирования раздела path_helper в /etc/zshenv мой путь окончательно правильный