2011-06-20 13 views
11

Necesito usar mi $PATH en Emacs para ejecutar algunos comandos. ¿Cómo puedo hacer que Emacs lo use? Instalé Emacs en los repositorios de Ubuntu.¿Cómo hacer que Emacs use mi archivo .bashrc?

+0

http://stackoverflow.com/questions/1393400/commands-from-bashrc-not-available-in-emacs –

+0

[Esta respuesta] (https://emacs.stackexchange.com/a/29120/8849) parece ser una resolución perfecta. –

Respuesta

29

He aquí un truco I use para asegurar mi interfaz gráfica de usuario de Emacs siempre ve el mismo $PATH que consigo dentro de una cáscara:

(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)) 

En concreto, en OS X, un Emacs gráfica no recoge la definición de shell del usuario de $PATH, así que este truco me ayuda en esa plataforma.

Actualización: este código se ha publicado como una biblioteca elisp llamada exec-path-from-shell y los paquetes instalados están disponibles en MELPA.

+0

Esto soluciona el mismo problema en ubuntu 13.04 (utilicé la instalación del administrador de paquetes) – Anake

+0

Parece que no usa alias. Sin embargo, no lo esperaría por el nombre. ¿Hay algo para obtener también los alias de bash normal? – Zelphir

+0

Emacs nunca usará sus alias de bash, lo siento: solo están disponibles dentro de las sesiones de bash. Este código y el paquete exec-path-from-shell simplemente permiten a Emacs ubicar de forma confiable los mismos archivos ejecutables y scripts que están visibles en sus sesiones bash. – sanityinc

0

Si el $PATH está configurado en el terminal desde el que ejecuta emacs, puede ejecutar los comandos del sistema a través del comando M-! <your command> RET.

1

Si sus env vars no son recogidos, puede deberse a la forma en que se inicia emacs. Compruebe el elemento de menú o lo que sea e intente cambiar emacs por bash -c emacs.

1

Puede agregar configuración de ruta a /etc/profile.d como

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

En Ubuntu, recuerdo todas las fuentes de sesiones de su ~/.xsessionrc, lo que también puede establecer la ruta en este archivo para aplicaciones GUI.

1

Se me ocurrió algo similar para obtener mi .bash_profile. Si solo te preocupa PATH, una de las otras respuestas anteriores es más simple.

Funciona ejecutando source ~/.bash_profile ; echo post-env; env y luego descarta todo antes de "post-env", y luego analiza los valores en el formato "clave = valor" que imprime el comando "env".

Probablemente no maneje todas las fundas a la perfección, pero funciona lo suficientemente bien para mí.

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

Una solución más general (para ajustar todas las variables y alias, no sólo PATH) se da en https://stackoverflow.com/a/12229404/1190077 - la clave es establecer:

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

que anula el valor predeterminado "-c" (ejecutar el siguiente comando). La adición de "-i" fuerza al shell bash a modo interactivo, lo que lleva a la obtención de ~/.bashrc.

Cuestiones relacionadas