diff mbox

[v2] Add .dir-locals.el file to configure emacs coding style

Message ID 1433424607-3429-1-git-send-email-berrange@redhat.com
State New
Headers show

Commit Message

Daniel P. Berrangé June 4, 2015, 1:30 p.m. UTC
Some default emacs setups indent by 2 spaces and uses tabs
which is counter to the QEMU coding style rules. Adding a
.dir-locals.el file in the top level of the GIT repo will
inform emacs about the QEMU coding style, and so assist
contributors in avoiding common style mistakes before
they submit patches.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
---
 .dir-locals.el | 2 ++
 1 file changed, 2 insertions(+)
 create mode 100644 .dir-locals.el

Comments

Peter Maydell June 4, 2015, 1:41 p.m. UTC | #1
On 4 June 2015 at 14:30, Daniel P. Berrange <berrange@redhat.com> wrote:
> Some default emacs setups indent by 2 spaces and uses tabs
> which is counter to the QEMU coding style rules. Adding a
> .dir-locals.el file in the top level of the GIT repo will
> inform emacs about the QEMU coding style, and so assist
> contributors in avoiding common style mistakes before
> they submit patches.
>
> Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
> ---
>  .dir-locals.el | 2 ++
>  1 file changed, 2 insertions(+)
>  create mode 100644 .dir-locals.el
>
> diff --git a/.dir-locals.el b/.dir-locals.el
> new file mode 100644
> index 0000000..3ac0cfc
> --- /dev/null
> +++ b/.dir-locals.el
> @@ -0,0 +1,2 @@
> +((c-mode . ((c-file-style . "stroustrup")
> +           (indent-tabs-mode . nil))))

My .emacs defines a style like this:

(defconst qemu-c-style
  '((indent-tabs-mode . nil)
    (c-basic-offset . 4)
    (tab-width . 8)
    (c-comment-only-line-offset . 0)
    (c-offsets-alist . ((statement-block-intro . +)
                        (substatement-open . 0)
                        (label . 0)
                        (statement-cont . +)
                        (innamespace . 0)
                        (inline-open . 0)
                        ))
    (c-hanging-braces-alist .
                            ((brace-list-open)
                             (brace-list-intro)
                             (brace-list-entry)
                             (brace-list-close)
                             (brace-entry-open)
                             (block-close . c-snug-do-while)
                             ;; structs have hanging braces on open
                             (class-open . (after))
                             ;; ditto if statements
                             (substatement-open . (after))
                             ;; and no auto newline at the end
                             (class-close)
                             ))
    )
  "QEMU C Programming Style")

which is a superset of Stroustrup and gets a few more
corner cases right, I think.

-- PMM
Daniel P. Berrangé June 4, 2015, 2:15 p.m. UTC | #2
On Thu, Jun 04, 2015 at 02:41:42PM +0100, Peter Maydell wrote:
> On 4 June 2015 at 14:30, Daniel P. Berrange <berrange@redhat.com> wrote:
> > Some default emacs setups indent by 2 spaces and uses tabs
> > which is counter to the QEMU coding style rules. Adding a
> > .dir-locals.el file in the top level of the GIT repo will
> > inform emacs about the QEMU coding style, and so assist
> > contributors in avoiding common style mistakes before
> > they submit patches.
> >
> > Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
> > ---
> >  .dir-locals.el | 2 ++
> >  1 file changed, 2 insertions(+)
> >  create mode 100644 .dir-locals.el
> >
> > diff --git a/.dir-locals.el b/.dir-locals.el
> > new file mode 100644
> > index 0000000..3ac0cfc
> > --- /dev/null
> > +++ b/.dir-locals.el
> > @@ -0,0 +1,2 @@
> > +((c-mode . ((c-file-style . "stroustrup")
> > +           (indent-tabs-mode . nil))))
> 
> My .emacs defines a style like this:
> 
> (defconst qemu-c-style
>   '((indent-tabs-mode . nil)
>     (c-basic-offset . 4)
>     (tab-width . 8)
>     (c-comment-only-line-offset . 0)
>     (c-offsets-alist . ((statement-block-intro . +)
>                         (substatement-open . 0)
>                         (label . 0)
>                         (statement-cont . +)
>                         (innamespace . 0)
>                         (inline-open . 0)
>                         ))
>     (c-hanging-braces-alist .
>                             ((brace-list-open)
>                              (brace-list-intro)
>                              (brace-list-entry)
>                              (brace-list-close)
>                              (brace-entry-open)
>                              (block-close . c-snug-do-while)
>                              ;; structs have hanging braces on open
>                              (class-open . (after))
>                              ;; ditto if statements
>                              (substatement-open . (after))
>                              ;; and no auto newline at the end
>                              (class-close)
>                              ))
>     )
>   "QEMU C Programming Style")
> 
> which is a superset of Stroustrup and gets a few more
> corner cases right, I think.

