unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
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 --]

  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

  List information: https://www.gnu.org/software/emacs/

* 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.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).