[Top][All Lists]

[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].


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

> > 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]