I'm not fussed about what we use as long as we have something, so I'm
happy to do a v3 using your suggested style instead :)

Regards,
Daniel
Markus Armbruster June 18, 2015, 9:28 a.m. UTC | #3
Peter Maydell <peter.maydell@linaro.org> writes:

> On 4 June 2015 at 14:30, Daniel P. Berrange <berrange@redhat.com> wrote:
>> Some default emacs setups indent by 2 spaces and uses tabs
>> which is counter to the QEMU coding style rules. Adding a
>> .dir-locals.el file in the top level of the GIT repo will
>> inform emacs about the QEMU coding style, and so assist
>> contributors in avoiding common style mistakes before
>> they submit patches.
>>
>> Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
>> ---
>>  .dir-locals.el | 2 ++
>>  1 file changed, 2 insertions(+)
>>  create mode 100644 .dir-locals.el
>>
>> diff --git a/.dir-locals.el b/.dir-locals.el
>> new file mode 100644
>> index 0000000..3ac0cfc
>> --- /dev/null
>> +++ b/.dir-locals.el
>> @@ -0,0 +1,2 @@
>> +((c-mode . ((c-file-style . "stroustrup")
>> +           (indent-tabs-mode . nil))))
>
> My .emacs defines a style like this:
>
> (defconst qemu-c-style
>   '((indent-tabs-mode . nil)
>     (c-basic-offset . 4)
>     (tab-width . 8)
>     (c-comment-only-line-offset . 0)
>     (c-offsets-alist . ((statement-block-intro . +)
>                         (substatement-open . 0)
>                         (label . 0)
>                         (statement-cont . +)
>                         (innamespace . 0)
>                         (inline-open . 0)
>                         ))
>     (c-hanging-braces-alist .
>                             ((brace-list-open)
>                              (brace-list-intro)
>                              (brace-list-entry)
>                              (brace-list-close)
>                              (brace-entry-open)
>                              (block-close . c-snug-do-while)
>                              ;; structs have hanging braces on open
>                              (class-open . (after))
>                              ;; ditto if statements
>                              (substatement-open . (after))
>                              ;; and no auto newline at the end
>                              (class-close)
>                              ))
>     )
>   "QEMU C Programming Style")
>
> which is a superset of Stroustrup and gets a few more
> corner cases right, I think.

Trouble is I can't figure out how to get that into Emacs using nothing
but files in the QEMU tree.  From within the tree, we can file- and
directory-local variables, and it just works as long as Emacs deems the
variables safe.  When not, Emacs prompts for confirmation.  I'd rather
not go there.

Using an existing C style is a textbook example of safe local variables
(literally, the Emacs manual does it).

Adding simple customizations on top should be feasible.

However, I can't see how I could define a new C style there without
pushing the "local variables" feature well beyond its intended use, and
triggering the confirmation prompts.

If we take Dan's patch, every Emacs user who hasn't already configured a
suitable style profits.  Users who have may have to adjust their
configuration to work with or around Dan's patch.

"That action is best which procures the greatest happiness for the
greatest numbers."  Let's take Dan's patch.

I can post a follow-up extending tab avoidance to files that don't use
c-mode.

Reviewed-by: Markus Armbruster <armbru@redhat.com>
Peter Maydell June 18, 2015, 12:47 p.m. UTC | #4
On 18 June 2015 at 10:28, Markus Armbruster <armbru@redhat.com> wrote:
> However, I can't see how I could define a new C style there without
> pushing the "local variables" feature well beyond its intended use, and
> triggering the confirmation prompts.

