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

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

Re: don't understand setq-default


From: Omar Polo
Subject: Re: don't understand setq-default
Date: Sun, 18 Apr 2021 16:59:38 +0200
User-agent: mu4e 1.4.15; emacs 28.0.50

Emanuel Berg via Users list for the GNU Emacs text editor 
<help-gnu-emacs@gnu.org> writes:

>>> OK, that explains it, buffer local values, I can't even
>>> keep track of the buffers...
>>
>> I have used it 8 times, maybe change to setq to force
>> everywhere...
>
> Worst thing that can happen, it will show, where I need even
> more force...
>
> Wait, I sense there is something wrong with this thinking...
>
> with setq, global var
>
> with setq-default default val for var if not buffer-local
>
> how do you look for the buffer-local var?
>
> I take it that takes precedence?
>
> yeah, it is the compass needle all over that acts on the
> GLOBAL Earth's magnet, only put the local magnet next to
> the compass, proximity overrules size
>
> you set the buffer-locals or they set themselves thru hooks
> or implications from setq "automatically when set"
>
> how do I know my globals - me thinking them are - aren't
> actually as they gets trapped in some Elisp file where
> I eval'd them which has nothing to do with it, even?
> Eval a config file for ERC, all that goes into the Elisp
> file LOL.
>
> How do you tell a var should be buffer-local when set? Nah,
> I don't want to know. They are not part of my strategy.
> But please tell my all buzzwords so I can go on pruning
> my Elisp, always a good feeling :)

[ keep in mind that I'm not really an expert elisp hacker ]

Try to keep it simple.  buffer-local variables sometimes are useful.
Let's take the indent-tabs-mode variable for instance: you set it to t
to enable hard tabs, or nil if you don't.  For some modes you may want
to use tabs (e.g. C, or Go), while for others spaces (may) be mandatory
(i.e. python), so a global variable won't do it  (you won't be able to
switch between C and python files without messing up the indentation :P)

Another example: I'm writing a chat application in elisp.  I have a,
say, toxe-friend-name that holds the name of the chat you've opened.
It's useful to keep this a buffer-local, so it gets a different value
per chat-buffer, and the elisp code is simple.

Sometimes this don't make sense: emacs-version probably doesn't need to
be buffer local, so judgement is needed.

C-h v tells you when a variable becomes buffer-local when set, or if
it's local to the current buffer, so you may want to check that.  It
even tells you its "default" and "local" value, which can get useful.

You get the buffer-local value when you're running a bit of elisp inside
that buffer.  (I don't know how to retrieve the global value, but a
short trip to the manual should tell me that)

So, for example:

        (defvar my-var 5)

        my-var
        ;; => 5

        (with-current-buffer (get-buffer-create "test")
          (message "my-var is %d" my-var)
          (make-local-variable 'my-var)
          (setq my-var 7)
          (message "my-var is %d" my-var)
          (setq-default my-var 'foo)
          (message "my-var is %d" my-var))
        ;; my-var is 5
        ;; my-var is 7
        ;; my-var is 7

        my-var
        ;; => foo

HTH



reply via email to

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