How to make Emacs use my .bashrc file?

前端 未结 7 1096
轻奢々
轻奢々 2020-12-29 06:00

I need to use my $PATH in Emacs to run some commands. How can I make Emacs use it? I installed Emacs from Ubuntu repositories.

7条回答
  •  时光取名叫无心
    2020-12-29 06:09

    I came up with something similar for sourcing my .bash_profile. If you only care about PATH, one of the other answers above is simpler.

    It works by executing source ~/.bash_profile ; echo post-env; env then throwing away everything before "post-env", and then parsing out the values in the "key=value" format that the "env" command prints.

    It probably doesn't handle every case perfectly, but works well enough for me.

    ;;-------------------------------------------------------
    ;; 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
    ;;-------------------------------------------------------
    

提交回复
热议问题