OK, ich werde eine erweiterte Antwort versuchen. Die Sache ist, Emacs Lisp ist Single-Threaded. Sie können mehr Prozesse drehen, jedoch nicht im Emacs Lisp-Interpreter. Die Tastatureingaben, die Sie vom Benutzer lesen müssen, um Ihre Funktion zu unterbrechen, müssen jedoch von demselben Emacs Lisp-Interpreter verarbeitet werden. Dies bedeutet, dass Sie möglicherweise keine Möglichkeit haben, den Lisp-Code von innen heraus zu unterbrechen, wenn Ihr Interpreter beim Interpretieren eines Lisp-Codes nicht weiterkommt. Hier ist eine Stelle im Handbuch, die diese Situation beschreibt:
Auf der Ebene des C-Codes kann das Beenden nicht überall stattfinden. nur an den besonderen Stellen, die die Quit-Flag überprüfen. Der Grund dafür ist, dass das Beenden an anderen Orten zu einer Inkonsistenz im internen Zustand von Emacs führen kann. Da das Beenden bis zu einem sicheren Ort verzögert wird, kann das Beenden Emacs nicht zum Absturz bringen.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Quitting.html
Wie hat Emacs noch die C-gFunktion / Abbrechen? - Es gibt Timer und Funktionen, die E / A ausführen (auf Ereignisse in der Befehlsschleife warten). Timer können dafür sorgen, dass Ihre Berechnungen in Blöcken durchgeführt werden, sodass Sie Punkte in Ihren Berechnungen haben, an denen Sie sich umschauen und gegebenenfalls alle weiteren Berechnungen verhindern können. E / A-Funktionen können quit
Signale senden . Das Makro with-keyboard-quit
wartet auf dieses Signal und wird nach dem Empfang ordnungsgemäß beendet. Ihre Funktion muss jedoch wissen, um dieses Signal zu senden. Dies bedeutet, dass Sie nicht von Tastaturunterbrechungen profitieren können, wenn Ihre Funktion den Benutzer daran hindert, Tastatureingaben zu senden.
Fazit: Versuchen Sie, den Code Ihrer Funktion in zu verpacken while-no-input
. Wenn dies nicht funktioniert, schreiben Sie Ihre Funktion so um, dass Emacs Tastaturereignisse verarbeiten kann.
while-no-input
Makro ansehen . Es scheint zu tun, was Sie wollen: dh es bricht die Ausführung seines Körpers ab, wenn neue Eingaben erscheinen.