2010-02-15 8 views
13

Estoy tratando de obtener un comando de compilación (rastrillo de pepino) para ejecutar con una versión de ruby ​​específica en mi sistema Mac OS X, utilizo rvm para hacer esto actualmente en el terminal. Mi ~/.MACOSX/environment.plist tiene la ruta correcta, pero emacs insiste en anteponerse a esta ruta y, por lo tanto, es inútil. También lo intenté:Emacs está ignorando mi ruta cuando ejecuta un comando de compilación

(when (equal system-type 'darwin) 
    (setenv "PATH" (concat "/Users/fearoffish/.rvm/bin:/Users/fearoffish/.rvm/rubies/ruby-1.8.7-p249/bin:/Users/fearoffish/.rvm/gems/ruby-1.8.7-p249/bin:/Users/fearoffish/.rvm/gems/ruby-1.8.7-p249%global/bin:/Users/fearoffish/.rvm/bin")) 
    (push "/Users/fearoffish/.rvm/bin" exec-path) 
    (push "/Users/fearoffish/.rvm/rubies/ruby-1.8.7-p249/bin" exec-path) 
    (push "/Users/fearoffish/.rvm/gems/ruby-1.8.7-p249/bin" exec-path) 
    (push "/Users/fearoffish/.rvm/gems/ruby-1.8.7-p249%global/bin" exec-path) 
    (push "/Users/fearoffish/.rvm/bin" exec-path)) 

Fue el intento desesperado de un principiante de emacs para obtener lo que quería. Es todavía antepone en frente de ella, por lo que mi camino termina siendo:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/Users/fearoffish/.rvm/bin:/Users/fearoffish/.rvm/rubies/ruby-1.8.7-p249/bin:/Users/fearoffish/.rvm/gems/ruby-1.8.7-p249/bin:/Users/fearoffish/.rvm/gems/ruby-1.8.7-p249%global/bin 

no quiero/usr/bin y otros anteponiendo, quiero mi camino primera y emacs antepone camino hacia ser al final, creo que esto solucionaría mi problema.

Pruebo esto simplemente abriendo Aquamacs y ejecutando meta-x compile y luego echo $PATH.

¿Alguna idea?

+0

Todas las respuestas son acerca de los comandos de shell, pero difieren de los mandatos de compilación, ¿verdad? –

+0

Estoy experimentando esto, aunque he comentado path_helper en/etc/profile, y mi $ SHELL es zsh. –

Respuesta

9

Una pequeña modificación en el solución mediante sanityinc (no podía encontrar una manera de entrar en los comentarios anteriores - es que sólo yo?)

  • utilizo -l opción de la cáscara para forzar un shell de entrada (que lee .profile o .bash_profile), en lugar de un intérprete de comandos interactivo (que solo lee .bashrc).
  • Realizo algunos recortes de cadena en la ruta devuelta (ya que la inspección muestra una nueva línea entrando furtivamente).

código de modificación:

(defun set-exec-path-from-shell-PATH() 
    (let ((path-from-shell 
     (replace-regexp-in-string "[[:space:]\n]*$" "" 
     (shell-command-to-string "$SHELL -l -c 'echo $PATH'")))) 
    (setenv "PATH" path-from-shell) 
    (setq exec-path (split-string path-from-shell path-separator)))) 
(when (equal system-type 'darwin) (set-exec-path-from-shell-PATH)) 
+0

¡Agradable! Intenté sanityinc's y quedé perplejo, ¡pero tus cambios me lo arreglaron! – spacemanaki

+0

@spacemanaki: De hecho, desde entonces, cambié de Carbon Emacs a Aquamacs (http://aquamacs.org/), que, entre muchas otras cosas, lo saca de la caja. Al principio no me siento muy emacsy, pero ciertamente ha crecido en mí. – Janus

+0

De hecho, comencé con Aquamacs cuando obtuve esta Macbook en agosto, pero cambié a Carbon Emacs por alguna razón, pero no recuerdo por qué. Volver atrás y probar esto en Aquamacs fue en realidad lo que me llevó a comprobar lo que Emacs pensó que era PATH. ¡Gracias de nuevo! – spacemanaki

0

intente esto tal vez. reemplace la cadena de ruta por la suya.

(add-to-list 'load-path "~/opt/Swank-clojure/src/emacs")

2

no tengo un Mac, así que no puedo probar esto directamente, pero esto puede todos se encuentran en la * info * página Interactive Inferior Shell.

Al iniciar una concha en Emacs, el proceso dio lugar a que obtiene es el programa en la variable de Emacs explicit-shell-file-name (y si eso es nil, las variables de entorno ESHELL y SHELL se utilizan).

A continuación, envía el contenido de ~/.emacs_*shellname* (por ejemplo, si su cáscara es csh, entonces ~/.emacs_csh serían enviados de nuevo. Además, los archivos .rc apropiadas para el programa csh mismo se solicita, para que pueda actualizar, así que (en mi caso .cshrc). Además, se puede envolver personalizaciones en el archivo .rc con un cheque por la variable de entorno INSIDE_EMACS (que el que Emacs activa antes de que se ejecuta un shell).

es necesario actualizar estos archivos para cambiar la ruta en el shell, no la variable de Emacs exec-path. exec-path - que es solo una lista de directorios Emacs usa para encontrar programas ejecutables. El comportamiento de los archivos ejecutables no se ve afectado por los cambios en exec-path.

0

Por lo que he observado, Emacs toma la variable de ruta del shell desde el que se inicia, por lo que una solución es cambiar $ PATH en el shell antes de iniciar Emacs.

Otro enfoque que utilicé, que es más flexible, es usar un archivo Makefile y anexar un "origen ~/script_that_set_path" delante de cada comando make que tenga.

+1

En una Mac, ese no es el caso; Los programas de GUI lanzados desde Finder no heredan el entorno del escritorio o el shell del usuario. – sanityinc

+0

Ah, lo siento pero nunca he usado una Mac; mi observación solo se refiere a Windows y Linux. ¿Funciona el inicio de Emacs desde la terminal (o equivalentes en Mac)? Sugeriría (una vez más) probar el método Makefile ya que esa es la única forma en que descubrí que funciona de manera confiable (también tuve problemas para obtener PATH correctamente para compilación). – polyglot

2

El esquema environment.plist en Mac es bastante feo, así que utilizo el siguiente fragmento, que supone que quiere que Emacs use la misma RUTA que ve en su Terminal.aplicación:

(defun set-exec-path-from-shell-PATH() 
    (let ((path-from-shell (shell-command-to-string "$SHELL -i -c 'echo $PATH'"))) 
    (setenv "PATH" path-from-shell) 
    (setq exec-path (split-string path-from-shell path-separator)))) 

(Esto funciona para mí en Emacs 23; no lo he probado en otras versiones, pero yo esperaría que funcione.)

+0

¿Es esto para comandos de compilación así como comandos de shell? –

+0

Sí, debería ser. – sanityinc

10

Todo el mundo parece haber entendido mal la emisión original: el camino ya se ha configurado correctamente en Emacs, y el camino correcto ya se pasa a la consola iniciada por el comando de compilación! Entonces, ¿qué da? Aquí está la respuesta:

En MacOS X, hay una pequeña herramienta llamada path_helper(1). Se llama por defecto desde /etc/profile, que Bash ejecuta en el inicio del shell. Cuando inicia una compilación desde Emacs, lanza un shell (que de forma predeterminada es Bash en MacOS X) y, por lo tanto, ejecuta esta herramienta path_helper. Y aquí viene el punto clave: path_helperreorganiza su ruta, moviendo los directorios estándar como /usr/bin en frente de sus directorios agregados personalizados, sin importar dónde los haya agregado originalmente. Pruébelo usted mismo abriendo un caparazón y primero echando un vistazo a lo que es PATH, y luego ejecute /usr/lib/path_helper y tenga en cuenta la RUTA resultante.

La solución de fuerza bruta para usted puede ser simplemente comentar la llamada a path_helper en /etc/profile. Sin embargo, tenga en cuenta que no obtendrá automáticamente las rutas en /etc/paths.d configuración por path_helper, que es el propósito principal de la herramienta.

+0

Este problema todavía existe y esta respuesta es correcta. Tuve que editar/etc/zshenv pero la misma idea.Para ver la distinción, mira esto: '(defun mi-compile-test() "pruebas de ruta en la compilación" (interactiva) (compilar "echo $ SHELL; echo $ PATH, la salida 1") ) ' Si define esa función y la ejecuta, puede obtener una imagen de lo que está sucediendo _inside_ el * compilador * buffer. ¡Recomendar! – Ian

+0

Disculpa por el formato. Bizarre motor de descuento. – Ian

0

He intentado tantos enfoques diferentes para esto que terminaron no usando emacs para configurar mi entorno de comando de compilación.

Lo que hago ahora es crear un archivo run_helper.sh que simplemente inicializa un ambiente limpio y luego utiliza exec $* para ejecutar el comando se pasa como argumento a run_helper.sh

Este run_helper.sh suele proyectos específicos, pero sigo una plantilla que utilizo para comenzar cuando creo un nuevo proyecto.

Luego, simplemente ejecuto compile de emacs como bash run_helper.sh rspec path/to/tests por ejemplo.

Si estoy usando esto para ejecutar pruebas de ruby, mi ayudante inicializa RVM para usar el ruby ​​y gemset adecuados. Si estoy usando otro lenguaje, puede exportar variables de entorno requeridas o realizar alguna otra inicialización, pero de esta manera puedo hacerlo en script bash en lugar de tener que meterme siempre con las rutas de emacs y elisp cada vez que empiezo un nuevo proyecto.

He aquí un ejemplo de un archivo run_helper.sh

#!/bin/bash 

cd /Users/simao/Documents/sp 

export DYLD_LIBRARY_PATH="/usr/local/mysql/lib:$DYLD_LIBRARY_PATH" 

source "$HOME/.rvm/scripts/rvm" # This loads the proper ruby and gemset from .rvmrc 

export RAILS_ENV=test 

exec $* 

Esto también hace que mis pruebas de correr más rápido porque tengo un montón de cosas en mi .zshrc que no desea cargar sólo para hacer algunas pruebas.

0

Me funcionó con dos cosas.

Primero siguió el consejo sanityinc

Una versión mejorada y modificada del fragmento de código se publica ahora como elisp biblioteca llamada exec-path-de-shell; paquetes installables están disponibles en Marmalade y Melpa

Todavía tenía un problema con los comandos de compilación. Valko Sipuli tiene razón, hubo un problema relacionado con path_helper.

Comenté la línea correspondiente en/etc/profile y no sirvió de nada. Problema todavía allí. No uso bash pero zsh. Excavar un poco encontré/etc/zshenv. Este archivo también llama a path_helper.

Después de comentar la sección path_helper en/etc/zshenv mi camino es finalmente correcto

Cuestiones relacionadas