Wenn ich M-x compile
es ausführe, wird eine neue Subshell erzeugt, um meinen Kompilierungsbefehl auszuführen. Sobald der Kompilierungsbefehl zurückgegeben wird, wird der Shell-Prozess beendet. Ich kann sehen, warum dies in den meisten Fällen wünschenswert wäre, aber ich bin derzeit in einer Situation, in der es nicht hilfreich ist.
Ich arbeite gerade in einer speziellen Build-Umgebung, die einige erste Schritte zum Einrichten des Builds erfordert, bevor der Compiler ausgeführt wird. Solange die Umgebung bestehen bleibt, muss ich die Einrichtungsschritte nur einmal ausführen. Aber wenn ich es benutze M-x compile
, bedeutet das, dass ich die Schritte jedes Mal ausführen muss, wenn ich kompilieren oder neu kompilieren möchte.
Gibt es eine Möglichkeit, eine Subshell zu erzeugen, die im Hintergrund verbleibt? Einer, M-x compile
und M-x gdb
jedes Mal , wenn sie benötigen , können einen Shell - Prozess laufen zu lassen?
Motivation:
Ich habe ein Programm (das wir aufrufen werden xcc
), das C-Code für spezielle Plattformen erstellt. Um meinen Code zu erstellen, beginne ich zuerst mit xcc
der tcsh
Eingabeaufforderung:
$ xcc
Das Laden des Programms dauert mehr als 10 Sekunden, und dann kann ich an der interaktiven Eingabeaufforderung Befehle eingeben
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
Die obigen Schritte können in ein benutzerdefiniertes Makro integriert werden, buildmyprog.macro
sodass ich es direkt von der Shell oder von Emacs mit ausführen kannM-x compile
$ xcc buildmyprog.macro
Das Hauptproblem bei diesem Ansatz ist die Tatsache, dass das xcc
Laden des Programms 10 Sekunden dauert , bevor die Kompilierung überhaupt beginnt. Ich habe müde genug um die zusätzlichen 10 Sekunden jedes Mal , wenn ich zusammengestellt warten , dass ich laufen begonnen haben , xcc
in eine ansi-term
in einem separaten Puffer. Nachdem ich den Code geändert und gespeichert habe, wechsle ich zum ansi-term
Puffer und führe ihn aus
xcc>> build myprogram
Das funktioniert gut, aber jedes Mal, wenn ich zu diesem Puffer wechsle, denke ich: "Wäre es nicht großartig, wenn ich nur pushen könnte F7
und mein Kompilierungsbefehl an die bereits laufende Instanz von gesendet würde xcc
?"
quelle
comint
abgeleiteten Modus für Ihre Umgebung benötigen . Wenn Sie sich abenteuerlustig fühlen, finden Sie hier eine Anleitung zum Schreiben einer.comint-send-input
. Das ist im Grunde das, was Sie von Hand tun. Die Konvertierung in Elisp sollte nicht sehr schwierig sein (insbesondere im Vergleich zum Einrichten des Comint).Antworten:
Können Sie das Setup in Ihrer Shell durchführen, bevor Sie Emacs starten? Die
compile
Sub-Shell sollte die Umgebung von ihren Großeltern über Emacs erben.quelle
M-x compile
seine Befehle nicht an den Python-Interpreter zurückgesendet.Verwenden Sie dann eine tatsächliche Shell in Emacs, wie
eshell
oderansi-term
. Sie solltencompile
zum Kompilieren verwenden, obwohl es zum Ausführen eines beliebigen Befehls verwendet werden kann.Ich denke nicht, dass es mit dem Kompilierungsbefehl möglich ist, aber vielleicht fehlt mir etwas. Andernfalls können Sie alle Setup-Schritte in ein Shell-Skript einfügen und dieses Skript mit ausführen
M-x compile
.quelle
M-x compile
einen alternativen Befehl anschließt, der die aktuelle Datei kompiliert.M-x compile
Aufrufen, und genau das tut eine tatsächliche Shell. Ich denke nicht, dass es mit dem Kompilierungsbefehl möglich ist, aber vielleicht fehlt mir etwas. Andernfalls könnte das OP alle Setup-Schritte in ein Shell-Skript einfügen und dieses Skript mitM-x compile
eshell
für Shell-Dinge undcompile
zum Kompilieren von Dingen"? Das macht den ganzen Punkt zunichte.Eine mögliche Lösung wäre, einen permanenten Interpreter in einem dedizierten Puffer zu haben (ähnlich wie der
*compilation*
Puffer, aber wo der zugrunde liegende Prozess niemals zurückkehren würde). Sie könnten dann einenrecompile
ähnlichen Befehl haben, um einen vordefinierten Kompilierungsbefehl an den Interpreter zu senden und die Ergebnisse anzuzeigen.Nachfolgend finden Sie eine vorläufige Umsetzung einer solchen Strategie. Der
persistent-compile
Befehl kümmert sich sowohl um die Initialisierung des Prozesses (wenn er zum ersten Mal aufgerufen wird oder mit einem Präfixargument) als auch um die Neukompilierung (wenn der Interpreterprozess bereits ausgeführt wird). Die Kompilierungsergebnisse werden in einem*persistent-compilation*
Puffer angezeigt , umcompilation-shell-minor-mode
die üblichencompilation-mode
Funktionen zum Navigieren zwischen Fehlern zu nutzen.Hier ist eine Beispielverwendung zusammen mit dem resultierenden Inhalt des
*persistent-compilation*
Puffers:M-x
persistent-compile
RET/bin/bash
RETFOO=bar
RETecho $FOO
RETM-x
persistent-compile
RETAchtung, der folgende Code wurde nicht viel getestet. Ich bin mir beispielsweise nicht sicher, was passiert, wenn Sie versuchen, vor dem Beenden der vorherigen Kompilierung eine Neukompilierung durchzuführen.
quelle