如何在Emacs中拦截Ctrl-G

如何在Emacs中拦截Ctrl-G,emacs,elisp,Emacs,Elisp,我有一个用于Emacs的elisp脚本,我想在用户点击Ctrl+G时对其进行一些清理。我使用“读取事件”捕捉所有事件,但这不会捕捉Ctrl+G。当点击Ctrl+G时,它只是停止执行 在XEmacs中,当您调用下一个命令事件时,它将为您提供所有事件,包括用户点击Ctrl+G时。Emacs中必须有一些等效项。您可以使用和local quit来确定是否按下了C-G: 已编辑的解决方案将根据建议退出 注意:with local quit返回最后一个表达式的值,如果按下C-g,则返回nil,因此当按下no

我有一个用于Emacs的elisp脚本,我想在用户点击Ctrl+G时对其进行一些清理。我使用“读取事件”捕捉所有事件,但这不会捕捉Ctrl+G。当点击Ctrl+G时,它只是停止执行


在XEmacs中,当您调用下一个命令事件时,它将为您提供所有事件,包括用户点击Ctrl+G时。Emacs中必须有一些等效项。

您可以使用
和local quit
来确定是否按下了
C-G

已编辑的解决方案将根据建议退出


注意:with local quit返回最后一个表达式的值,如果按下
C-g
,则返回
nil
,因此当按下no
C-g
时,请确保返回非nil的值。我发现elisp文档非常有用。一个相关的领域是,特别是,它不仅适用于退出。

条件案例
解除保护
在这里很有用<代码>条件案例允许您“捕获”异常,其中quit是其中之一:

(condition-case
    (while t) ; never terminates
  (quit (message "C-g was pressed")))
您还可以捕获其他错误,如“error”

放松保护
就像最后一样;它将执行“身体形态”,然后执行“放松形态”。但是,无论“主体窗体”是否成功运行,都会执行“展开窗体”:

(unwind-protect
    (while t)
  (message "Done with infinite loop"))

在您的情况下,您需要
展开保护。

这解决了部分问题,但它不会吞没控件-g-只是让您知道它发生了。如果您想阻止control-g从块中转义,请使用'inhibit quit'和'quit flag'变量。这既可怕又脆弱。我非常确信,OP想要的任何问题都可以通过
条件案例
放松保护
条件案例
在正文前需要一个“var”参数(至少在Emacs 24中)。我没有编辑您的答案,因为我不确定您要传递的值。(顺便说一句,谢谢你的回答!)
(unwind-protect
    (while t)
  (message "Done with infinite loop"))