We wouldn't want to define a new C style, but in general the items
I have in my config over the Stroustrup defaults are going to be there
because I've noticed something where Stroustrup doesn't indent right...

> If we take Dan's patch, every Emacs user who hasn't already configured a
> suitable style profits.  Users who have may have to adjust their
> configuration to work with or around Dan's patch.

Is there some way to tell whether your emacs has picked up the local
style info rather than the one you have in your .emacs ?

-- PMM
Markus Armbruster June 18, 2015, 2:05 p.m. UTC | #5
Peter Maydell <peter.maydell@linaro.org> writes:

> On 18 June 2015 at 10:28, Markus Armbruster <armbru@redhat.com> wrote:
>> However, I can't see how I could define a new C style there without
>> pushing the "local variables" feature well beyond its intended use, and
>> triggering the confirmation prompts.
>
> We wouldn't want to define a new C style, but in general the items
> I have in my config over the Stroustrup defaults are going to be there
> because I've noticed something where Stroustrup doesn't indent right...

As far as I can see, the difference bwteen stroustrup style and yours is
a few tweaks to c-offsets-alist and c-hanging-braces-alist.  I'm not
sure how to do that from .dir-locals.el.

>> If we take Dan's patch, every Emacs user who hasn't already configured a
>> suitable style profits.  Users who have may have to adjust their
>> configuration to work with or around Dan's patch.
>
> Is there some way to tell whether your emacs has picked up the local
> style info rather than the one you have in your .emacs ?

The obvious way is to check the buffer-local variables.  Buffer-local
variable c-indentation-style is the name of the style in use.  Without
anything in .emacs or local variables, it's "gnu".  With your
(c-add-style "qemu" qemu-c-style) in .emacs, it should be "qemu".  With
Dan's .dir-locals.el, it should be "stroustrup".

