]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix chaotic indentation of C++ lambda. Enhance documentation thereof
authorAlan Mackenzie <acm@muc.de>
Sun, 19 Mar 2017 17:09:27 +0000 (17:09 +0000)
committerAlan Mackenzie <acm@muc.de>
Sun, 19 Mar 2017 17:09:27 +0000 (17:09 +0000)
* lisp/progmodes/cc-engine.el (c-looking-at-inexpr-block): qualify an
invocation of c-on-identifier with a check we're not at the _end_ of an
identifier.

* doc/misc/cc-mode.texi: (Tex title page): Remove @subtitlefont because the
perl versions of texi2dvi haven't implemented it.
(Syntactic Symbols): Note that `inlambda' is also used in C++ Mode, not just
in Pike Mode.
(Statement Block Symbols): Add a section illustrating a C++ lambda function.
(FAQ): Add a question about "excessive" indentation of the contents of a C++
lambda function, and how to get rid of it.

doc/misc/cc-mode.texi
lisp/progmodes/cc-engine.el

index 14981c9c58b9fac6b5be9030eb7f28b47959a184..a29873b03b31d81517013e38c0ca248e0cbd7aff 100644 (file)
@@ -4255,8 +4255,8 @@ Analogous to the above, but for CORBA CIDL @code{composition} blocks.
 C++ template argument list continuations.  @ref{Class Symbols}.
 @item inlambda
 Analogous to @code{inclass} syntactic symbol, but used inside lambda
-(i.e., anonymous) functions.  Only used in Pike mode.  @ref{Statement
-Block Symbols}.
+(i.e., anonymous) functions.  Used in C++ and Pike modes.
+@ref{Statement Block Symbols}.
 @item lambda-intro-cont
 Lines continuing the header of a lambda function, i.e., between the
 @code{lambda} keyword and the function body.  Only used in Pike mode.
@@ -4993,6 +4993,21 @@ symbols they'd get in a normal block.  Therefore, the indentation put on
 indentation.  An @code{inexpr-statement} syntactic element doesn't
 contain an anchor position.
 
+C++11's lambda expressions involve a block inside a statement.  For
+example:
+
+@example
+ 1:  std::for_each(someList.begin(), someList.end(), [&total](int x) @{
+ 2:                                                     total += x;
+ 3:                                                 @});
+@end example
+
+Here a lambda expressions begins at the open bracket on line 1 and
+ends at the closing brace on line 3.  Line 2, in addition to the
+familiar @code{defun-block-intro} syntactic element, is also prefixed
+by an @code{inlambda} element, which is typically used to indent the
+entire lambda expression to under the opening bracket.
+
 In Pike code, there are a few other situations where blocks occur inside
 statements, as illustrated here:
 
@@ -7160,6 +7175,22 @@ too, add this to your @code{c-initialization-hook}:
 
 @xref{Getting Started}.  This was a very common question.
 
+@item
+@emph{How do I stop my C++ lambda expressions being indented way over
+to the right?}
+
+Change the offset associated with @code{inlambda} from its default,
+the function @code{c-lineup-inexpr-block}, to 0.  For example, if you
+are setting offsets in a hook function you might include the following
+line:
+
+@example
+(c-set-offset 'inlambda 0)
+@end example
+
+For details of the different ways you can make this setting,
+@ref{Config Basics}.
+
 @item
 @emph{How do I stop my code jumping all over the place when I type?}
 
index a5ade09791aa48656c00ec0a69c3578f51ac5882..bdc77dc50281d70e17050adf5dd7e8884a453fe2 100644 (file)
@@ -10661,7 +10661,8 @@ comment at the start of cc-engine.el for more info."
                       (progn
                         (c-backward-token-2 1 nil lim)
                         (and
-                         (not (c-on-identifier))
+                         (not (and (c-on-identifier)
+                                   (looking-at c-symbol-chars)))
                          (not (looking-at c-opt-op-identifier-prefix)))))))
            (cons 'inlambda bracket-pos))
           ((and c-recognize-paren-inexpr-blocks