10

Ctrlユーザーが+を押した場合にクリーンアップを行いたい Emacs 用の elisp スクリプトがありますGCtrl「read-event」を使用してすべてのイベントをキャッチしますが、これは+をキャッチしませんGCtrl+がヒットするGと、実行が停止します。

CtrlXEmacs では、next-command-event を呼び出すと、ユーザーが+を押したときを含むすべてのイベントが表示されますG。Emacs には相当するものがあるはずです。

4

2 に答える 2

15

が押され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

于 2009-05-19T19:17:27.397 に答える
8

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はあなたの場合に欲しい。

于 2009-07-09T08:44:20.520 に答える