Um es klar auszudrücken, ich spreche nicht von irgendetwas, bei dem Emacs Multithreading erfordern sollten (obwohl dies wahrscheinlich auch das lösen würde). Reproduzieren:
- emacs -Q # Ich verwende 24.4.1
- Machen Sie einen zweiten Frame
- Wechseln Sie zurück zum ersten Frame
- Mx Shell
- Mx eindeutig umbenennen (wir werden später eine zweite Shell erstellen)
- Lauf:
while true; do echo "hello world"; done
- Im zweiten Frame Mx-Shell
Die zweite Shell wird fast nie angezeigt (selten funktioniert sie nach wiederholten Versuchen). Anscheinend machen Emacs niemals eine Pause vom Lesen der Ausgabe der ersten Shell, um die Ausgabe zu hören, die von einem anderen Prozess eingeht. Es wäre viel besser, ein Round-Robin-Verfahren durchzuführen, wenn mehrere Prozesse mit ausstehender Ausgabe vorhanden sind. Gibt es eine Möglichkeit, sich besser zu verhalten?
Der einzige Trick, den ich kenne, wäre, den Shell-Puffer zu einem eigenen Prozess zu machen, aber das funktioniert leider nicht für mich. Selbst wenn ich das mache, muss ich einen Unterprozess ausführen, um einen Socket abzuhören, damit meine Spracherkennungssoftware funktioniert, damit ich die Shell überhaupt steuern kann. So habe ich das entdeckt. Durch Ausführen einer Endlosschleife wie oben wird verhindert, dass Daten aus dem Socket entfernt werden.
quelle
start-process
mit aset-process-filter
und aset-process-sentinel
- dies ermöglicht es mir, meinen lustigen Weg zu gehen, andere Dinge zu tun, während der Prozess ausgeführt wird - ich sende meine Ausgabe manchmal sogar mit an den*Messages*
Puffer,insert
damit mein Echo-Bereich unberührt bleibt, oder ich benutze einen dedizierten Prozessausgabepuffer (falls erforderlich). Zum Beispiel kann ich eine langersync
Sitzung durchführen. Ich habe keine Erfahrung damit, mehrere gleichzeitig / lang laufen zu lassenstart-process
, daher bin ich mir nicht sicher, wie Emacs mit einer Menge von allen umgehen würde.Antworten:
Das ist also keine richtige Lösung, aber ich habe Ihren Test umgekehrt durchgeführt (z. B. while [1] auf der zweiten Shell) und er funktioniert einwandfrei. Um dies zu umgehen, können Sie sicherstellen, dass alle Shell-Puffer, die wahrscheinlich eine hohe Ausgabe erzeugen, später erstellt werden als diejenigen, bei denen Sie Interaktivität wünschen. Auf diese Weise werden die interaktiven Shells als erste von Emacs 'minderwertiger Umfrage behandelt, bevor sie schließlich diejenige verarbeiten, die viel Ausgabe generiert.
In der Praxis, wenn Sie eine Auswahl interaktiver Shell ausführen, werden Sie wahrscheinlich nicht in einer Situation sein, in der man die E / A so lange belastet. Wenn Sie so etwas regelmäßig benötigen, ist es möglicherweise eine bessere Lösung, die Ausgabe in eine Datei umzuleiten und den Ansichtsmodus zu verwenden.
quelle