[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
signature.asc
Description: Message signed with OpenPGP using GPGMail
- Help needed with defadvice, Perry Smith, 2013/11/21
- Re: Help needed with defadvice, Eric Abrahamsen, 2013/11/22
- Re: Help needed with defadvice, Alex Kost, 2013/11/22
- Re: Help needed with defadvice, Perry Smith, 2013/11/22
- Re: Help needed with defadvice, Alex Kost, 2013/11/22
- Re: Help needed with defadvice,
Perry Smith <=
- Re: Help needed with defadvice, Alex Kost, 2013/11/23
- Re: Help needed with defadvice, Stefan Monnier, 2013/11/23
- Re: Help needed with defadvice, Perry Smith, 2013/11/23
- Re: Help needed with defadvice, Stefan Monnier, 2013/11/23
- Re: Help needed with defadvice, Perry Smith, 2013/11/23
- Re: Help needed with defadvice, Stefan Monnier, 2013/11/24
- Re: Help needed with defadvice, Alex Kost, 2013/11/23
Message not available
Re: Help needed with defadvice, Stefan Monnier, 2013/11/22