Мне нужно использовать my $PATH
в Emacs для запуска некоторых команд. Как я могу заставить Emacs использовать его? Я установил Emacs из репозиториев Ubuntu.
Как заставить Emacs использовать мой .bashrc файл?
Ответ 1
Вот трюк я использую, чтобы гарантировать, что мой графический интерфейс Emacs всегда видит тот же $PATH
, который я получаю внутри оболочки:
(defun set-exec-path-from-shell-PATH ()
(let ((path-from-shell (replace-regexp-in-string
"[ \t\n]*$"
""
(shell-command-to-string "$SHELL --login -i -c 'echo $PATH'"))))
(setenv "PATH" path-from-shell)
(setq eshell-path-env path-from-shell) ; for eshell users
(setq exec-path (split-string path-from-shell path-separator))))
(when window-system (set-exec-path-from-shell-PATH))
В частности, в OS X графический Emacs не получит определение оболочки пользователя $PATH
, поэтому этот трюк помогает мне на этой платформе.
Обновление: этот код теперь опубликован как библиотека elisp под названием exec-path-from-shell, а устанавливаемые пакеты доступны в MELPA.
Ответ 2
Если параметр $PATH
установлен в терминале, с которого вы запускаете emacs, вы можете выполнять системные команды с помощью команды M-! <your command> RET
.
Ответ 3
Если ваш env vars не выбран, это может быть связано с запуском emacs. Проверьте элемент меню или что-то еще и попробуйте изменить emacs
на bash -c emacs
.
Ответ 4
Вы можете добавить настройки пути в /etc/profile.d, например
# /etc/profile.d/path.sh
export PATH="$PATH:/usr/local"
В Ubuntu я помню, что все сеансы содержат ваш ~/.xsessionrc
, поэтому вы также можете установить путь в этом файле для приложений с графическим интерфейсом.
Ответ 5
Я придумал нечто похожее для поиска моего .bash_profile. Если вы только заботитесь о PATH, один из других ответов выше проще.
Он работает, выполняя source ~/.bash_profile ; echo post-env; env
, затем отбрасывая все до "post-env", а затем анализируя значения в формате "key = value", который печатает команда "env".
Он, вероятно, не справляется с каждым случаем отлично, но работает для меня достаточно хорошо.
;;-------------------------------------------------------
;; begin sourcing of .bash_profile
;; only do this on Mac OS X
(when (string= system-type "darwin")
;; require common lisp extensions, for search
(require 'cl)
(defun src-shell-unescape (string)
;; replace \n \t \r \b \a \v \\
;; and octal escapes of the form \0nn
(replace-regexp-in-string
"\\\\\\([ntrbav]\\|\\(\\\\\\)\\|\\(0[0-7][0-7]\\)\\)"
(lambda (str)
;; interpret octal expressions
;; of the form "\0nn"
(let ((char1 (aref str 1)))
(cond ((= ?0 (aref str 1))
(byte-to-string
(+ (* (- (aref str 2) ?0) 8)
(- (aref str 3) ?0))))
((eq char1 ?n) "\n")
((eq char1 ?t) "\t")
((eq char1 ?r) "\r")
((eq char1 ?b) "\b")
((eq char1 ?a) "\a")
((eq char1 ?v) "\v")
((eq char1 ?\\) "\\\\")
(t "")))) string))
(defun src-set-environment-from-env-output(env-output)
;; set the environment from shell "env" output
(let ((lines (split-string env-output "\n" t)))
(dolist (line lines)
(let ((idx-equals (search "=" line)))
(when (and (not (eq idx-equals nil))
(> idx-equals 1))
(let ((key (substring line 0 idx-equals))
(value (substring line (+ idx-equals 1))))
(setenv key (src-shell-unescape value))
;; (message "%s = %s" key value)
))))))
(defun src-source-shell-file (file-name)
;; if your shell is sh rather than bash, the "source " may need
;; to be ". " instead
(let* ((command (concat "source '" file-name "'; echo 'post-env'; env"))
(output (shell-command-to-string command))
(idx-post-env (search "post-env" output)))
(if (eq nil idx-post-env)
(message "Didn't find expected output after sourcing %s. Found: %s" file-name output)
(let ((trimmed-output (substring output idx-post-env)))
;; (message "trimmed-output: %s" trimmed-output)
(src-set-environment-from-env-output trimmed-output)))))
(src-source-shell-file (expand-file-name "~/.bash_profile")))
;; end sourcing of .bash_profile
;;-------------------------------------------------------
Ответ 6
Более общее решение (для установки всех переменных и псевдонимов, а не только PATH
) приведено в fooobar.com/info/288976/... - ключ должен установить:
(setq shell-command-switch "-ic")
который переопределяет значение по умолчанию "-c"
(выполните следующую команду). Добавление "-i"
вынуждает оболочку bash в интерактивный режим, что приводит к источнику ~/.bashrc
.