如何在 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)
在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)