help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

defadvice and called-interactively-p


From: Frank Fischer
Subject: defadvice and called-interactively-p
Date: Wed, 6 Jun 2012 07:03:04 +0000 (UTC)
User-agent: slrn/0.9.9p1 (Linux)

Hi,

I have a problem when advising a function/command that uses
`called-interactively-p' but I have not been able to find a solution.

Suppose you have a command calling `called-interactively-p'

(defun myfunc ()
  (interactive)
  (message "MYFUNC %s" (called-interactively-p 'any)))

Now, when executing M-x myfunc RET the message line shows "MYFUNC t"
as expected. But when that function is advised

(defadvice myfunc (around around-myfunc activate)
  ad-do-it)

executing M-x myfunc RET again shows "MYFUNC nil" this time. The
disassembled code of the advised function reads

0            constant  nil
1            varbind     ad-return-value
2            constant  ad-Orig-myfunc
3            call        0
4            dup
5            varset       ad-return-value
6            unbind         1
7            return

If I interpret that code correctly (I'm not sure) then the original
definition of `myfunc' is called in line 3 using something similar to
(funcall 'ad-Orig-myfunc) where `ad-Orig-myfunc' is the renamed
original function. This would explain (IMO) why
`called-interactivly-p' returns nil -- the original body has *not*
been called interactively but using a usual non-interactive function
call.

But of course, if the (interactive) behavior of `myfunc' depends on
the return value of `called-interactively-p' this would make the
advised function unusable in interactive calls.

Is there some way to make `called-interactively-p' behave "correctly"
in the advised body?

Thanks is advance,
Frank





reply via email to

[Prev in Thread] Current Thread [Next in Thread]