【发布时间】:2021-06-05 13:23:59
【问题描述】:
在 elisp 中,cl-letf 可以用来覆盖一个函数,this question 有它的详细信息。
我想在被覆盖的函数中调用原始函数。我怎样才能做到这一点?
特别是,我想禁用 ediff 的“你真的要退出吗?”消息,但仍保留其他 ediff 问题。这是我目前的解决方案:
(defun my-ediff-disable-quit-question (orig-fun &rest args)
(cl-letf (((symbol-function 'y-or-n-p)
(lambda (prompt) (if (string-prefix-p "Quit this Ediff session" prompt)
t
(<call-original-y-or-n-p> prompt)))))
(apply orig-fun args)))
(advice-add 'ediff-quit :around #'my-ediff-disable-quit-question)
如您所见,我覆盖y-or-n-p,并检查提示是否以退出消息开头。如果是,我返回t。否则我想调用原来的y-or-n-p函数。
【问题讨论】:
-
使用 Emacs-Lisp 建议。请参阅 Elisp 手册,节点 Advising Functions。
-
@Drew:我已经使用了建议,我只在 ediff 的退出函数中覆盖
y-or-n-p。当然,如果我建议y-or-n-p并检查提示,这个特殊问题可以解决。但是假设 ediff 只打印了“Quit?”。然后我不想检查这个字符串,因为它会禁用所有询问“退出?”的 y-or-n 问题,而不仅仅是 ediff 的问题。我也可以在提示之前添加一个建议,然后将其删除,但它很难看。这不是我第一次需要在被覆盖的函数中调用原始函数,所以如果我知道该怎么做就好了。
标签: emacs