From: Perry Smith <pedzsan@gmail.com>
To: Alex Kost <alezost@gmail.com>
Cc: "help-gnu-emacs@gnu.org Help" <help-gnu-emacs@gnu.org>
Subject: Re: Help needed with defadvice
Date: Fri, 22 Nov 2013 19:41:29 -0600 [thread overview]
Message-ID: <FD742D45-BCB4-48BD-A915-C152D2089A6D@gmail.com> (raw)
In-Reply-To: <87y54g5cd6.fsf@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 3955 bytes --]
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 #2: Message signed with OpenPGP using GPGMail --]
[-- Type: application/pgp-signature, Size: 495 bytes --]
next prev parent reply other threads:[~2013-11-23 1:41 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-22 2:45 Help needed with defadvice Perry Smith
2013-11-22 6:27 ` Eric Abrahamsen
2013-11-22 7:09 ` Alex Kost
2013-11-22 15:50 ` Perry Smith
2013-11-22 21:56 ` Alex Kost
2013-11-23 1:41 ` Perry Smith [this message]
2013-11-23 7:00 ` Alex Kost
2013-11-23 14:48 ` Stefan Monnier
2013-11-23 15:22 ` Perry Smith
2013-11-23 15:38 ` Stefan Monnier
2013-11-23 16:24 ` Perry Smith
2013-11-24 18:21 ` Stefan Monnier
2013-11-23 15:43 ` Alex Kost
[not found] ` <mailman.6834.1385135422.10748.help-gnu-emacs@gnu.org>
2013-11-23 8:35 ` jack-mac
2013-11-22 14:44 ` Stefan Monnier
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=FD742D45-BCB4-48BD-A915-C152D2089A6D@gmail.com \
--to=pedzsan@gmail.com \
--cc=alezost@gmail.com \
--cc=help-gnu-emacs@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.