Ctrlユーザーが+を押した場合にクリーンアップを行いたい Emacs 用の elisp スクリプトがありますG。Ctrl「read-event」を使用してすべてのイベントをキャッチしますが、これは+をキャッチしませんG。Ctrl+がヒットするGと、実行が停止します。
CtrlXEmacs では、next-command-event を呼び出すと、ユーザーが+を押したときを含むすべてのイベントが表示されますG。Emacs には相当するものがあるはずです。
が押されwith-local-quit
たかどうかを判断するために使用できます。C-g
efunnekoによって提案された終了を飲み込むための編集されたソリューション。
(defun my-c-g-test ()
"test catching control-g"
(interactive)
(let ((inhibit-quit t))
(unless (with-local-quit
(y-or-n-p "arg you gonna type C-g?")
t)
(progn
(message "you hit C-g")
(setq quit-flag nil)))))
注: with-local-quit は、最後の式の値を返すか、または押されたnil
場合に、noが押されたC-g
ときに非 nil を返すようにしてください。終了C-g
に関する elisp のドキュメントが役に立ちました。関連する領域は、非ローカル出口であり、具体的には、単なる終了以上のものに適用されます。unwind-protect
condition-case
ここでunwind-protect
役に立ちます。 condition-case
「例外」を「キャッチ」できます。その中の1つは終了です。
(condition-case
(while t) ; never terminates
(quit (message "C-g was pressed")))
「エラー」などの他のエラーをキャッチすることもできます。
unwind-protect
ついにのようです。「ボディフォーム」を実行してから「アンワインドフォーム」を実行します。ただし、「ボディフォーム」が正常に実行されたかどうかに関係なく、「アンワインドフォーム」は実行されます。
(unwind-protect
(while t)
(message "Done with infinite loop"))
あなたunwind-protect
はあなたの場合に欲しい。