emacs-devel
[Top][All Lists]
Advanced

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

Re: [PATCH] cc-mode: don't tread dir-local and file-local variables diff


From: Michał Nazarewicz
Subject: Re: [PATCH] cc-mode: don't tread dir-local and file-local variables differently
Date: Mon, 25 May 2020 20:47:06 +0100

It’s clear that we won’t reach any kind of agreement any time soon, so
let me loop in emacs-devel in hope of looping more people in and
reaching some kind of consensus.

For those not subscribed to cc-mode-help, the thread can be followed
from the start at [1].

[1] 
https://sourceforge.net/p/cc-mode/mailman/cc-mode-help/thread/20200512194516.83180-1-mina86%40mina86.com/#msg37011452

To quickly recap, CC Mode treats ‘c-file-style’ differently depending on
whether it comes from .dir-locals.el or a file-local variable.  For
example, having the following in init.el:

    (setq-default 'c-basic-offset 4)

consider the following two scenarios:

1) /tmp/foo/.dir-locals.el exists and contains a single line:

       ((nil . ((c-file-style . "bsd"))))

   Opening an empty /tmp/foo/foo.c file results in ‘c-basic-offset’
   being four and ‘c-file-style’ being "bsd".

2) /tmp/bar/.dir-locals.el does not exist but /tmp/bar/bar.c does and
   contains a single line:

       /* -*- c-file-style: "bsd" -*- */

   Opening that file results in ‘c-basic-offset’ being eight and
   ‘c-file-style’ being "bsd".  (Value of eight for the offset comes
   from "bsd" style).

I maintain that in both cases ‘c-basic-offset’ should be the same.
I further maintain that its value should be eight.  Alan disagrees and
maintains that cc-mode-hook should overwrite settings in dir-local
variables but should be overwritten by settings in file-local variables.

> On Sun, May 24, 2020 at 22:08:36 +0100, Michał Nazarewicz wrote:
> > > On Sun, May 17, 2020 at 12:56:12 +0100, Michał Nazarewicz wrote:
> > >> That’s not what Emacs documentation says though.  From [1]:
>
> > >>>>> Whenever Emacs visits any file in that directory or any of its
> > >>>>> subdirectories, it will apply the directory-local variables
> > >>>>> specified in .dir-locals.el, as though they had been defined as
> > >>>>> file-local variables for that file (see File Variables).
>
> > >> [1] 
> > >> https://www.gnu.org/software/emacs/manual/html_node/emacs/Directory-Variables.html
>
> > It’s also sensible that file-local variables take precedence over
> > dir-local variables.  And no one would be surprised by that.

On Mon, 25 May 2020 at 19:44, Alan Mackenzie <address@hidden> wrote:
> Just as it is sensible that a hook setting takes precedence over a
> dir-local setting.

No, it doesn’t.  dir-local and file-local configuration is both located
closer to the file being open than settings specified in a hook.  Values
in a hook apply to anything user opens anywhere.  dir-local and
file-local variables are narrower in scope and thus should have higher
priority.

> > What is surprising though is that there is something in-between those
> > two levels because there’s never any indication of that.

> There's thousands of things about Emacs which aren't discussed on that
> page.  The workings of hook functions is just one of them.  Who wants to
> read a page stuffed full of boring barely relevant technicalities?

It’s highly relevant that c-file-style variable behave completely
different whether it’s dir-local or file-local.

> > On Sun, 17 May 2020 at 15:23, Alan Mackenzie <address@hidden> wrote:
> > >> That is, directory-local should behave ‘as though they had been’
> > >> file-local.
>
> > > No.  That just says they will be _applied_ as though they were file
> > > local.  And CC Mode currently does this.
>
> > CC Mode treats values from dir-local variables and file-local variables
> > differently.
>
> Only to the extent they are different.  As discussed above it is
> impossible to treat them the same, in particular when there are
> competing values for any configuration option.
>
> > It applies them the same way only in the sense that the ‘c-file-style’
> > symbol will be bound to the same value, however CC Mode won’t treat
> > that value the same.
>
> > You cannot say that CC Mode applies values of dir-local as though they
> > had been file-local if CC Mode explicitly differentiate its behaviour
> > based on where the value came from.
>
> I can, and I do.  Regardless of where the value comes from (there are
> about nine places) it is treated the same.

No, it is not.  If ‘c-file-style’ value comes from file-local variable
it is applied to the buffer in one way.  If ‘c-file-style’ value comes
from dir-local variable it’s applied in a different way.

> Only when there are competing values from different places does it get
> complicated.  Then the higher/highest priority setting "wins".

There are no competing values of ‘c-file-style’ variable.  In all
scenarios I’ve described the variable exists in only one place and its
value is "bsd".

-- 
Best regards
ミハウ “𝓶𝓲𝓷𝓪86” ナザレヴイツ
«If at first you don’t succeed, give up skydiving»



reply via email to

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