unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
* How do I initialize globalized minor mode only once?
@ 2012-07-11  2:54 Dmitry Gutov
  0 siblings, 0 replies; 5+ messages in thread
From: Dmitry Gutov @ 2012-07-11  2:54 UTC (permalink / raw)
  To: help-gnu-emacs

Hi all,

I have written a globalized minor mode which has a relatively costly
initialization (external process call), which I need to do when the mode
is enabled.

But the turn-on function is getting called twice for each new opened
buffer, once in default major mode, and once in the final major mode.

What's the best way to turn on the minor mode only once?
Currently I'm comparing major-mode value to the default value, but
that's probably not the best solution, since the minor mode in question
can apply to some fundamental-mode (or other default mode) buffers, too.

Regards,
--Dmitry




^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: How do I initialize globalized minor mode only once?
       [not found] <mailman.4534.1341975266.855.help-gnu-emacs@gnu.org>
@ 2012-07-11  3:20 ` Barry Margolin
  2012-07-11  3:47   ` Dmitry Gutov
       [not found]   ` <mailman.4537.1341978452.855.help-gnu-emacs@gnu.org>
  0 siblings, 2 replies; 5+ messages in thread
From: Barry Margolin @ 2012-07-11  3:20 UTC (permalink / raw)
  To: help-gnu-emacs

In article <mailman.4534.1341975266.855.help-gnu-emacs@gnu.org>,
 Dmitry Gutov <dgutov@yandex.ru> wrote:

> Hi all,
> 
> I have written a globalized minor mode which has a relatively costly
> initialization (external process call), which I need to do when the mode
> is enabled.
> 
> But the turn-on function is getting called twice for each new opened
> buffer, once in default major mode, and once in the final major mode.
> 
> What's the best way to turn on the minor mode only once?
> Currently I'm comparing major-mode value to the default value, but
> that's probably not the best solution, since the minor mode in question
> can apply to some fundamental-mode (or other default mode) buffers, too.

Why not just set a variable saying whether you've done the 
initialization:

(defvar *my-mode-initialized* nil)
...

  (if (not *my-mode-initialized*)
      (progn
        ... 
        (setq *my-mode-initialized* t)))

-- 
Barry Margolin, barmar@alum.mit.edu
Arlington, MA
*** PLEASE post questions in newsgroups, not directly to me ***


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: How do I initialize globalized minor mode only once?
  2012-07-11  3:20 ` How do I initialize globalized minor mode only once? Barry Margolin
@ 2012-07-11  3:47   ` Dmitry Gutov
       [not found]   ` <mailman.4537.1341978452.855.help-gnu-emacs@gnu.org>
  1 sibling, 0 replies; 5+ messages in thread
From: Dmitry Gutov @ 2012-07-11  3:47 UTC (permalink / raw)
  To: help-gnu-emacs

Barry Margolin <barmar@alum.mit.edu> writes:

> In article <mailman.4534.1341975266.855.help-gnu-emacs@gnu.org>,
>  Dmitry Gutov <dgutov@yandex.ru> wrote:
>
>> Hi all,
>> 
>> I have written a globalized minor mode which has a relatively costly
>> initialization (external process call), which I need to do when the mode
>> is enabled.
>> 
>> But the turn-on function is getting called twice for each new opened
>> buffer, once in default major mode, and once in the final major mode.
>> 
>> What's the best way to turn on the minor mode only once?
>> Currently I'm comparing major-mode value to the default value, but
>> that's probably not the best solution, since the minor mode in question
>> can apply to some fundamental-mode (or other default mode) buffers, too.
>
> Why not just set a variable saying whether you've done the 
> initialization:
>
> (defvar *my-mode-initialized* nil)
> ...
>
>   (if (not *my-mode-initialized*)
>       (progn
>         ... 
>         (setq *my-mode-initialized* t)))

My first reaction was "because major mode change kills all local variables",
but that's not exactly true - with enough sprinkling of 'permanent-local
and 'permanent-local-hook properties, this might work.

But what if the user tries to turn off and on the minor mode, or the
global mode, or both? I'd want the initialization performed in these
cases. When or where would I set the variable to nil?




