2009-05-19 88 views
6

我有一個Emacs的elisp腳本,我想在用戶點擊時進行一些清理工作Ctrl + G。我使用'閱讀事件'來捕捉所有事件,但這並不趕上Ctrl + G。當Ctrl + G被擊中時,它只是停止執行。如何攔截Emacs中的Ctrl-G

在XEmacs中,當你調用下一個命令事件,當用戶點擊按Ctrl +它會給你所有的活動,包括。 Emacs中必須有一些等價物。

回答

11

您可以使用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))))) 

注:與本地-quit返回最後一個表達式的值,或nil如果C-g被按下,所以一定要在沒有按下C-g返回的東西非空。我發現有關quitting的elisp文檔很有用。一個相關的領域是nonlocal exits,特別是unwind-protect,它不僅僅適用於退出。

+0

這解決了部分問題,但它並沒有吞下控制 - 只是讓你知道它發生了。如果你想防止control-g轉義塊,使用'inhibit-quit'和'quit-flag'變量。 – efunneko 2009-05-19 19:30:00

+1

這是可怕和脆弱的。我很確定,OP所需要的任何東西都可以通過`condition-case`或`unwind-protect`來更簡單,更健壯地解決。 – Stefan 2017-12-12 14:30:22

5

condition-caseunwind-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