GNU bug report logs - #14008
Better autoindent for C++11 code?

Previous Next

Packages: cc-mode, emacs;

Reported by: Andrew Pennebaker <andrew.pennebaker <at> gmail.com>

Date: Wed, 20 Mar 2013 15:41:01 UTC

Severity: wishlist

Done: Stefan Kangas <stefan <at> marxist.se>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 14008 in the body.
You can then email your comments to 14008 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-gnu-emacs <at> gnu.org:
bug#14008; Package emacs. (Wed, 20 Mar 2013 15:41:01 GMT) Full text and rfc822 format available.

Acknowledgement sent to Andrew Pennebaker <andrew.pennebaker <at> gmail.com>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Wed, 20 Mar 2013 15:41:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Andrew Pennebaker <andrew.pennebaker <at> gmail.com>
To: bug-gnu-emacs <at> gnu.org
Subject: Better autoindent for C++11 code?
Date: Wed, 20 Mar 2013 11:38:58 -0400
[Message part 1 (text/plain, inline)]
C++11 introduced lambda syntax []() { ... } and other strange things that
Emacs indents strangely.

for_each(range.begin(), range.end(), [=](int i) {
    cout << strings[i] << endl;
  });

I would like the final line `});` to have the same indentation level as the
first line `for_each...`.

Here's another example:

for_each(range.begin(), range.end(), [&](int i) {
             std::async(
                        launch::async,
                        [&]() { strings[i] = fizzy(i); }
                        );
  });

The arguments to std::async and its closing parenthesis are indented much
too far; I would like them indented only one level further than where
std::async is itself indented. Any tips for achieving this?

-- 
Cheers,

Andrew Pennebaker
www.yellosoft.us
[Message part 2 (text/html, inline)]

Information forwarded to bug-gnu-emacs <at> gnu.org, bug-cc-mode <at> gnu.org:
bug#14008; Package emacs,cc-mode. (Sun, 13 Oct 2019 08:05:01 GMT) Full text and rfc822 format available.

Message #8 received at 14008 <at> debbugs.gnu.org (full text, mbox):

From: Stefan Kangas <stefan <at> marxist.se>
To: Andrew Pennebaker <andrew.pennebaker <at> gmail.com>
Cc: Alan Mackenzie <acm <at> muc.de>, 14008 <at> debbugs.gnu.org
Subject: Re: bug#14008: Better autoindent for C++11 code?
Date: Sun, 13 Oct 2019 10:03:00 +0200
Andrew Pennebaker <andrew.pennebaker <at> gmail.com> writes:

> C++11 introduced lambda syntax []() { ... } and other strange things that Emacs indents strangely.
>
> for_each(range.begin(), range.end(), [=](int i) {
>     cout << strings[i] << endl;
>   });
>
> I would like the final line `});` to have the same indentation level as the first line `for_each...`.

I'm seeing the same thing here.

With "emacs -Q" on current master, this indents like:

for_each(range.begin(), range.end(), [=](int i) {
  cout << strings[i] << endl;
 });

However, note that I have only one space before the final "}"
character, whereas the reporter had two.  I'm not sure if this
behaviour is intentional or not, or if it could be configured.

> Here's another example:
>
> for_each(range.begin(), range.end(), [&](int i) {
>              std::async(
>                         launch::async,
>                         [&]() { strings[i] = fizzy(i); }
>                         );
>   });
>
> The arguments to std::async and its closing parenthesis are indented much too far; I would like them indented only one level further than where std::async is itself indented. Any tips for achieving this?

I'm seeing something similar here:

for_each(range.begin(), range.end(), [&](int i) {
  std::async(
         launch::async,
         [&]() { strings[i] = fizzy(i); }
         );
 });

Perhaps Alan could clarify if this is a bug or if this is just a case
of missing configuration?

Best regards,
Stefan Kangas




Information forwarded to bug-gnu-emacs <at> gnu.org, bug-cc-mode <at> gnu.org:
bug#14008; Package emacs,cc-mode. (Sun, 13 Oct 2019 18:10:02 GMT) Full text and rfc822 format available.

Message #11 received at 14008 <at> debbugs.gnu.org (full text, mbox):

From: Alan Mackenzie <acm <at> muc.de>
To: Stefan Kangas <stefan <at> marxist.se>
Cc: Andrew Pennebaker <andrew.pennebaker <at> gmail.com>, 14008 <at> debbugs.gnu.org
Subject: Re: bug#14008: Better autoindent for C++11 code?
Date: Sun, 13 Oct 2019 18:09:49 +0000
Hello, Stefan and Andrew.

On Sun, Oct 13, 2019 at 10:03:00 +0200, Stefan Kangas wrote:
> Andrew Pennebaker <andrew.pennebaker <at> gmail.com> writes:

> > C++11 introduced lambda syntax []() { ... } and other strange things that Emacs indents strangely.

