Von Zeit zu Zeit stelle ich fest, M-! some_command
dass der Befehl länger ausgeführt wird als erwartet und meine Emacs für lange Sekunden eingefroren sind. Also glasiere ich meinen gefrorenen Emac und trete mich dafür, dass ich ihn nicht benutzt habe M-& some_command
und verspreche mir, ihn das M-&
nächste Mal zu benutzen . Aber es M-!
ist seit Jahrzehnten in meinem Muskelgedächtnis… Und natürlich gibt es Ctrl-G
, aber es gibt Fälle, in denen ein Abbruch des Befehls und ein erneutes Ausführen nicht vorzuziehen sind (möglicherweise kann es etw zerbrechen, möglicherweise wäre es kostspielig, es erneut auszuführen…).
Ein ähnlicher Fehler in der Shell-Konsole ist trivial zu korrigieren Ctrl-Z
, bg
und der Job wird im Hintergrund ausgeführt.
Gibt es einen ähnlichen Trick in Emacs - eine Möglichkeit, den aktuell ausgeführten Vordergrundbefehl (synchron) in einen Hintergrundbefehl (asynchron) umzuwandeln?
Hinweis: Für den Fall, dass es standardmäßig nicht möglich ist M-!
, bin ich offen für Vorschläge, wie Sie M-!
sich an etwas anderes binden können (was ohne diesen Trick funktionell äquivalent wäre).
&
an das Ende eines regularshell-command
(M-!
) asynchron macht. Natürlich müssen Sie dies tun, bevor Sie einen Befehl ausführen, aber Sie können zumindest die gleiche Tastenkombination verwenden.M-!
zuasync-shell-command
. :-) Das Einzige, was Sie verlieren, ist die Ausgabe im Echo-Bereich, wenn es kurz genug ist.async-shell-command
. Es fügt&
am Ende derCOMMAND
Zeichenfolge ein hinzu und wird ausgeführtshell-command
.Antworten:
Ich vermute, dass es keinen solchen Trick gibt. Das Problem ist, dass der synchrone Shell-Befehl (der wirklich ist
call-process-region
) die Ereignisschleife von emacs blockiert. Die einzige Möglichkeit, dies zu unterbrechen, besteht darin, den Prozess mit einem USR1- oder USR2-Signal abzubrechen oder zu beenden C-g. (Es kann andere Wege geben, aber das ist was ich tue).Dies bedeutet, dass Sie nichts tun können, da Sie den Trick nicht aufrufen können, da Emacs keine Eingaben verarbeitet, während die Ereignisschleife blockiert ist.
Eine Sache, die Sie tun können , ist einfach die Schlüssel zu tauschen:
quelle