2009-05-19 3 views
6

Emacs用のelispスクリプトを用意しています。ユーザーがヒットした場合には、いくつかのクリーンアップを行います。Ctrl + G私はすべてのイベントをキャッチするために 'read-event'を使用しますが、これはCtrl + Gをキャッチしません。 Ctrl + Gがヒットした場合、実行を停止するだけです。 XEmacsのでどうすればEmacsのCtrl-Gを傍受するのですか

、あなたは次のコマンドイベントを呼び出すとき、それはあなたのユーザーがGはCtrl + に当たったときなど、すべてのイベントを提供します。 Emacsには同等のものがなければなりません。

答えて

11

あなたはC-gが押されたかどうかを判断するためにwith-local-quitを使用することができます。

編集ソリューションを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))))) 

注:でローカル・終了リターン最後の式の値、またはnilC-gが押された場合、その一切C-gが押されていないときに何か非nilを返すようにしてください。私はquitting上のelispドキュメントを見つけました。関連する領域はnonlocal exitsであり、具体的にはunwind-protectです。これは単に終了する以上のものに適用されます。

+0

これは問題の一部を解決しますが、制御器を飲み込むことはありません。問題が発生したことを知らせるだけです。コントロール-gがブロックをエスケープしないようにするには、 'inhibit-quit'と 'quit-flag'変数を使用します。 – efunneko

+1

これは恐ろしく脆いです。私はOPが望んでいるものはどれも、「条件ケース」または「巻き戻し保護」のいずれかにより、より単純かつ堅牢に解決できると確信しています。 – Stefan

5

condition-caseおよびunwind-protectが役に立ちます。 「エラー:condition-caseは、「あなたはまた、他のエラーをキャッチすることができます

(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をしたいです。

+1

'condition-case'は、本体の前に" var "引数を必要とします(少なくともEmacs 24では)。私はあなたの答えを編集しませんでしたが、私はあなたがそこを通過することを意味する価値があるか分かりません。 (回答ありがとう!) – Dogbert

関連する問題