2012-06-08 13 views
13

La compilación M-x de Emacs no muestra ningún alias configurado en .bashrc. Si uso M-x shell, entonces escriba el alias, está bien. Traté de obtener .bashrc de/etc/profile, de ~/.profile, ~/bash_env, todo lo que se me ocurrió fue en vano.El modo de compilación de Emacs no verá el alias de bash

Estoy en Emacs 23 y Ubuntu 11. Comienzo emacs utilizando/usr/bin/emacs% F, desde un botón de escritorio.

¿Alguna idea?

Respuesta

16

Emacs hereda su entorno del proceso principal. ¿Cómo está invocando Emacs, desde la línea de comandos, o de alguna otra manera?

¿Qué pasa si usted:

Mx compilar RETCaCk fiesta de -i -c your_aliasRET

Invocando bash como un shell interactivo (-i opción) debería leer sus alias de .bashrc.

Editar: Creo que tanto M-x cáscara y mando y M-x compilación ejecutar comandos en un shell inferior a través de llamada-proceso. Pruebe lo siguiente en su .emacs (o simplemente evaluar):

(setq shell-file-name "bash") 
(setq shell-command-switch "-ic") 

noto que después de la evaluación de lo anterior, .bashrc alias son recogidos para su uso tanto por Mx cáscara y mando y Mx compilación , es decir,

Mx compilar RETyour_aliasRET

debería funcionar.

Mi entorno: Emacs 24.1 (pretest rc1), OSX 10.7.3

+0

los comandos de setq funcionaron. ¡eres el hombre! – user423805

+0

Una advertencia: para mí, esto tiene el efecto secundario de hacer que autocomplete.el funcione muy despacio. Presumiblemente está creando repetidamente bash shells en algún lado y ejecutando todo mi .bashrc todo el tiempo. Podría intentar escribir un contenedor alrededor de la compilación que cambie temporalmente el shell-command-switch a "-ic". – dshepherd

+0

(sobre 'shell-command-switch" -ic "') No, NO funciona con 'shell-command'. Ubuntu 16.04, emacs 24.5. Hay errores impresos: "bash: no se puede establecer el grupo de proceso de terminal (-1): ioctl inapropiado para el dispositivo. bash: no hay control de trabajo en este shell". Si elimino la opción '-i' de' shell-command-switch', '.bashrc' con los alias definidos no se carga. Ver http://emacs.stackexchange.com/questions/3447. El asesoramiento "Emacs hereda su entorno del proceso principal" parecía agradable y funcionaba con 'export's ¡PERO los alias en subcapas no funcionan! Ver http://superuser.com/questions/319538 – d9k

1

Creo que los comandos de compilación no se interpretan a través de un intérprete de comandos: son ejecutados juste por emacs (lo que significa que no se tienen en cuenta los alias, funciones del shell y otros elementos específicos del shell).

Trate de envolver su comando de compilación en un shell-script que proceda con el entorno correcto.

Usted puede hacer esto ya sea con un shell-script de pleno derecho en la forma

#!/bin/bash 
source "~/.bashrc" 
my_command 

o directamente en emacs con un comando de compilación de la forma

bash -c "source ~/.bashrc; my_command"

+0

Francesco, que trató la cosa fiesta -c en el comando de compilación, y el mismo resultado: bash: [mi alias]: comando no encontrado – user423805

+0

No hay necesidad de la Fiesta De -c; simplemente agregue "source /home/$USERNAME/.bashrc &&" antes de cualquier comando adicional en la variable compile-command. Estoy usando esto y funciona bastante bien. – elemakil

+0

Tengo un alias llamado run_csv. Hice lo que me pediste, fuente /home/[ME]/.bashrc && run_csv. El resultado es/bin/bash: run_csv: comando no encontrado – user423805

3

Keith flor, pero pueden dar lugar a algunos retrasos debido a .bashrc siendo innecesariamente cargada en otros lugares (presumiblemente muchas veces, mi equipo no es precisamente bajo poder pero emacs era casi inutilizable cuando se intentaba usar autocomplete.el).

Una forma alternativa es modificar localmente shell-command-switch sólo para las funciones donde se necesita. Esto se puede hacer utilizando la función de "asesoramiento" de emacs para crear un contenedor alrededor de esas funciones. He aquí un ejemplo que modifica compile:

;; Define + active modification to compile that locally sets 
;; shell-command-switch to "-ic". 
(defadvice compile (around use-bashrc activate) 
    "Load .bashrc in any calls to bash (e.g. so we can use aliases)" 
    (let ((shell-command-switch "-ic")) 
    ad-do-it)) 

Usted tiene que escribir "consejos" similar para cada función que desea utilizar .bashrc (por ejemplo, yo también tenía que definir el mismo consejo para recompile), simplemente copiar los anteriores y reemplace compile en lo anterior con otro nombre de función.

Cuestiones relacionadas