OK, vou tentar uma resposta expandida. O problema é que o Emacs Lisp é de thread único. Você pode girar mais processos, mas não dentro do interpretador Emacs Lisp. No entanto, a entrada do teclado que você precisa ler do usuário para interromper sua função precisa ser processada pelo mesmo intérprete do Emacs Lisp. Isso significa que, se o seu intérprete estiver travado na interpretação de algum código Lisp, talvez não haja uma maneira de interrompê-lo por dentro. Aqui está um lugar no manual que descreve essa situação:
No nível do código C, desistir não pode acontecer em qualquer lugar; somente nos locais especiais que verificam a bandeira de abandono. A razão para isso é que parar em outros lugares pode deixar uma inconsistência no estado interno do Emacs. Como o encerramento é adiado até um local seguro, o encerramento não pode causar um crash no Emacs.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Quitting.html
Então, como o Emacs ainda tem a C-gfuncionalidade / canceling? - Existem timers e funções que executam E / S (aguardam eventos no loop de comando). Os temporizadores podem organizar seus cálculos em pedaços, para que você tenha pontos em seus cálculos em que possa olhar ao redor e, se necessário, impedir todos os cálculos adicionais. As funções de E / S podem enviar quit
sinal. A macro with-keyboard-quit
aguarda esse sinal e, uma vez recebido, sai normalmente. No entanto, sua função precisa saber para enviar este sinal. Isso significa que, se sua função impedir que o usuário envie entrada do teclado, você não poderá se beneficiar das interrupções do teclado.
Conclusão: tente agrupar o código da sua função while-no-input
. Se isso não funcionar, tente reescrever sua função de forma que o Emacs processe os eventos do teclado.
while-no-input
macro. Parece fazer o que você deseja: isto é, cancela a execução de seu corpo quando novas entradas são exibidas.