我有一個Emacs的elisp腳本,我想在用戶點擊時進行一些清理工作Ctrl + G。我使用'閱讀事件'來捕捉所有事件,但這並不趕上Ctrl + G。當Ctrl + G被擊中時,它只是停止執行。如何攔截Emacs中的Ctrl-G
在XEmacs中,當你調用下一個命令事件,當用戶點擊按Ctrl +摹它會給你所有的活動,包括。 Emacs中必須有一些等價物。
我有一個Emacs的elisp腳本,我想在用戶點擊時進行一些清理工作Ctrl + G。我使用'閱讀事件'來捕捉所有事件,但這並不趕上Ctrl + G。當Ctrl + G被擊中時,它只是停止執行。如何攔截Emacs中的Ctrl-G
在XEmacs中,當你調用下一個命令事件,當用戶點擊按Ctrl +摹它會給你所有的活動,包括。 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)))))
注:與本地-quit返回最後一個表達式的值,或nil
如果C-g
被按下,所以一定要在沒有按下C-g
返回的東西非空。我發現有關quitting的elisp文檔很有用。一個相關的領域是nonlocal exits,特別是unwind-protect
,它不僅僅適用於退出。
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
。
這解決了部分問題,但它並沒有吞下控制 - 只是讓你知道它發生了。如果你想防止control-g轉義塊,使用'inhibit-quit'和'quit-flag'變量。 – efunneko 2009-05-19 19:30:00
這是可怕和脆弱的。我很確定,OP所需要的任何東西都可以通過`condition-case`或`unwind-protect`來更簡單,更健壯地解決。 – Stefan 2017-12-12 14:30:22