Подтвердить что ты не робот

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.

Любые идеи?

4b9b3361

Ответ 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 мой путь окончательно правильный