diff options
author | Alan Mackenzie <acm@muc.de> | 2017-03-19 17:09:27 +0000 |
---|---|---|
committer | Alan Mackenzie <acm@muc.de> | 2017-03-19 17:09:27 +0000 |
commit | d602785139c57274e835e7b56305d42e72a28b0d (patch) | |
tree | 061f6897800a770e85a5014fc4f4b8bfcafe85fb | |
parent | 06a796398646fd1a5e17bc7321e12ae8e061e7f7 (diff) | |
download | emacs-d602785139c57274e835e7b56305d42e72a28b0d.tar.gz |
Fix chaotic indentation of C++ lambda. Enhance documentation thereof
* 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.
-rw-r--r-- | doc/misc/cc-mode.texi | 35 | ||||
-rw-r--r-- | lisp/progmodes/cc-engine.el | 3 |
2 files changed, 35 insertions, 3 deletions
diff --git a/doc/misc/cc-mode.texi b/doc/misc/cc-mode.texi index 14981c9c58b..a29873b03b3 100644 --- a/doc/misc/cc-mode.texi +++ b/doc/misc/cc-mode.texi @@ -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: @@ -7161,6 +7176,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?} Deactivate ``electric minor mode'' with @kbd{C-c C-l}. @xref{Getting diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el index a5ade09791a..bdc77dc5028 100644 --- a/lisp/progmodes/cc-engine.el +++ b/lisp/progmodes/cc-engine.el @@ -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 |