わかりました、私は拡張された答えを試します。実は、Emacs Lispはシングルスレッドです。さらに多くのプロセスをスピンできますが、Emacs Lispインタープリター内ではできません。ただし、関数を中断するためにユーザーから読み取る必要があるキーボード入力は、同じEmacs Lispインタープリターで処理する必要があります。これはあなたのインタプリタがいくつかのLispコードを解釈するのに行き詰まっている場合、あなたが内部からそれを中断する方法がないかもしれないことを意味します。この状況を説明するマニュアル内の場所は次のとおりです。
Cコードのレベルでは、終了はどこでも起こり得ません。終了フラグをチェックする特別な場所でのみ。これは、他の場所で終了するとEmacsの内部状態に矛盾が残る可能性があるためです。終了は安全な場所まで遅延されるため、終了してもEmacsがクラッシュすることはありません。
https://www.gnu.org/software/emacs/manual/html_node/elisp/Quitting.html
では、EmacsにはどのようにC-g/キャンセル機能がありますか?-I / O(コマンドループでイベントを待機)を行うタイマーと関数があります。タイマーは、計算がチャンクで実行されるように調整できます。これにより、計算のポイントを確認し、必要に応じて、それ以上の計算をすべて防ぐことができます。I / O関数はquit
信号を送信できます。マクロwith-keyboard-quit
はこのシグナルを待ち、受信されると正常に終了します。ただし、関数はこの信号を送信することを知っている必要があります。これは、関数がユーザーによるキーボード入力の送信を妨げている場合、キーボード割り込みの恩恵を受けることができないことを意味します。
結論:関数のコードをにラップしてみてくださいwhile-no-input
。これが機能しない場合は、Emacsがキーボードイベントを処理できるように関数を書き直してみてください。
while-no-input
マクロを見たいかもしれません。それはあなたが望むことをするようです:すなわち、それは新しい入力が現れたときにその本体の実行をキャンセルします。