ccmode: Electric Keys
4.6 Electric Keys and Keywords
==============================
Most punctuation keys provide “electric” behavior: as well as inserting
themselves they perform some other action, such as reindenting the line.
This reindentation saves you from having to reindent a line manually
after typing, say, a ‘}’. A few keywords, such as ‘else’, also trigger
electric action.
You can inhibit the electric behavior described here by disabling
electric minor mode (Minor Modes).
Common to all these keys is that they only behave electrically when
used in normal code (as contrasted with getting typed in a string
literal or comment). Those which cause re-indentation do so only when
‘c-syntactic-indentation’ has a non-‘nil’ value (which it does by
default).
These keys and keywords are:
‘#’
Pound (bound to ‘c-electric-pound’) is electric when typed as the
first non-whitespace character on a line and not within a macro
definition. In this case, the variable ‘c-electric-pound-behavior’
is consulted for the electric behavior. This variable takes a list
value, although the only element currently defined is ‘alignleft’,
which tells this command to force the ‘#’ character into column
zero. This is useful for entering preprocessor macro definitions.
Pound is not electric in AWK buffers, where ‘#’ starts a comment,
and is bound to ‘self-insert-command’ like any typical printable
character.
‘*’
‘/’
A star (bound to ‘c-electric-star’) or a slash (‘c-electric-slash’)
causes reindentation when you type it as the second component of a
C style block comment opener (‘/*’) or a C++ line comment opener
(‘//’) respectively, but only if the comment opener is the first
thing on the line (i.e., there’s only whitespace before it).
Additionally, you can configure CC Mode so that typing a slash at
the start of a line within a block comment will terminate the
comment. You don’t need to have electric minor mode enabled to get
this behavior. Clean-ups.
In AWK mode, ‘*’ and ‘/’ do not delimit comments and are not
electric.
‘<’
‘>’
A less-than or greater-than sign (bound to ‘c-electric-lt-gt’) is
electric in two circumstances: when it is an angle bracket in a C++
‘template’ declaration (and similar constructs in other languages)
and when it is the second of two ‘<’ or ‘>’ characters in a C++
style stream operator. In either case, the line is reindented.
Angle brackets in C ‘#include’ directives are not electric.
‘(’
‘)’
The normal parenthesis characters ‘(’ and ‘)’ (bound to
‘c-electric-paren’) reindent the current line. This is useful for
getting the closing parenthesis of an argument list aligned
automatically.
You can also configure CC Mode to insert a space automatically
between a function name and the ‘(’ you’ve just typed, and to
remove it automatically after typing ‘)’, should the argument list
be empty. You don’t need to have electric minor mode enabled to
get these actions. Clean-ups.
‘{’
‘}’
Typing a brace (bound to ‘c-electric-brace’) reindents the current
line. Also, one or more newlines might be inserted if auto-newline
minor mode is enabled. Auto-newlines. Additionally, you
can configure CC Mode to compact excess whitespace inserted by
auto-newline mode in certain circumstances. Clean-ups.
‘:’
Typing a colon (bound to ‘c-electric-colon’) reindents the current
line. Additionally, one or more newlines might be inserted if
auto-newline minor mode is enabled. Auto-newlines. If you
type a second colon immediately after such an auto-newline, by
default the whitespace between the two colons is removed, leaving a
C++ scope operator. Clean-ups.
If you prefer, you can insert ‘::’ in a single operation, avoiding
all these spurious reindentations, newlines, and clean-ups.
Other Commands.
‘;’
‘,’
Typing a semicolon or comma (bound to ‘c-electric-semi&comma’)
reindents the current line. Also, a newline might be inserted if
auto-newline minor mode is enabled. Auto-newlines.
Additionally, you can configure CC Mode so that when auto-newline
has inserted whitespace after a ‘}’, it will be removed again when
you type a semicolon or comma just after it. Clean-ups.
-- Command: c-electric-continued-statement
Certain keywords are electric, causing reindentation when they are
preceded only by whitespace on the line. The keywords are those
that continue an earlier statement instead of starting a new one:
‘else’, ‘while’, ‘catch’ (only in C++ and Java) and ‘finally’ (only
in Java).
An example:
for (i = 0; i < 17; i++)
if (a[i])
res += a[i]->offset;
else
Here, the ‘else’ should be indented like the preceding ‘if’, since
it continues that statement. CC Mode will automatically reindent
it after the ‘else’ has been typed in full, since only then is it
possible to decide whether it’s a new statement or a continuation
of the preceding ‘if’.
CC Mode uses Abbrev mode ((emacs)Abbrevs) to accomplish
this. It’s therefore turned on by default in all language modes
except IDL mode, since CORBA IDL doesn’t have any statements.