GNU bug report logs - #15478
cc-mode does not obey electric-indent-mode

Previous Next

Packages: emacs, cc-mode;

Reported by: Stefan Monnier <monnier <at> iro.umontreal.ca>

Date: Sat, 28 Sep 2013 18:12:02 UTC

Severity: normal

Found in version 24.3.50

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

Bug is archived. No further changes may be made.

Full log


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

From: Stefan Monnier <monnier <at> IRO.UMontreal.CA>
To: Alan Mackenzie <acm <at> muc.de>
Cc: 15478 <at> debbugs.gnu.org
Subject: Re: bug#15478: cc-mode does not obey electric-indent-mode
Date: Thu, 03 Oct 2013 10:32:32 -0400
>> > Without electricity, correct indentation would require continual pressing
>> > of the <tab> key.
>> Yes.  Just as is the case in all major modes.
> No.  Electric indentation is completely unneeded in Emacs Lisp Mode,

Nitpicking.

>> That's because *you* like electric-indent-mode.  Not because C is special.
> No, it's not just my preference.

That's what you say, but I don't see the evidence.  So far you've only
pointed to Elisp mode and Python mode as counter examples, but from
where I stand it's more like Elisp and Python are the exceptions (and
as soon as someone improves Elisp indentation for cl-lib constructs
or :keyword arguments, Elisp won't be an exception any more).

> All modes should indent correctly automatically, by default.

Again, you're arguing for enabling electric-indent-mode by default.
I'm not necessarily opposed to it, but it's a different issue than the
one I'm concerned with in this bug-report.

> But you need to hit <tab> _after_ typing the brace, but _before_ typing
> C-j.  This doesn't seem like an effective way of working.  Do you really
> run C Mode without electric indentation?

Of course.  And cc-mode is one of the very few modes where
electric-indent is so "in your face" all the time.

>> >> 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.
>> Why not?
> Because each such distinction is going to be major mode specific.

That's not a good reason, since there's no technical difficulty in
making it possible for a major mode to tell electric-indent-mode which
behavior is desired.

>> > 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).
>> As explained, there's electric-layout-mode for auto-newlining.  Not sure
>> what "clean-ups" is about, but we can probably work something out.
> Clean-ups, for example, remove auto-newlines when it later transpires
> they're unwanted.  For example, one clean-up converts
>     }
>     else
>     {
> to
>     } else {
> on typing the "{".

Ah, right.  I don't see any particular problem here, cc-mode can provide
a c-electric-cleanup-mode (or maybe we can even make it generic, so
other major modes can provide their own cleanup rules).

>> I'm all for improving electric-indent-mode.  And indeed, it needs
>> improvement for indentation-sensitive modes like Python and Haskell.
> Does it even make sense for these modes?

No, it doesn't, which is the needed improvement: make it default to Off
there even if it is enabled globally.

>> > Each major mode needs its own default for e-i-m:
>> I disagree with it: some major modes need their own default because
>> their syntax has something very special, e.g. incompatible with
>> electric-indent-mode (Python/Coffescript/Haskell), ...
> Does that even make sense?  How can Python have its own default, yet C
> not?

Technically, C could have its own default as well, of course.
I just don't see any reason for it.

> The default setting doesn't reflect a user's preference, if that
> preference is ON for C, OFF for Python, and the major mode specific
> optimum for everything else.

Indeed, which is why only very few major modes should override the
global default.  Python has a good reason to override it.  C doesn't.

>> > something like `electric-indent-mode-alist', analogous with
>> > `auto-mode-alist'.  This default would be consulted at mode
>> > initialisation time.
>> I don't see why the major mode can't just set a var in its major-mode
>> function for the rare cases where it can be needed, and why the user
>> can't make his own choice via the major-mode's hook, if needed.
> Because, as so often in this list, we're talking about defaults, not the
> extent to which an experienced user can customise his Emacs.  Defaults
> are important.

My point above was arguing against using an electric-indent-mode-alist
mechanism rather than one of the standard mechanisms (setq-local for the
major-mode or add-hook for the user).  It was not about what the default
should be.

>> > 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".
>> I don't understand what you're suggesting.
> You seem to be suggesting dismantling not only CC Mode's electric
> indentation, but its auto-newlining too.  The generic replacements for
> them are going to be less good.

I don't want them to be less good.  They may be marginally less good, or
slightly different in some corner cases, of course.  But "significantly
less good" would be a bug to fix by improving the generic code.

As already mentioned, fixing this bug report may require fixes not just
in cc-mode but also in electric.el.

> What I'm suggesting is some sort of hook so that electric-indent-mode
> (and electric-layout-mode, too, I suppose) invokes the "electric
> engine" in CC Mode rather than trying to do the electric
> indentation itself.

Sounds OK.


        Stefan




This bug report was last modified 11 years and 92 days ago.

Previous Next


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