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?
Respuesta
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.
Esto soluciona el mismo problema en ubuntu 13.04 (utilicé la instalación del administrador de paquetes) – Anake
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
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
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
.
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
.
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.
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
;;-------------------------------------------------------
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
.
- 1. ¿Cómo hacer que HttpClient use Kerberos?
- 2. ¿Cómo hacer que Emacs guarde el archivo en varias ubicaciones?
- 3. ¿Cómo evito que Emacs edite automáticamente mi archivo de inicio?
- 4. ¿Cómo obtengo el comando vim's: sh para obtener mi bashrc?
- 5. emacs gud window use
- 6. Cómo depurar Emacs lisp que hace que Emacs se bloquee/use 100% de CPU?
- 7. Hacer que GNU use un compilador diferente
- 8. vim - ejecutar: comandos en mi .bashrc
- 9. Añadiendo mysql a mi .bashrc PATH
- 10. Hacer que Qt Creator use MinGW
- 11. Cómo hacer que mi aplicación copie el archivo más rápido
- 12. ¿Cómo le digo a playframework que use mi proxy corporativo?
- 13. GWT - ¿Hacer que CellTable Cell use HTML?
- 14. ¿Cómo hacer que gcc use march = native como predeterminado?
- 15. ¿Cómo puedo hacer Emacs auto-sangrando mi código C?
- 16. Los comandos de .bashrc no están disponibles en Emacs
- 17. ¿Cómo puedo hacer que mi script de Perl use múltiples núcleos para procesos secundarios?
- 18. JavaFX: ¿Cómo hacer que mi componente personalizado use todo el espacio disponible desde el diseño principal?
- 19. No mainwindow.xib en Xcode 4 Confundido cómo hacer que mi TabBarController use NavigationController
- 20. ¿Cómo hacer que NSTextField use la subclase personalizada de NSTextFieldCell?
- 21. ¿Cómo hacer que vim use el mismo entorno que mi shell de inicio de sesión al ejecutar comandos con "!"?
- 22. ¿Cómo puedo hacer que el cliente web use cookies?
- 23. ¿Cómo puedo decirle a Gradle que use mi archivo testng.xml para Clases de prueba y pedidos?
- 24. ¿Cómo hacer que Jersey use SLF4J en lugar de JUL?
- 25. ¿Cómo hacer que Eclipse use JDK8 para compilar un proyecto?
- 26. ¿Cómo hago para que Java use mi proveedor de seguridad?
- 27. Cómo hacer que la declaración del conmutador C# use IgnoreCase
- 28. ¿Cómo hacer que boost.build use una instalación de compilación específica?
- 29. ¿Cómo hacer que LogonUser no use credenciales en caché?
- 30. ¿Cómo puedo hacer que StackPanel use una ItemTemplate?
http://stackoverflow.com/questions/1393400/commands-from-bashrc-not-available-in-emacs –
[Esta respuesta] (https://emacs.stackexchange.com/a/29120/8849) parece ser una resolución perfecta. –