Subject: bug#17051: Order of evaluation in .dir-locals.el

From: Alan Mackenzie <[email-masked]>
Date: Tue, 7 Jun 2016 11:23:13 +0000

Hello, Reuben.

On Thu, Mar 20, 2014 at 03:01:12PM +0000, Reuben Thomas wrote:
> I have the following .dir-locals.el for a project:

> ((nil . ((show-trailing-whitespace . nil)
>          (eval . (c-add-style "fontforge"
>                               '("stroustrup"
>                                 (indent-tabs-mode . t)
>                                 (tab-width . 8)
>                                 (c-offsets-alist
>                                  (case-label . *)))))))
>  (c-mode . ((c-file-style . "fontforge"))))

> The idea is to define a new c-style and apply it to all files in that
> project.

Why are you defining the new style "fontforge" every time a file gets
visited?  Couldn't you simply define it once, directly in your .emacs,
before any C files are loaded (e.g., via desktop-save-mode)?

> When I first visit a file under that project, I get the error: "Undefined
> style: fontforge"

I don't think the order of evaluation of variables in .dir-locals.el is
defined.  The code (in .../lisp/files.el) is not easy to understand.  It
could well be that, for that first file, the c-file-style is being
applied before it has been defined.

> When I examine c-style-alist, "fontforge" is the first entry, and when I
> look at c-file-style for that buffer, its value is "fontforge". However, as
> the error implies, the style has not been applied to that buffer: if I
> check the value of indent-tabs-mode, which I have configured globally to
> "nil", it is still nil.

> If I then run M-x c-set-style RET fontforge RET, the style is applied as
> expected.

> Hence, it appears my error has to do with the order of evaluation. I tried
> putting the "eval" sexp under the "c-mode" section of the .dir-locals.el,
> but that still gives the same error, even when I put it before the
> c-file-style sexp.

Again, I'm not aware of any definition of the order of evaluation.

> I can't find anything about this in the manual, or online (i.e. examples
> where the result of an "eval" entry are relied on by another entry). In
> hack-local-variables-apply files.el I found this bit of code:

>     ;; Any 'evals must run in the Right sequence.
>     (setq file-local-variables-alist
>       (nreverse file-local-variables-alist))

> so I tried putting the "eval" part at the end of c-mode's list, but that
> didn't help either. (I checked file-local-variables-alist in each case to
> make sure that in one the eval was before c-file-style, and in the other,
> after).

> Can someone please set me straight?

Would you please try defining your CC Mode style outside of
.dir-locals.el, as suggested above.

It could well be that we need to polish the documentation of this topic a
little.

> -- 
> http://rrt.sc3d.org

-- 
Alan Mackenzie (Nuremberg, Germany).