> > for_each(range.begin(), range.end(), [=](int i) {
> >     cout << strings[i] << endl;
> >   });

> > I would like the final line `});` to have the same indentation level
> > as the first line `for_each...`.

> I'm seeing the same thing here.

I think this is the minimum indentation imposed on all lines within "code
blocks" in "gnu" style.  (See the CC Mode manual for a description of CC
Mode's style system.)  If you indent the for_each line by, say, 4 columns
(put it inside braces if needed) the line with }); then gets indented
under the for_each.  As for_each is a function (pretty much equivalent to
Lisp's mapc), it's unlikely to be put at column 0 in real source code.

> With "emacs -Q" on current master, this indents like:

> for_each(range.begin(), range.end(), [=](int i) {
>   cout << strings[i] << endl;
>  });

> However, note that I have only one space before the final "}"
> character, whereas the reporter had two.  I'm not sure if this
> behaviour is intentional or not, or if it could be configured.

I'm surprised about the two spaces too, I don't understand how it could
have happened, unless there's been some disruption in the copying from
Emacs screen to email.

> > Here's another example:

> > for_each(range.begin(), range.end(), [&](int i) {
> >              std::async(
> >                         launch::async,
> >                         [&]() { strings[i] = fizzy(i); }
> >                         );
> >   });

> > The arguments to std::async and its closing parenthesis are indented
> > much too far; I would like them indented only one level further than
> > where std::async is itself indented. Any tips for achieving this?

Configure CC Mode, either by activating a different style (with C-c ., or
M-x c-set-style if some minor mode is using that key binding), or by
directly setting syntactic symbols' "offsets".

For the first possibility, I'd recommend trying out, say styles "bsd" or
"linux".

For the second, there are several ways to set symbols' offsets (see page
"Config Basics" in the CC Mode manual).  A good way is by using a hook
function.

To find out what syntactic symbols you need to change, put point on a
pertinent line and type C-c C-s.  For example on the "launch::async" line
you'd see something like "((arglist-intro 394 404))", the two numbers
being the "anchor points" from which the indentation is done.  To see
(and change temporarily) the "offset" for a symbol, type C-c C-o.  The
"gnu" style setting of the "offset" for arglist-intro is the function
c-lineup-arglist-intro-after-paren, which does pretty much what its name
says.

I think you want a simple extra level of indentation from point 394, so
you could construct your hook function something like this:

(defun my-c-indent ()
  (c-set-offset 'arglist-intro '+)
  ;; Add any further syntactic symbols here.
  )
(add-hook 'c-mode-common-hook #'my-c-indent) ; c++-mode-hook could also
                                             ; be used

Again, I strongly recommend reading the relevant pages in the CC Mode
manual.


> I'm seeing something similar here:

> for_each(range.begin(), range.end(), [&](int i) {
>   std::async(
>          launch::async,
>          [&]() { strings[i] = fizzy(i); }
>          );
>  });

> Perhaps Alan could clarify if this is a bug or if this is just a case
> of missing configuration?

A bit of a mixture of both, I think.

> Best regards,
> Stefan Kangas

-- 
Alan Mackenzie (Nuremberg, Germany).




Information forwarded to bug-gnu-emacs <at> gnu.org, bug-cc-mode <at> gnu.org:
bug#14008; Package emacs,cc-mode. (Sun, 03 Nov 2019 13:30:02 GMT) Full text and rfc822 format available.

Message #14 received at 14008 <at> debbugs.gnu.org (full text, mbox):

From: Stefan Kangas <stefan <at> marxist.se>
To: Alan Mackenzie <acm <at> muc.de>
Cc: Andrew Pennebaker <andrew.pennebaker <at> gmail.com>, 14008 <at> debbugs.gnu.org
Subject: Re: bug#14008: Better autoindent for C++11 code?
Date: Sun, 03 Nov 2019 14:29:13 +0100
Hi Alan,

Alan Mackenzie <acm <at> muc.de> writes:

