Cuando lo ejecuto M-x compilegenera 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 compilesignifica 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 compiley M-x gdbpuede 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 xccdesde el tcshindicador:
$ 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.macropara 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 xccprograma 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 xccen un ansi-termbúfer separado. Ahora, después de modificar y guardar el código, cambio al ansi-termbú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 F7y enviar mi comando de compilación a la instancia ya en ejecución xcc?"
fuente

comintmodo 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
compilesub-shell debe heredar el entorno de sus abuelos a través de emacs.fuente
M-x compileno envía sus comandos al intérprete de Python.Use un shell real dentro de Emacs, como
eshelloansi-term. Debe usarlocompilepara 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 compileo algún comando alternativo que compile el archivo actual.M-x compilellamadas, 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 compileeshellpara cosas de shell ycompilepara 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 unrecompilecomando 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-compilecomando 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-modey se aprovechan de lascompilation-modecaracterí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-compileRET/bin/bashRETFOO=barRETecho $FOORETM-x
persistent-compileRETCuidado, 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