When you can't or don't want to create or modify a .dir-locals.el, you
can do something like this instead:

    (dir-locals-set-class-variables 'qemu '((c-mode . ((c-file-style . "qemu")))))
    (dir-locals-set-directory-class "~/work/qemu" 'qemu)

This *overrides* .dir-locals.el in my testing.
John Snow Aug. 25, 2015, 12:15 a.m. UTC | #6
On 06/18/2015 10:05 AM, Markus Armbruster wrote:
> Peter Maydell <peter.maydell@linaro.org> writes:
> 
>> On 18 June 2015 at 10:28, Markus Armbruster <armbru@redhat.com> wrote:
>>> However, I can't see how I could define a new C style there without
>>> pushing the "local variables" feature well beyond its intended use, and
>>> triggering the confirmation prompts.
>>
>> We wouldn't want to define a new C style, but in general the items
>> I have in my config over the Stroustrup defaults are going to be there
>> because I've noticed something where Stroustrup doesn't indent right...
> 
> As far as I can see, the difference bwteen stroustrup style and yours is
> a few tweaks to c-offsets-alist and c-hanging-braces-alist.  I'm not
> sure how to do that from .dir-locals.el.
> 
>>> If we take Dan's patch, every Emacs user who hasn't already configured a
>>> suitable style profits.  Users who have may have to adjust their
>>> configuration to work with or around Dan's patch.
>>
>> Is there some way to tell whether your emacs has picked up the local
>> style info rather than the one you have in your .emacs ?
> 
> The obvious way is to check the buffer-local variables.  Buffer-local
> variable c-indentation-style is the name of the style in use.  Without
> anything in .emacs or local variables, it's "gnu".  With your
> (c-add-style "qemu" qemu-c-style) in .emacs, it should be "qemu".  With
> Dan's .dir-locals.el, it should be "stroustrup".
> 
> When you can't or don't want to create or modify a .dir-locals.el, you
> can do something like this instead:
> 
>     (dir-locals-set-class-variables 'qemu '((c-mode . ((c-file-style . "qemu")))))
>     (dir-locals-set-directory-class "~/work/qemu" 'qemu)
> 
> This *overrides* .dir-locals.el in my testing.
> 

ping -- any love for this for 2.5?
Eric Blake Sept. 15, 2015, 3:31 p.m. UTC | #7
ping

On 08/24/2015 06:15 PM, John Snow wrote:
> 
> 
> On 06/18/2015 10:05 AM, Markus Armbruster wrote:
>> Peter Maydell <peter.maydell@linaro.org> writes:
>>
>>> On 18 June 2015 at 10:28, Markus Armbruster <armbru@redhat.com> wrote:
>>>> However, I can't see how I could define a new C style there without
>>>> pushing the "local variables" feature well beyond its intended use, and
>>>> triggering the confirmation prompts.
>>>
>>> We wouldn't want to define a new C style, but in general the items
>>> I have in my config over the Stroustrup defaults are going to be there
>>> because I've noticed something where Stroustrup doesn't indent right...
>>
>> As far as I can see, the difference bwteen stroustrup style and yours is
>> a few tweaks to c-offsets-alist and c-hanging-braces-alist.  I'm not
>> sure how to do that from .dir-locals.el.
>>
>>>> If we take Dan's patch, every Emacs user who hasn't already configured a
>>>> suitable style profits.  Users who have may have to adjust their
>>>> configuration to work with or around Dan's patch.
>>>
>>> Is there some way to tell whether your emacs has picked up the local
>>> style info rather than the one you have in your .emacs ?
>>
>> The obvious way is to check the buffer-local variables.  Buffer-local
>> variable c-indentation-style is the name of the style in use.  Without
>> anything in .emacs or local variables, it's "gnu".  With your
>> (c-add-style "qemu" qemu-c-style) in .emacs, it should be "qemu".  With
>> Dan's .dir-locals.el, it should be "stroustrup".
>>
>> When you can't or don't want to create or modify a .dir-locals.el, you
>> can do something like this instead:
>>
>>     (dir-locals-set-class-variables 'qemu '((c-mode . ((c-file-style . "qemu")))))
>>     (dir-locals-set-directory-class "~/work/qemu" 'qemu)
>>
>> This *overrides* .dir-locals.el in my testing.
>>
> 
> ping -- any love for this for 2.5?
> 
>
Daniel P. Berrangé Sept. 15, 2015, 3:54 p.m. UTC | #8
On Tue, Sep 15, 2015 at 09:31:08AM -0600, Eric Blake wrote:
> ping
> 
> On 08/24/2015 06:15 PM, John Snow wrote:
> > 
> > 
> > On 06/18/2015 10:05 AM, Markus Armbruster wrote:
> >> Peter Maydell <peter.maydell@linaro.org> writes:
> >>
> >>> On 18 June 2015 at 10:28, Markus Armbruster <armbru@redhat.com> wrote:
> >>>> However, I can't see how I could define a new C style there without
> >>>> pushing the "local variables" feature well beyond its intended use, and
> >>>> triggering the confirmation prompts.
> >>>
> >>> We wouldn't want to define a new C style, but in general the items
> >>> I have in my config over the Stroustrup defaults are going to be there
> >>> because I've noticed something where Stroustrup doesn't indent right...
> >>
> >> As far as I can see, the difference bwteen stroustrup style and yours is
> >> a few tweaks to c-offsets-alist and c-hanging-braces-alist.  I'm not
> >> sure how to do that from .dir-locals.el.
> >>
> >>>> If we take Dan's patch, every Emacs user who hasn't already configured a
> >>>> suitable style profits.  Users who have may have to adjust their
> >>>> configuration to work with or around Dan's patch.
> >>>
> >>> Is there some way to tell whether your emacs has picked up the local
> >>> style info rather than the one you have in your .emacs ?
> >>
> >> The obvious way is to check the buffer-local variables.  Buffer-local
> >> variable c-indentation-style is the name of the style in use.  Without
> >> anything in .emacs or local variables, it's "gnu".  With your
> >> (c-add-style "qemu" qemu-c-style) in .emacs, it should be "qemu".  With
> >> Dan's .dir-locals.el, it should be "stroustrup".
> >>
> >> When you can't or don't want to create or modify a .dir-locals.el, you
> >> can do something like this instead:
> >>
> >>     (dir-locals-set-class-variables 'qemu '((c-mode . ((c-file-style . "qemu")))))
> >>     (dir-locals-set-directory-class "~/work/qemu" 'qemu)
> >>
> >> This *overrides* .dir-locals.el in my testing.
> >>
> > 
> > ping -- any love for this for 2.5?

So just to re-cap.....

My original proposed .dir-locals.el was pretty short:

  ((c-mode . ((c-file-style . "stroustrup")
             (indent-tabs-mode . nil))))

IIUC, the quote above says it is possible to override this with more
developer custom styles if desired, so it shouldn't cause any obvious
disadvantage / problem to contributors to have this set by default.

I have tried an alternative .dir-locals.el that contains all of
Peter's rules (from http://wiki.linaro.org/PeterMaydell/QemuEmacsStyle)
which looks like this:


  ;; Based on https://wiki.linaro.org/PeterMaydell/QemuEmacsStyle
  ;; which aims to apply CODING_STYLE guidelines
  ((c-mode . (
      (c-file-style . "stroustrup")
      (indent-tabs-mode . nil)
      (tab-width . 8)
      (c-comment-only-line-offset . 1)
      (c-hanging-braces-alist . ((substatement-open before after)))
      (c-offsets-alist . (
          (statement-block-intro . +)
          (substatement-open . 0)
          (label . 0)
          (statement-cont . +)
          (innamespace . 0)
          (inline-open . 0)
      ))
      (c-hanging-braces-alist . (
          (brace-list-open)
          (brace-list-intro)
          (brace-list-entry)
          (brace-list-close)
          (brace-entry-open)
          (block-close . c-snug-do-while)
          ;; structs have hanging braces on open
          (class-open . (after))
          ;; ditto if statements
          (substatement-open . (after))
          ;; and no auto newline at the end
          (class-close)
      ))
  )))

The main downside/problem I found with having this more comprehensive
.dir-locals.el file, is that emacs will raise a warning at launch time:

"The local variables list in /home/berrange/src/virt/qemu
 contains vlaues that may not be safe (*).

 Do you want to apply it? You can type
  y -- to apply the local variables list.
  n -- to ignore the local variables list.
  ! -- to apply the local variables list and permanently
       mark these values (*) as safe (in the future, they
       will be set automatically)"

It will ask this every time it launches unless you say "!"
whereupon it modifies your $HOME/.emacs to disable the warning

Personally I be fine with both the minimal approach or the more
comprehensive approach of Peter's, but I'd probably tend towards
the minimal approach to avoid the warnings problem.

Regards,
Daniel
Markus Armbruster Sept. 15, 2015, 4:22 p.m. UTC | #9
"Daniel P. Berrange" <berrange@redhat.com> writes:

> On Tue, Sep 15, 2015 at 09:31:08AM -0600, Eric Blake wrote:
>> ping
>> 
>> On 08/24/2015 06:15 PM, John Snow wrote:
>> > 
>> > 
>> > On 06/18/2015 10:05 AM, Markus Armbruster wrote:
>> >> Peter Maydell <peter.maydell@linaro.org> writes:
>> >>
>> >>> On 18 June 2015 at 10:28, Markus Armbruster <armbru@redhat.com> wrote:
>> >>>> However, I can't see how I could define a new C style there without
>> >>>> pushing the "local variables" feature well beyond its intended use, and
>> >>>> triggering the confirmation prompts.
>> >>>
>> >>> We wouldn't want to define a new C style, but in general the items
>> >>> I have in my config over the Stroustrup defaults are going to be there
>> >>> because I've noticed something where Stroustrup doesn't indent right...
>> >>
>> >> As far as I can see, the difference bwteen stroustrup style and yours is
>> >> a few tweaks to c-offsets-alist and c-hanging-braces-alist.  I'm not
>> >> sure how to do that from .dir-locals.el.
>> >>
>> >>>> If we take Dan's patch, every Emacs user who hasn't already configured a
>> >>>> suitable style profits.  Users who have may have to adjust their
>> >>>> configuration to work with or around Dan's patch.
>> >>>
>> >>> Is there some way to tell whether your emacs has picked up the local
>> >>> style info rather than the one you have in your .emacs ?
>> >>
>> >> The obvious way is to check the buffer-local variables.  Buffer-local
>> >> variable c-indentation-style is the name of the style in use.  Without
>> >> anything in .emacs or local variables, it's "gnu".  With your
>> >> (c-add-style "qemu" qemu-c-style) in .emacs, it should be "qemu".  With
>> >> Dan's .dir-locals.el, it should be "stroustrup".
>> >>
>> >> When you can't or don't want to create or modify a .dir-locals.el, you
>> >> can do something like this instead:
>> >>
>> >>     (dir-locals-set-class-variables 'qemu '((c-mode
>> >> . ((c-file-style . "qemu")))))
>> >>     (dir-locals-set-directory-class "~/work/qemu" 'qemu)
>> >>
>> >> This *overrides* .dir-locals.el in my testing.
>> >>
>> > 
>> > ping -- any love for this for 2.5?
>
> So just to re-cap.....
>
> My original proposed .dir-locals.el was pretty short:
>
>   ((c-mode . ((c-file-style . "stroustrup")
>              (indent-tabs-mode . nil))))
>
> IIUC, the quote above says it is possible to override this with more
> developer custom styles if desired, so it shouldn't cause any obvious
> disadvantage / problem to contributors to have this set by default.
>
> I have tried an alternative .dir-locals.el that contains all of
> Peter's rules (from http://wiki.linaro.org/PeterMaydell/QemuEmacsStyle)
> which looks like this:
>
>
>   ;; Based on https://wiki.linaro.org/PeterMaydell/QemuEmacsStyle
>   ;; which aims to apply CODING_STYLE guidelines
>   ((c-mode . (
>       (c-file-style . "stroustrup")
>       (indent-tabs-mode . nil)
>       (tab-width . 8)
>       (c-comment-only-line-offset . 1)
>       (c-hanging-braces-alist . ((substatement-open before after)))
>       (c-offsets-alist . (
>           (statement-block-intro . +)
>           (substatement-open . 0)
>           (label . 0)
>           (statement-cont . +)
>           (innamespace . 0)
>           (inline-open . 0)
>       ))
>       (c-hanging-braces-alist . (
>           (brace-list-open)
>           (brace-list-intro)
>           (brace-list-entry)
>           (brace-list-close)
>           (brace-entry-open)
>           (block-close . c-snug-do-while)
>           ;; structs have hanging braces on open
>           (class-open . (after))
>           ;; ditto if statements
>           (substatement-open . (after))
>           ;; and no auto newline at the end
>           (class-close)
>       ))
>   )))
>
> The main downside/problem I found with having this more comprehensive
> .dir-locals.el file, is that emacs will raise a warning at launch time:
>
> "The local variables list in /home/berrange/src/virt/qemu
>  contains vlaues that may not be safe (*).
>
>  Do you want to apply it? You can type
>   y -- to apply the local variables list.
>   n -- to ignore the local variables list.
>   ! -- to apply the local variables list and permanently
>        mark these values (*) as safe (in the future, they
>        will be set automatically)"
>
> It will ask this every time it launches unless you say "!"
> whereupon it modifies your $HOME/.emacs to disable the warning
>
> Personally I be fine with both the minimal approach or the more
> comprehensive approach of Peter's, but I'd probably tend towards
> the minimal approach to avoid the warnings problem.

Seconded.

The "minimal approach" has been on the list since June, and it has my
R-by.  It's clearly better than nothing.  Let's commit it now.  We can
always improve on it later.
Michael Tokarev Sept. 15, 2015, 5:53 p.m. UTC | #10
15.09.2015 19:22, Markus Armbruster wrote:
> "Daniel P. Berrange" <berrange@redhat.com> writes:
[]
>> Personally I be fine with both the minimal approach or the more
>> comprehensive approach of Peter's, but I'd probably tend towards
>> the minimal approach to avoid the warnings problem.
> 
> Seconded.
> 
> The "minimal approach" has been on the list since June, and it has my
> R-by.  It's clearly better than nothing.  Let's commit it now.  We can
> always improve on it later.

Ok, let's apply it.  BTW, Marcus, your R-By wasn't actually clear,
to which version it applies.  Now I see that after your comment.

Applied, finally, to -trivial now, thank you all!

Should I add some more r-by or s-by? :)

Thanks!

/mjt
diff mbox

Patch

diff --git a/.dir-locals.el b/.dir-locals.el
new file mode 100644
index 0000000..3ac0cfc
--- /dev/null
+++ b/.dir-locals.el
@@ -0,0 +1,2 @@ 
+((c-mode . ((c-file-style . "stroustrup")
+	    (indent-tabs-mode . nil))))