Lorsque je l'exécute, M-x compile
il génère un nouveau sous-shell pour exécuter ma commande de compilation. Dès que la commande de compilation revient, le processus shell est tué. Je peux voir pourquoi cela serait souhaitable dans la plupart des cas, mais je suis actuellement dans une situation où cela n'est pas utile.
Je travaille actuellement dans un environnement de build spécialisé qui nécessite que je prenne quelques mesures initiales pour configurer la build avant d'exécuter le compilateur. Tant que l'environnement persiste, je n'ai besoin d'effectuer les étapes de configuration qu'une seule fois. Mais lorsque j'utilise M-x compile
cela signifie que je dois faire les étapes chaque fois que je veux compiler ou recompiler.
Existe-t-il un moyen de générer un sous-shell qui persistera en arrière-plan? Un que M-x compile
et M-x gdb
peut utiliser chaque fois qu'ils ont besoin d'exécuter un processus shell?
Motivation:
J'ai un programme (que nous appellerons xcc
) qui construit du code C pour des plateformes spéciales. Afin de construire mon code, je commence d'abord xcc
par l' tcsh
invite:
$ xcc
Le programme prend plus de 10 secondes à charger, puis je peux entrer des commandes à l'invite interactive
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
Les étapes ci-dessus peuvent être intégrées dans une macro personnalisée buildmyprog.macro
afin que je puisse l'exécuter directement à partir du shell ou d'Emacs avecM-x compile
$ xcc buildmyprog.macro
Le principal problème de cette approche est le fait qu'il faut au xcc
programme 10 secondes pour se charger, avant même que la compilation ne commence. Je me suis assez fatigué d'attendre les 10 secondes supplémentaires chaque fois que j'ai compilé que j'ai commencé à courir xcc
dans un ansi-term
dans un tampon séparé. Maintenant, après avoir modifié et enregistré le code, je passe au ansi-term
tampon et je lance
xcc>> build myprogram
Cela fonctionne très bien, mais chaque fois que je passe à ce tampon, je pense: "Ne serait-ce pas génial si je pouvais simplement pousser F7
et que ma commande de compilation serait envoyée à l'instance déjà en cours d'exécution de xcc
?"
la source
comint
mode dérivé pour votre environnement. Si vous vous sentez aventureux, voici un guide pour en écrire un.comint-send-input
. C'est essentiellement ce que vous faites à la main, le convertir en elisp ne devrait pas être très difficile (surtout par rapport à la configuration de comint).Réponses:
Pouvez-vous faire la configuration dans votre shell avant de démarrer emacs? Le
compile
sous-shell doit hériter de l'environnement de ses grands-parents via emacs.la source
M-x compile
il n'envoie pas ses commandes à l'interpréteur Python.Utilisez ensuite un véritable shell dans Emacs, comme
eshell
ouansi-term
. Vous devez utilisercompile
pour la compilation, bien qu'il puisse être utilisé pour exécuter n'importe quelle commande.Je ne pense pas que ce soit possible avec la commande de compilation, mais il me manque peut-être quelque chose. Sinon, vous pouvez mettre toutes les étapes de configuration dans un script shell et exécuter ce script avec
M-x compile
.la source
M-x compile
ou une autre commande qui compilera le fichier actuel.M-x compile
appels, et c'est ce que fait un shell réel. Je ne pense pas que ce soit possible avec la commande de compilation, mais il me manque peut-être quelque chose. Sinon, l'OP pourrait mettre toutes les étapes de configuration dans un script shell et exécuter ce script avecM-x compile
eshell
pour les choses shell etcompile
pour compiler les choses"? Cela bat tout le point.Une solution possible serait d'avoir un interprète permanent en direct dans un tampon dédié (un peu comme le
*compilation*
tampon, mais où le processus sous-jacent ne reviendrait jamais). Vous pourriez alors avoir unerecompile
commande -like pour envoyer une commande de compilation prédéfinie à l'interpréteur et afficher les résultats.Voici une mise en œuvre provisoire d'une telle stratégie. La
persistent-compile
commande s'occupe à la fois de l'initialisation du processus (lorsqu'il est appelé pour la première fois ou avec un argument préfixe) et de la recompilation (si le processus interpréteur est déjà en cours d'exécution). Les résultats de la compilation sont affichés dans un*persistent-compilation*
tampon, miscompilation-shell-minor-mode
à profit pour bénéficier descompilation-mode
fonctionnalités habituelles pour naviguer entre les erreurs.Voici un exemple d'utilisation, avec le contenu résultant du
*persistent-compilation*
tampon:M-x
persistent-compile
RET/bin/bash
RETFOO=bar
RETecho $FOO
RETM-x
persistent-compile
RETAttention, le code suivant n'a pas été beaucoup testé. Par exemple, je ne sais pas ce qui se passe lorsque vous essayez de recompiler avant la fin de la compilation précédente.
la source