Cuando lo ejecuto M-x compile
genera una nueva subshell para ejecutar mi comando de compilación. Tan pronto como el comando de compilación regresa, el proceso de shell se cierra. Puedo ver por qué esto sería deseable en la mayoría de los casos, pero actualmente estoy en una situación en la que no es útil.
Estoy trabajando en un entorno de compilación especializado en este momento que requiere que tome algunos pasos iniciales para configurar la compilación antes de ejecutar el compilador. Mientras el entorno persista, solo necesito hacer los pasos de configuración una vez. Pero cuando lo uso M-x compile
significa que tengo que hacer los pasos cada vez que quiero compilar o recompilar.
¿Hay alguna forma de generar una subshell que persista en segundo plano? Uno que M-x compile
y M-x gdb
puede utilizar cada vez que necesitan para ejecutar un proceso de shell?
Motivación:
Tengo un programa (que llamaremos xcc
) que construye el código C para plataformas especiales. Para construir mi código, primero comienzo xcc
desde el tcsh
indicador:
$ xcc
El programa tarda más de 10 segundos en cargar, y luego puedo ingresar comandos en su solicitud interactiva
xcc>> add target myprogram
xcc>> set source myprogram $PROJDIR/src/
xcc>> set includes myprogram $PROJDIR/include/
xcc>> set type myprogram primitive
xcc>> set inputs myprogram int8,int8
xcc>> set outputs myprogram fix16,fix16
xcc>> build myprogram
Los pasos anteriores pueden integrarse en una macro personalizada buildmyprog.macro
para que pueda ejecutarla directamente desde el shell o desde emacs conM-x compile
$ xcc buildmyprog.macro
El principal problema con este enfoque es el hecho de que el xcc
programa tarda 10 segundos en cargarse, incluso antes de que comience la compilación. Me cansé lo suficiente de esperar los 10 segundos adicionales cada vez que compilé que comencé a correr xcc
en un ansi-term
búfer separado. Ahora, después de modificar y guardar el código, cambio al ansi-term
búfer y ejecuto
xcc>> build myprogram
Esto funciona bien, pero cada vez que cambio a ese búfer pienso: "¿No sería genial si pudiera empujar F7
y enviar mi comando de compilación a la instancia ya en ejecución xcc
?"
fuente
comint
modo derivado para su entorno. Si te sientes aventurero, aquí hay una guía para escribir uno.comint-send-input
. Eso es básicamente lo que está haciendo a mano, convertirlo a elisp no debería ser muy difícil (especialmente en comparación con la configuración de la comint).Respuestas:
¿Puedes hacer la configuración en tu shell antes de iniciar emacs? El
compile
sub-shell debe heredar el entorno de sus abuelos a través de emacs.fuente
M-x compile
no envía sus comandos al intérprete de Python.Use un shell real dentro de Emacs, como
eshell
oansi-term
. Debe usarlocompile
para compilar, aunque puede usarse para ejecutar cualquier comando.No creo que sea posible con el comando de compilación, pero tal vez me falta algo. De lo contrario, podría poner todos los pasos de configuración en un script de shell y ejecutar ese script con
M-x compile
.fuente
M-x compile
o algún comando alternativo que compile el archivo actual.M-x compile
llamadas, y eso es lo que hace un shell real. No creo que sea posible con el comando de compilación, pero tal vez me falta algo. De lo contrario, el OP podría poner todos los pasos de configuración en un script de shell y ejecutar ese script conM-x compile
eshell
para cosas de shell ycompile
para compilar cosas"? Eso derrota todo el punto.Una posible solución sería tener un intérprete permanente en vivo en un búfer dedicado (algo así como el
*compilation*
búfer, pero donde el proceso subyacente nunca volvería). Luego, podría tener unrecompile
comando similar para enviar un comando de compilación predefinido al intérprete y mostrar los resultados.A continuación se muestra una implementación tentativa de dicha estrategia. El
persistent-compile
comando se ocupa tanto de la inicialización del proceso (cuando se llama por primera vez o con un argumento de prefijo) como de la recompilación (si el proceso del intérprete ya está en funcionamiento). Los resultados de la compilación se muestran en un*persistent-compilation*
búfercompilation-shell-minor-mode
y se aprovechan de lascompilation-mode
características habituales para navegar entre errores.Aquí hay un ejemplo de uso, junto con el contenido resultante del
*persistent-compilation*
búfer:M-x
persistent-compile
RET/bin/bash
RETFOO=bar
RETecho $FOO
RETM-x
persistent-compile
RETCuidado, el siguiente código no fue probado mucho. Por ejemplo, no estoy seguro de lo que sucede cuando intenta volver a compilar antes de la finalización de la compilación anterior.
fuente