Я пытаюсь заставить команду компиляции (огурец граблей) работать с определенной рубиновой версией в моей системе 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
.
Какие-либо идеи?
Небольшая модификация решения от 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))
попробуйте это, может быть. замените строку пути на свою.
(add-to-list 'load-path "~ / opt / swank-clojure / src / emacs")
У меня нет 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
.
Насколько я заметил, Emacs берет переменную пути из оболочки, из которой она запускается, поэтому одно из решений - изменить $ PATH в оболочке перед запуском Emacs.
Еще один подход, который я использовал, который является более гибким, заключается в использовании Makefile и добавлении «source ~ / script_that_set_path» перед каждой имеющейся у вас командой make.
Я нахожу схему 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; не пробовал в других версиях, но ожидаю, что будет работать)
.