Emacs игнорирует мой путь, когда он выполняет команду компиляции

Я пытаюсь заставить команду компиляции (огурец граблей) работать с определенной рубиновой версией в моей системе 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.

Какие-либо идеи?

13
задан Luke Girvin 10 March 2012 в 15:39
поделиться

5 ответов

Небольшая модификация решения от 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))
9
ответ дан 1 December 2019 в 22:07
поделиться

попробуйте это, может быть. замените строку пути на свою.

(add-to-list 'load-path "~ / opt / swank-clojure / src / emacs")

0
ответ дан 1 December 2019 в 22:07
поделиться

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

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

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

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

2
ответ дан 1 December 2019 в 22:07
поделиться

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

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

0
ответ дан 1 December 2019 в 22:07
поделиться

Я нахожу схему environment.plist на Macs довольно уродливой, поэтому я использую следующий фрагмент, который предполагает, что вы хотите, чтобы 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
ответ дан 1 December 2019 в 22:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: