如何在Emacs中拦截Ctrl-G

时间:2009-05-19 19:08:03

标签: emacs elisp

我有一个Emacs的elisp脚本,如果用户点击 Ctrl + G ,我想要清理一下。我使用'read-event'来捕获所有事件,但这不会捕获 Ctrl + G 。当点击 Ctrl + G 时,它就会停止执行。

在XEmacs中,当你调用next-command-event时,它将为你提供所有事件,包括当用户点击 Ctrl + G 时。在Emacs中必须有一些等价物。

2 个答案:

答案 0 :(得分:14)

您可以使用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则返回C-g,所以一定要返回非零值没有C-g被按下。我发现quitting上的elisp文档非常有用。相关区域为nonlocal exits,具体为unwind-protect,不仅适用于退出。

答案 1 :(得分:6)

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