【问题标题】:How to call the original function in a cl-letf overridden function?如何在 cl-letf 覆盖函数中调用原始函数?
【发布时间】: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


【解决方案1】:

我设法解决了这个问题。原来的函数值可以通过(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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-12
    • 2020-12-15
    • 2013-06-01
    • 2010-09-22
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    相关资源
    最近更新 更多