^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: How do I initialize globalized minor mode only once?
       [not found]   ` <mailman.4537.1341978452.855.help-gnu-emacs@gnu.org>
@ 2012-07-11 13:47     ` Barry Margolin
  2012-07-11 14:57       ` Dmitry Gutov
  0 siblings, 1 reply; 5+ messages in thread
From: Barry Margolin @ 2012-07-11 13:47 UTC (permalink / raw)
  To: help-gnu-emacs

In article <mailman.4537.1341978452.855.help-gnu-emacs@gnu.org>,
 Dmitry Gutov <dgutov@yandex.ru> wrote:

> Barry Margolin <barmar@alum.mit.edu> writes:
> 
> > In article <mailman.4534.1341975266.855.help-gnu-emacs@gnu.org>,
> >  Dmitry Gutov <dgutov@yandex.ru> wrote:
> >
> >> Hi all,
> >> 
> >> I have written a globalized minor mode which has a relatively costly
> >> initialization (external process call), which I need to do when the mode
> >> is enabled.
> >> 
> >> But the turn-on function is getting called twice for each new opened
> >> buffer, once in default major mode, and once in the final major mode.
> >> 
> >> What's the best way to turn on the minor mode only once?
> >> Currently I'm comparing major-mode value to the default value, but
> >> that's probably not the best solution, since the minor mode in question
> >> can apply to some fundamental-mode (or other default mode) buffers, too.
> >
> > Why not just set a variable saying whether you've done the 
> > initialization:
> >
> > (defvar *my-mode-initialized* nil)
> > ...
> >
> >   (if (not *my-mode-initialized*)
> >       (progn
> >         ... 
> >         (setq *my-mode-initialized* t)))
> 
> My first reaction was "because major mode change kills all local variables",
> but that's not exactly true - with enough sprinkling of 'permanent-local
> and 'permanent-local-hook properties, this might work.

If this is a global minor mode, why would you use a local variable?

> 
> But what if the user tries to turn off and on the minor mode, or the
> global mode, or both? I'd want the initialization performed in these
> cases. When or where would I set the variable to nil?

In the turn-off function.

-- 
Barry Margolin, barmar@alum.mit.edu
Arlington, MA
*** PLEASE post questions in newsgroups, not directly to me ***


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: How do I initialize globalized minor mode only once?
  2012-07-11 13:47     ` Barry Margolin
@ 2012-07-11 14:57       ` Dmitry Gutov
  0 siblings, 0 replies; 5+ messages in thread
From: Dmitry Gutov @ 2012-07-11 14:57 UTC (permalink / raw)
  To: help-gnu-emacs

Barry Margolin <barmar@alum.mit.edu> writes:

> In article <mailman.4537.1341978452.855.help-gnu-emacs@gnu.org>,
>> >> I have written a globalized minor mode which has a relatively costly
>> >> initialization (external process call), which I need to do when the mode
>> >> is enabled.
>> >> 
>> >> But the turn-on function is getting called twice for each new opened
>> >> buffer, once in default major mode, and once in the final major mode.
>> >> 
>> >> What's the best way to turn on the minor mode only once?
>> >> Currently I'm comparing major-mode value to the default value, but
>> >> that's probably not the best solution, since the minor mode in question
>> >> can apply to some fundamental-mode (or other default mode) buffers, too.
>> >
>> > Why not just set a variable saying whether you've done the 
>> > initialization:
>> >
>> > (defvar *my-mode-initialized* nil)
>> > ...
>> >
>> >   (if (not *my-mode-initialized*)
>> >       (progn
>> >         ... 
>> >         (setq *my-mode-initialized* t)))
>> 
>> My first reaction was "because major mode change kills all local variables",
>> but that's not exactly true - with enough sprinkling of 'permanent-local
>> and 'permanent-local-hook properties, this might work.
>
> If this is a global minor mode, why would you use a local variable?

The global mode has a corresponding local minor mode which needs to be
initialized in each buffer it applies to. That's the initialization I
was referring to.

See `define-globalized-minor-mode'.

>> But what if the user tries to turn off and on the minor mode, or the
>> global mode, or both? I'd want the initialization performed in these
>> cases. When or where would I set the variable to nil?
>
> In the turn-off function.

There is no such function.




^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2012-07-11 14:57 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <mailman.4534.1341975266.855.help-gnu-emacs@gnu.org>
2012-07-11  3:20 ` How do I initialize globalized minor mode only once? Barry Margolin
2012-07-11  3:47   ` Dmitry Gutov
     [not found]   ` <mailman.4537.1341978452.855.help-gnu-emacs@gnu.org>
2012-07-11 13:47     ` Barry Margolin
2012-07-11 14:57       ` Dmitry Gutov
2012-07-11  2:54 Dmitry Gutov

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