如何在 cl-letf 重写函数中调用原始函数?

How to call the original function in a cl-letf overridden function?

在elisp中,cl-letf可以用来覆盖一个函数,有详细说明。

我想在覆盖函数中调用原始函数。我怎样才能做到这一点?

特别是,我想禁用 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,并检查提示是否以退出消息开头。如果是,我 return t。否则我想调用原始的 y-or-n-p 函数。

我设法解决了这个问题。原来的函数值可以通过(symbol-function 'y-or-n-p)查询出来,以后可以通过funcall这样调用:

(defun my-ediff-disable-quit-question (orig-fun &rest args)
  (cl-letf ((orig-y-or-n-p (symbol-function 'y-or-n-p))
            ((symbol-function 'y-or-n-p)
             (lambda (prompt) (if (string-prefix-p "Quit this Ediff session" prompt)
                                  t
                                (funcall orig-y-or-n-p prompt)))))
    (apply orig-fun args)))
(advice-add 'ediff-quit :around #'my-ediff-disable-quit-question)