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

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

Re: defadvice and called-interactively-p


From: Eric Abrahamsen
Subject: Re: defadvice and called-interactively-p
Date: Wed, 06 Jun 2012 15:26:44 +0800
User-agent: Gnus/5.130006 (Ma Gnus v0.6) Emacs/24.1.50 (gnu/linux)

On Wed, Jun 06 2012, Frank Fischer wrote:

> 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)

While you're waiting for an answer from someone who really understand
how all this works, I've found that I need to add an (interactive)
statement to the defadvice form as well, in order to preserve
interactive state. Give it a shot, anyway!

Eric

> 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
>
>
>
>

-- 
GNU Emacs 24.1.50.1 (i686-pc-linux-gnu, GTK+ Version 2.24.10)
 of 2012-06-06 on pellet




reply via email to

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