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

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

Re: Help needed with defadvice


From: Perry Smith
Subject: Re: Help needed with defadvice
Date: Fri, 22 Nov 2013 19:41:29 -0600

On Nov 22, 2013, at 3:56 PM, Alex Kost <alezost@gmail.com> wrote:

> Perry Smith (2013-11-22 19:50 +0400) wrote:
> 
>> On Nov 22, 2013, at 1:09 AM, Alex Kost <alezost@gmail.com> wrote:
>> 
>>> Perry Smith (2013-11-22 06:45 +0400) wrote:
>>> 
>>>> I have this defadvice:
>>>> 
>>>> (defadvice get-buffer-create (around inherit activate)
>>>> (let ((set-list (mapcar '(lambda ( v )
>>>>                         (cons v (symbol-value v)))
>>>>                      inherited-alist)))
>>>>   (with-current-buffer ad-do-it 
>>>>     (mapcar '(lambda ( c )
>>>>             (message "Setting %s to %s inside %s"
>>>>                      (car c) (cdr c) (buffer-name (current-buffer)))
>>>>             (set (car c) (cdr c)))
>>>>          set-list))))
>>>> 
>>>> inherited-alist is a list of symbols that I add to.  When a buffer is 
>>>> created, I run through the list of variables and get their values as seen 
>>>> from the current buffer.  I then call get-buffer-create (via ad-do-it) and 
>>>> do a set on each of the variables.  The "message" is there just for 
>>>> debugging.  I get the messages like I expect .... e.g. "Setting foo to dog 
>>>> inside cat.c" or whatever.  All the symbols in inherited-alist are 
>>>> buffer-local variables.
>> 
>> To Eric: changing let to let* had not effect.
>> 
>>> 
>>> 1. With `set' you set a global value, you probably want
>>> (set (make-local-variable (car c)) (cdr c)) instead of
>>> (set (car c) (cdr c)).
>> 
>> No change.  If this helps, when I do ^h-v cscope-out-buffer I get:
>> 
>> cscope-out-buffer is a variable defined in `cscope.el'.
>> Its value is "banana"
>> 
>>  Automatically becomes buffer-local when set.
>> 
>> Documentation:
>> Buffer associated with the cscope process
>> 
>> "banana" is the global I set with:
>> (set-default 'cscope-out-buffer "banana") in *scratch*
>> 
>> I'm coming to the conclusion that something after get-buffer-create
>> is blasting the local variables back to their defaults.  (By the
>> way, I have added another message after the set and it
>> shows that it is being set.  I've also explicitly set one of these
>> variables outside of the let and it is still not being set.
> 
> It looks like something interferes, because your initial advice works
> for buffer-local variables.
> 
> Steps to reproduce:
> 
> 1. emacs -q
> 2. Insert this into *scratch* buffer and eval it:
> 
> (defvar inherited-alist '(v1))
> (defvar v1 nil)
> (make-variable-buffer-local 'v1)
> (set 'v1 123)
> 
> (defadvice get-buffer-create (around inherit activate)
>  (let ((set-list (mapcar '(lambda ( v )
>                            (cons v (symbol-value v)))
>                         inherited-alist)))
>    (with-current-buffer ad-do-it 
>      (mapcar '(lambda ( c )
>                ;; (message "Setting %s to %s inside %s"
>                ;;          (car c) (cdr c) (buffer-name (current-buffer)))
>                (set (car c) (cdr c)))
>             set-list))))
> 
> After evaluating you get `v1' variable with nil as global value and 123
> as local value in *scratch* buffer.
> 
> 3. Create new buffer with "C-x b" and the local value of v1 will be 123
> there.
> 
> 4. Switch to a buffer where v1 is nil (for example with "C-h e") and
> create new buffer again.  And it will inherit nil for v1.

Thanks... I attacked this from the opposite direction adding debug trying to 
narrow down when the locals got killed.  I finally bumped into these lines:

(defmacro define-derived-mode (child parent name &optional docstring &rest body)
...
         (interactive)
                                        ; Run the parent.
         (delay-mode-hooks

          (,(or parent 'kill-all-local-variables))   <<<<<<<<<
                                        ; Identify the child mode.
          (setq major-mode (quote ,child))
          (setq mode-name ,name)
...)

I'm going to drive home and play with this some more but I predict that that is 
what is killing my local variables.

Does anyone know why this is there?

I somewhat assumed I had this in some of my poop but this is stock emacs code 
(24.3).

Thank you to all for their time and patience...
Perry

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail


reply via email to

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