Subject: Re: bug#15478: cc-mode does not obey electric-indent-mode

From: Alan Mackenzie <[email-masked]>
Date: Wed, 2 Oct 2013 20:07:37 +0000

Hi, Stefan.

On Mon, Sep 30, 2013 at 02:23:55PM -0400, Stefan Monnier wrote:
> > I'm not familiar enough with these other modes to be able to say.  But
> > what exactly are you saying here?  Even if CC Mode is not different from
> > the other modes, that doesn't change the fact that electricity must be
> > enabled by default in CC Mode.

> I don't see anything that requires electric-indent to be enabled by
> default in cc-mode.

Without electricity, correct indentation would require continual pressing
of the <tab> key.  E.g., in C Mode, k&r style (set with C-c .), enter the
following, pressing C-j at the end of each line:

1. int foo (bar)
2. {
3.      if (foo)
4.           |

"|" indicates the position of point.  Now type "{".  With electricity,
the "{" is instantly indented to its correct position under the "if".
Without electricity, the user needs to remember to type <tab> before C-j
on L4.  This is an unacceptable default state, IMAO.

> Most major modes don't enable electric-layout by default (and AFAICT
> most users care more about "indent after newline", which cc-mode
> doesn't enable anyway).

"Indent after newline" seems redundant in CC Mode; the line will have
been electrically indented by the semicolon, brace, or comma typed just
before the C-j.  Are you saying that, in CC Mode, users would prefer
electric indentation on the C-j rather than the semicolon, etc.?  If so,
what evidence do you have for this?

> So, yes, I do think that the default behavior of cc-mode should be changed.

Such a change could involve extensive work - the electric behaviour is
coded individually in defuns like `c-electric-brace' and includes more
electric behaviour than just indentation - for example, auto-newlining.

> > Perhaps not, but there is a good deal of thinking and scheming needed
> > before this can be done.  For CC Mode simply to `and' in the variable
> > electric-indent-mode when testing c-electric-flag would cause breakage,
> > confusion and bug reports.  Or perhaps should CC Mode set a buffer-local
> > copy of e-i-m to t at initialisation?  Should C-c C-l be extended also
> > to toggle e-i-m?  And so on....

> There are several separate issues, and they can be handled somewhat
> separately.  First, let's see what we'd ultimately want to have as
> behavior, disregarding backward compatibility and preservation of
> previous behaviors.

As an exercise, yes.  But disregarding existing behaviour should not be
done frivolously; CC Mode's electric behaviour has been remarkably
stable, with (as far as I am aware) only one complaint about it (not
counting the current one) in at least 12 years (see below).

> For me, I'd like cc-mode to do as little as possible besides adding
> ?\;, ?\{, and ?\} to electric-indent-chars.

These characters should not trigger electric indentation when typed
inside a string or a comment.  electric-indent-mode isn't best placed to
make such distinctions.  It doesn't seem to be the Right Thing to split
the electric activity between electric-indent-mode (for indentation) and
c-electric-brace and friends (for auto-newlining and clean-ups).

> I'm not convinced there's a real need for a key binding that toggles
> electric-indent buffer-locally, but if there is, then I don't see why
> cc-mode needs it more than any other mode.

There was a complaint sometime at or before 2005 that CC Mode text was
"jumping all over the place", from a new Emacs user.  The solution, after
some discussion (in which you were involved) was to introduce
`c-electric-flag' with C-c C-l to toggle it.  That way, the newbie can
easily disable the electricity, yet equally easily experiment with
turning it on as soon as she feels she has got some control back again.
It is a handy toggle to have around when editing chaotically indented
code, or indeed small amounts of code indented differently from the
current style.

#########################################################################

I think electric-indent-mode, as it currently is, is capable of
improvement.  It is a single flag, but really needs to be major-mode
dependent; it fouls up Python indentation (unless that's been recently
fixed) and I think I recall reading that it messed up something in
Outline Mode; yet CC Mode needs electricity.  electric-indent-mode needs
to be buffer local.

Each major mode needs its own default for e-i-m: something like
`electric-indent-mode-alist', analogous with `auto-mode-alist'.  This
default would be consulted at mode initialisation time.

A buffer's setting of e-i-m should also be more than just nil or t.  That
is inflexible to an un-Emacs like degree.  At the very least, there
should be some sort of setting that means "electric indentation is
performed entirely by the major mode".

>         Stefan

-- 
Alan Mackenzie (Nuremberg, Germany).