>> > C++11 introduced lambda syntax []() { ... } and other strange things that Emacs indents strangely.
>
>> > for_each(range.begin(), range.end(), [=](int i) {
>> >     cout << strings[i] << endl;
>> >   });
>
>> > I would like the final line `});` to have the same indentation level
>> > as the first line `for_each...`.
>
>> I'm seeing the same thing here.
>
> I think this is the minimum indentation imposed on all lines within "code
> blocks" in "gnu" style.  (See the CC Mode manual for a description of CC
> Mode's style system.)  If you indent the for_each line by, say, 4 columns
> (put it inside braces if needed) the line with }); then gets indented
> under the for_each.  As for_each is a function (pretty much equivalent to
> Lisp's mapc), it's unlikely to be put at column 0 in real source code.

Indeed.  It seems to work better when you put it in a function.

>> > Here's another example:
>
>> > for_each(range.begin(), range.end(), [&](int i) {
>> >              std::async(
>> >                         launch::async,
>> >                         [&]() { strings[i] = fizzy(i); }
>> >                         );
>> >   });
>
>> > The arguments to std::async and its closing parenthesis are indented
>> > much too far; I would like them indented only one level further than
>> > where std::async is itself indented. Any tips for achieving this?
>
> Configure CC Mode, either by activating a different style (with C-c ., or
> M-x c-set-style if some minor mode is using that key binding), or by
> directly setting syntactic symbols' "offsets".
[...]
> Again, I strongly recommend reading the relevant pages in the CC Mode
> manual.
[...]
>> Perhaps Alan could clarify if this is a bug or if this is just a case
>> of missing configuration?
>
> A bit of a mixture of both, I think.

Do you think there is anything more to do here, or should this bug be
closed?

Best regards,
Stefan Kangas




Information forwarded to bug-gnu-emacs <at> gnu.org, bug-cc-mode <at> gnu.org:
bug#14008; Package emacs,cc-mode. (Thu, 07 Nov 2019 18:20:02 GMT) Full text and rfc822 format available.

Message #17 received at 14008 <at> debbugs.gnu.org (full text, mbox):

From: Alan Mackenzie <acm <at> muc.de>
To: Stefan Kangas <stefan <at> marxist.se>
Cc: Andrew Pennebaker <andrew.pennebaker <at> gmail.com>, 14008 <at> debbugs.gnu.org
Subject: Re: bug#14008: Better autoindent for C++11 code?
Date: Thu, 7 Nov 2019 18:19:40 +0000
Hello, Stefan.

On Sun, Nov 03, 2019 at 14:29:13 +0100, Stefan Kangas wrote:
> Hi Alan,

> Alan Mackenzie <acm <at> muc.de> writes:

> >> > C++11 introduced lambda syntax []() { ... } and other strange things that Emacs indents strangely.

> >> > for_each(range.begin(), range.end(), [=](int i) {
> >> >     cout << strings[i] << endl;
> >> >   });

> >> > I would like the final line `});` to have the same indentation level
> >> > as the first line `for_each...`.

> >> I'm seeing the same thing here.

> > I think this is the minimum indentation imposed on all lines within "code
> > blocks" in "gnu" style.  (See the CC Mode manual for a description of CC
> > Mode's style system.)  If you indent the for_each line by, say, 4 columns
> > (put it inside braces if needed) the line with }); then gets indented
> > under the for_each.  As for_each is a function (pretty much equivalent to
> > Lisp's mapc), it's unlikely to be put at column 0 in real source code.

> Indeed.  It seems to work better when you put it in a function.

> >> > Here's another example:

> >> > for_each(range.begin(), range.end(), [&](int i) {
> >> >              std::async(
> >> >                         launch::async,
> >> >                         [&]() { strings[i] = fizzy(i); }
> >> >                         );
> >> >   });

> >> > The arguments to std::async and its closing parenthesis are indented
> >> > much too far; I would like them indented only one level further than
> >> > where std::async is itself indented. Any tips for achieving this?

> > Configure CC Mode, either by activating a different style (with C-c ., or
> > M-x c-set-style if some minor mode is using that key binding), or by
> > directly setting syntactic symbols' "offsets".
> [...]
> > Again, I strongly recommend reading the relevant pages in the CC Mode
> > manual.
> [...]
> >> Perhaps Alan could clarify if this is a bug or if this is just a case
> >> of missing configuration?

> > A bit of a mixture of both, I think.

> Do you think there is anything more to do here, or should this bug be
> closed?

I think the bug should now be closed.

> Best regards,
> Stefan Kangas

-- 
Alan Mackenzie (Nuremberg, Germany).




Reply sent to Stefan Kangas <stefan <at> marxist.se>:
You have taken responsibility. (Thu, 07 Nov 2019 23:42:01 GMT) Full text and rfc822 format available.

Notification sent to Andrew Pennebaker <andrew.pennebaker <at> gmail.com>:
bug acknowledged by developer. (Thu, 07 Nov 2019 23:42:01 GMT) Full text and rfc822 format available.

Message #22 received at 14008-done <at> debbugs.gnu.org (full text, mbox):

From: Stefan Kangas <stefan <at> marxist.se>
To: Alan Mackenzie <acm <at> muc.de>
Cc: Andrew Pennebaker <andrew.pennebaker <at> gmail.com>, 14008-done <at> debbugs.gnu.org
Subject: Re: bug#14008: Better autoindent for C++11 code?
Date: Fri, 08 Nov 2019 00:41:21 +0100
Alan Mackenzie <acm <at> muc.de> writes:

>> Do you think there is anything more to do here, or should this bug be
>> closed?
>
> I think the bug should now be closed.

Thanks, I'm therefore closing this bug now.

Best regards,
Stefan Kangas




bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Fri, 06 Dec 2019 12:24:05 GMT) Full text and rfc822 format available.

This bug report was last modified 4 years and 135 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.