2012-02-24 3 views
3

Когда я запускаю графический интерфейс emacs, PATH не устанавливается в зависимости от моего .zshrc. Как я могу установить его .zshrc, чтобы установить его правильно?Как мне установить мой .zshrc в emacs?

Редактировать: Я пытаюсь использовать swank-clojure, но он не может найти лейн, поскольку он не находится на PATH.

+0

Вы имеете в виду 'PATH', который используется в' shell-mode' или 'eshell'? – pmr

ответ

1

Этот ответ для людей, которые находят этот вопрос позже и с этой проблемой из-за Emacs поведение по умолчанию на Mac,

Если вы на Mac и интересно как получить Emacs, чтобы начать из оболочки, где он будет пикап ваш подгонять ENV в графическом режиме, а не только текст, то запустить его из Zsh с чем-то вроде этого:

/Applications/Emacs.app/Contents/MacOS/Emacs 

Это должно вызвать Emacs, чтобы увидеть все ваши оболочки (ЗШ или иначе) настройки.

+1

Это, безусловно, будет работать, но не существует способа изменить оболочку входа в Mac OS? Это было бы определенным решением. – pmr

+0

Мне тоже интересно, я думаю, что это вопрос, хорошо подходящий для суперпользователя. –

+0

@pmr, @ArthurUlfeldt. Оболочку входа можно изменить с помощью команды 'chsh' (как и во многих других Un * ces). Я не уверен, влияет ли это на Emacs. –

1

Используемая переменная Emacs вместо PATH называется exec-path (C-h v exec-path RET для документации и состояния). exec-path инициализируется с PATH или EMACSPATH. Кажется, вы не запускаете Emacs из своего zsh, поэтому ваш путь Emacs не соответствует той, что находится в вашей оболочке.

Вы можете попытаться установить exec-path его в свои .emacs или init.el, хотя вам нужно будет поддерживать оба. Я не вижу возможности напрямую настраивать конфигурацию своей оболочки, но, возможно, вы могли бы просто повторно вывести свой путь из нее.

8

Edited добавить (2014): Существует теперь package in MELPA имени exec-path-from-shell, который решает эту проблему точно. (См. Также Github repository). Почти наверняка лучше установить этот пакет, а не копировать и вставлять этот фрагмент. Помимо правильной поддержки, он также поддерживает копирование других переменных среды из вашей оболочки, поэтому любые подпроцессы, запущенные с Emacs, будут работать, как ожидалось.


Оригинальный ответ: Вот мой обходной путь для этой проблемы, которая не требует всегда начиная Emacs из оболочки (я также обеспокоены этим иногда на мой макинтош):

(let ((path (shell-command-to-string ". ~/.zshrc; echo -n $PATH"))) 
    (setenv "PATH" path) 
    (setq exec-path 
     (append 
     (split-string-and-unquote path ":") 
     exec-path))) 

Он устанавливает идею Emacs о переменной среды PATH (так что она будет наследоваться подоболочками) и переменной Lisp exec-path, которая используется для поиска исполняемых файлов из кода Lisp и для некоторых целей автозавершения. Вам также может потребоваться проверить, что shell-file-name настроен на расположение вашего двоичного кода zsh вместо стандартного /bin/bash.

+0

Awesome, это отлично работает под Linux. –

+1

FWIW, так как я написал этот ответ, теперь [пакет в MELPA] (http://melpa.org/#/exec-path-from-shell), который решает эту проблему, называется 'exec-path-from-shell '. Вероятно, лучше всего установить этот пакет, а не копировать и вставлять этот фрагмент. Он также позволяет копировать другие переменные среды из обычной настройки оболочки, поэтому любые подпроцессы, запущенные с Emacs, будут работать, как ожидалось. –

4

FWIW, эта проблема не относится к Mac OS X, поскольку она также влияет на системы GNU/Linux, где запуск Emacs из панели меню графического интерфейса обычно приводит к тому, что Emacs, у которого нет одного и того же PATH, как один запущенный из командной строки. Эта проблема восходит к первым сценариям Xsm Xsession, и хотя их довольно легко исправить (в основном используйте скрипт Xsessionwrapper, который выполняет «exec $ SHELL -c Xsession», поэтому оболочка запускается до запуска Xsession пользователя), здесь мы 20 лет спустя страдаем от той же старой проблемы.И почему-то я не ожидал, что gdm3 исправит это ;-(

+0

Хотя на самом деле это не ответ, анекдотическая ценность этого велика. – pmr

+0

Он был главным образом зафиксирован в gdm2, который был бы источником .profile и .xprofile, но из того, что я слышал, он снова сломался в gdm3. Kdm, кажется, делает некоторые сумасшедшие вещи, когда zsh обнаружен и запускает все через zsh без использования режима совместимости. – Arrowmaster

1

Mac OS X имеет special environment file, позволяющий настраивать переменные окружения для процесса, запускаемого определенным пользователем. Это позволяет вам устанавливать переменные среды для приложений с графическим интерфейсом. случае вы можете использовать это, чтобы установить путь для любой из Emacs запущен, нажав на иконку в доке или искателем.

Этот файл живет в

~/.MacOSX/environment.plist 

вы можете создать файл в XCode, но это просто xml, поэтому содержимое файла выглядит так:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
    <dict> 
    <key>PATH</key> 
    <string>~/bin:/usr/local/bin:/usr/local/sbin:/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11/bin:</string> 
</dict> 
</plist> 
0

Вы также можете указать свою переменную PATH в файле .zshenv - предпочтительное соглашение о назначении среды для суб-оболочек. Пока zsh настроен как оболочка по умолчанию вашего пользователя, emacs будет генерировать ваш .zshenv независимо от того, как вызывается emacs.