Как заставить Emacs использовать мой файл .bashrc? - PullRequest
18 голосов
/ 20 июня 2011

Мне нужно использовать мой $PATH в Emacs для запуска некоторых команд.Как я могу заставить Emacs использовать это?Я установил Emacs из репозиториев Ubuntu.

Ответы [ 6 ]

37 голосов
/ 20 июня 2011

Вот трюк Я использую , чтобы гарантировать, что мой графический интерфейс 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 .

9 голосов
/ 04 февраля 2017

Более общее решение (для установки всех переменных и псевдонимов, а не только PATH) дано в https://stackoverflow.com/a/12229404/1190077 - ключ должен установить:

(setq shell-command-switch "-ic")

, который переопределяетпо умолчанию "-c" (выполнить следующую команду).Добавление "-i" переводит оболочку bash в интерактивный режим, что приводит к получению ~/.bashrc.

1 голос
/ 22 июня 2014

Я придумал что-то похожее для поиска моего .bash_profile.Если вы заботитесь только о PATH, один из других приведенных выше ответов проще:

Он работает, выполняя source ~/.bash_profile ; echo post-env; env, затем выбрасывая все перед "post-env", а затем анализируя значения в ключе= значение "формат, который печатает команда" 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's "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
;;-------------------------------------------------------
1 голос
/ 21 июня 2011

Вы можете добавить параметры пути в /etc/profile.d, такие как

# /etc/profile.d/path.sh
export PATH="$PATH:/usr/local"

В Ubuntu я помню все сеансы источника вашего ~/.xsessionrc, поэтому вы также можете установить путь в этом файле для графического интерфейсаприложения.

1 голос
/ 20 июня 2011

Если ваши env vars не собраны, это может быть связано с тем, как запускается emacs.Проверьте пункт меню или что-то еще и попробуйте изменить emacs на bash -c emacs.

0 голосов
/ 20 июня 2011

Если $PATH установлено в терминале, с которого вы запускаете emacs, вы можете выполнять системные команды с помощью команды M-! <your command> RET.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...