4

I sometimes want to bypass the advice I have defined on some function. Something like:

(call-without-advice #'fn ...)
Drew
  • 75,699
  • 9
  • 109
  • 225
HappyFace
  • 751
  • 4
  • 16
  • I don’t think it’s possible, but just for clarity what are the circumstances in which you want to call the original function only? – db48x Jul 19 '23 at 00:32
  • https://emacs.stackexchange.com/tags/elisp/info – Drew Jul 19 '23 at 14:29
  • Temporarily remove it, after saving it, then restore it. [This page](https://www.emacswiki.org/emacs/DynamicIsearchFiltering) and the code it describes might help a bit. – Drew Jul 19 '23 at 14:31

2 Answers2

6

I've thought about this before, and there's a less-than-perfect solution:
you need to store the original definition before any advice-adding.

(defun f ()
  (insert "233\n"))

(setq f.backup (symbol-function 'f))

(advice-add 'f :around
            (lambda (fobj &rest args)
              (insert (format "eq?: %s\n"
                              (eq f.backup fobj)))
              (apply fobj args)))

It is also convenient to store the definition in symbol-plist.


Update
(advice-add 'advice-add :before
            (lambda (symbol &rest _)
              (unless (get symbol :shynur/original-definition)
                (put symbol :shynur/original-definition
                     (symbol-function symbol)))))

(defun call-without-advice (symbol &rest arguments)
  (apply (or (get symbol :shynur/original-definition)
             symbol)
         arguments))

looks much better now.

shynur
  • 4,065
  • 1
  • 3
  • 23
3

I can't find a public interface for that. In Emacs 25.5 and Emacs 27.1 and presumably every version in between (I haven't checked older or more recent versions), for new-style advice (define-advice, advice-xxx from nadvice.el), you can use

(advice--cd*r (symbol-function #'fn))

For old-style advice (defadvice, ad-xxx from advice.el):

(ad-get-orig-definition #'fn)