OK, intentaré una respuesta ampliada. La cuestión es que Emacs Lisp es de un solo subproceso. Puede girar más procesos, pero no dentro del intérprete de Emacs Lisp. Sin embargo, la entrada de teclado que necesita leer del usuario para interrumpir su función debe ser procesada por el mismo intérprete de Emacs Lisp. Esto significa que si su intérprete está atascado interpretando algún código Lisp, puede que no haya una forma de interrumpirlo desde dentro. Aquí hay un lugar en el manual que describe esta situación:
En el nivel del código C, dejar de fumar no puede ocurrir en cualquier lugar; solo en los lugares especiales que marcan dejar de fumar. La razón de esto es que dejar de fumar en otros lugares puede dejar una inconsistencia en el estado interno de Emacs. Debido a que dejar de fumar se retrasa hasta un lugar seguro, no puede hacer que Emacs se bloquee.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Quitting.html
Entonces, ¿cómo Emacs todavía tiene la C-gfuncionalidad / cancelación? - Hay temporizadores y funciones que hacen E / S (esperar eventos en el bucle de comandos). Los temporizadores pueden organizar que sus cálculos se realicen en fragmentos, de modo que tenga puntos en sus cálculos donde pueda mirar a su alrededor y, si es necesario, evitar todos los cálculos adicionales. Las funciones de E / S pueden enviar quit
señal. La macro with-keyboard-quit
espera esta señal y una vez recibida saldrá con gracia. Sin embargo, su función necesita saber para enviar esta señal. Esto significa que si su función impide que el usuario envíe la entrada del teclado, no podrá beneficiarse de las interrupciones del teclado.
En pocas palabras: intente envolver el código de su función while-no-input
. Si esto no funciona, intente reescribir su función de manera que permita que Emacs procese los eventos del teclado.
while-no-input
macro. Parece hacer lo que quiere: es decir, cancela la ejecución de su cuerpo cuando aparece una nueva entrada.