unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
       [not found] <E1WFSpO-0001e7-Gm@vcs.savannah.gnu.org>
@ 2014-02-18  0:11 ` Stefan Monnier
  2014-02-22 18:27   ` Alan Mackenzie
  0 siblings, 1 reply; 64+ messages in thread
From: Stefan Monnier @ 2014-02-18  0:11 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: emacs-devel

> +  ;; In Emacs 24.4 onwards, prevent Emacs's built in electric indentation from
> +  ;; messing up CC Mode's, and set `c-electric-flag' if `electric-indent-mode'
> +  ;; has been called by the user.
> +  (when (boundp 'electric-indent-inhibit) (setq electric-indent-inhibit t))
> +  (when (and (boundp 'electric-indent-mode-has-been-called)
> +	     (> electric-indent-mode-has-been-called 1))
> +    (setq c-electric-flag electric-indent-mode))

Could you explain what problem this is trying to avoid?

> +  ;; Emacs has en/disabled `electric-indent-mode'.  Propagate this through to
> +  ;; each CC Mode buffer.
> +  (when (and (boundp 'electric-indent-mode-has-been-called)
> +	     (> electric-indent-mode-has-been-called 1))
> +    (mapc (lambda (buf)
> +	    (with-current-buffer buf
> +	      (when c-buffer-is-cc-mode
> +		;; Don't use `c-toggle-electric-state' here due to recursion.
> +		(setq c-electric-flag electric-indent-mode)
> +		(c-update-modeline))))
> +	  (buffer-list))))

And could you also explain what this one is trying to avoid?


        Stefan



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-02-18  0:11 ` [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478 Stefan Monnier
@ 2014-02-22 18:27   ` Alan Mackenzie
  2014-02-25  3:24     ` Stefan Monnier
  0 siblings, 1 reply; 64+ messages in thread
From: Alan Mackenzie @ 2014-02-22 18:27 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

Hi, Stefan.

On Mon, Feb 17, 2014 at 07:11:18PM -0500, Stefan Monnier wrote:
> > +  ;; In Emacs 24.4 onwards, prevent Emacs's built in electric indentation from
> > +  ;; messing up CC Mode's, and set `c-electric-flag' if `electric-indent-mode'
> > +  ;; has been called by the user.
> > +  (when (boundp 'electric-indent-inhibit) (setq electric-indent-inhibit t))
> > +  (when (and (boundp 'electric-indent-mode-has-been-called)
> > +	     (> electric-indent-mode-has-been-called 1))
> > +    (setq c-electric-flag electric-indent-mode))

> Could you explain what problem this is trying to avoid?

Setting electric-indent-inhibit is intended to protect CC Mode from the
dangers of CC Mode's electricity clashing with electric.el's.  The other
bit takes over the value of c-electric-indent-mode into CC Mode only
when it has been set by the user, thus preventing electric.el's default
overriding CC Mode's.  (As we've already discussed, CC Mode's indentation
doesn't work properly with electric indentation disabled.)

> > +  ;; Emacs has en/disabled `electric-indent-mode'.  Propagate this through to
> > +  ;; each CC Mode buffer.
> > +  (when (and (boundp 'electric-indent-mode-has-been-called)
> > +	     (> electric-indent-mode-has-been-called 1))
> > +    (mapc (lambda (buf)
> > +	    (with-current-buffer buf
> > +	      (when c-buffer-is-cc-mode
> > +		;; Don't use `c-toggle-electric-state' here due to recursion.
> > +		(setq c-electric-flag electric-indent-mode)
> > +		(c-update-modeline))))
> > +	  (buffer-list))))

> And could you also explain what this one is trying to avoid?

Basically the same thing.  It's preventing an inopportune default (as
contrasted with an explicit user setting) overriding CC Mode's default.

>         Stefan

-- 
Alan Mackenzie (Nuremberg, Germany).



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-02-22 18:27   ` Alan Mackenzie
@ 2014-02-25  3:24     ` Stefan Monnier
  2014-02-28 19:50       ` Alan Mackenzie
  0 siblings, 1 reply; 64+ messages in thread
From: Stefan Monnier @ 2014-02-25  3:24 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: emacs-devel

> The other bit takes over the value of c-electric-indent-mode into CC
> Mode only when it has been set by the user, thus preventing
> electric.el's default overriding CC Mode's.

For that I think it's better to only obey electric-indent-mode if
Emacs>24.3 rather than use the electric-indent-mode-has-been-called crutch.

>> > +  ;; Emacs has en/disabled `electric-indent-mode'.  Propagate this through to
>> > +  ;; each CC Mode buffer.
>> > +  (when (and (boundp 'electric-indent-mode-has-been-called)
>> > +	     (> electric-indent-mode-has-been-called 1))
>> > +    (mapc (lambda (buf)
>> > +	    (with-current-buffer buf
>> > +	      (when c-buffer-is-cc-mode
>> > +		;; Don't use `c-toggle-electric-state' here due to recursion.
>> > +		(setq c-electric-flag electric-indent-mode)
>> > +		(c-update-modeline))))
>> > +	  (buffer-list))))
>> And could you also explain what this one is trying to avoid?
> Basically the same thing.  It's preventing an inopportune default (as
> contrasted with an explicit user setting) overriding CC Mode's default.

Looks quite different since it checks (>
electric-indent-mode-has-been-called 1), but if you say it's the same,
then I'll remove electric-indent-mode-has-been-called and let you check
Emacs's version instead.


        Stefan



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-02-25  3:24     ` Stefan Monnier
@ 2014-02-28 19:50       ` Alan Mackenzie
  2014-03-01 15:57         ` Stefan Monnier
  0 siblings, 1 reply; 64+ messages in thread
From: Alan Mackenzie @ 2014-02-28 19:50 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

Hi, Stefan.

On Mon, Feb 24, 2014 at 10:24:23PM -0500, Stefan Monnier wrote:
> > The other bit takes over the value of c-electric-indent-mode into CC
> > Mode only when it has been set by the user, thus preventing
> > electric.el's default overriding CC Mode's.

> For that I think it's better to only obey electric-indent-mode if
> Emacs>24.3 rather than use the electric-indent-mode-has-been-called crutch.

That does not achieve the same effect.

> >> > +  ;; Emacs has en/disabled `electric-indent-mode'.  Propagate this through to
> >> > +  ;; each CC Mode buffer.
> >> > +  (when (and (boundp 'electric-indent-mode-has-been-called)
> >> > +	     (> electric-indent-mode-has-been-called 1))
> >> > +    (mapc (lambda (buf)
> >> > +	    (with-current-buffer buf
> >> > +	      (when c-buffer-is-cc-mode
> >> > +		;; Don't use `c-toggle-electric-state' here due to recursion.
> >> > +		(setq c-electric-flag electric-indent-mode)
> >> > +		(c-update-modeline))))
> >> > +	  (buffer-list))))
> >> And could you also explain what this one is trying to avoid?
> > Basically the same thing.  It's preventing an inopportune default (as
> > contrasted with an explicit user setting) overriding CC Mode's default.

> Looks quite different since it checks (>
> electric-indent-mode-has-been-called 1), ....

Both bits of code check (> electric-indent-mode-has-been-called 1), hence
they are very similar, not quite different.

> .... but if you say it's the same, then I'll remove
> electric-indent-mode-has-been-called and let you check Emacs's version
> instead.

Please don't do this.  I meant literally what I wrote.

A better solution would be to provide a less ugly way of checking whether
a user has called electric-indent-mode - possibly some enhancement of
define-minor-mode.  I can't think of any at the moment.

>         Stefan

-- 
Alan Mackenzie (Nuremberg, Germany).



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-02-28 19:50       ` Alan Mackenzie
@ 2014-03-01 15:57         ` Stefan Monnier
  2014-03-02 11:51           ` Alan Mackenzie
  0 siblings, 1 reply; 64+ messages in thread
From: Stefan Monnier @ 2014-03-01 15:57 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: emacs-devel

>> > The other bit takes over the value of c-electric-indent-mode into CC
>> > Mode only when it has been set by the user, thus preventing
>> > electric.el's default overriding CC Mode's.
>> For that I think it's better to only obey electric-indent-mode if
>> Emacs>24.3 rather than use the electric-indent-mode-has-been-called crutch.
> That does not achieve the same effect.

Can you give a scenario where the result is different?

> Please don't do this.  I meant literally what I wrote.

Yes, but I hate this electric-indent-mode-has-been-called crutch, so we
need a different solution.

> A better solution would be to provide a less ugly way of checking whether
> a user has called electric-indent-mode

A different way would still be ugly, because this requirement is itself ugly.
We need to find a solution that does not depend on *how* we got to this state.


        Stefan



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-01 15:57         ` Stefan Monnier
@ 2014-03-02 11:51           ` Alan Mackenzie
  2014-03-04  3:48             ` Stefan Monnier
  0 siblings, 1 reply; 64+ messages in thread
From: Alan Mackenzie @ 2014-03-02 11:51 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

Hello, Stefan.

On Sat, Mar 01, 2014 at 10:57:34AM -0500, Stefan Monnier wrote:
> >> > The other bit takes over the value of c-electric-indent-mode into CC
> >> > Mode only when it has been set by the user, thus preventing
> >> > electric.el's default overriding CC Mode's.
> >> For that I think it's better to only obey electric-indent-mode if
> >> Emacs>24.3 rather than use the electric-indent-mode-has-been-called crutch.

Using version numbers to check for features is not exactly clean coding.

> > That does not achieve the same effect.

> Can you give a scenario where the result is different?

The default for electric-indent-mode is changed in a future Emacs
version.

> > Please don't do this.  I meant literally what I wrote.

> Yes, but I hate this electric-indent-mode-has-been-called crutch, so we
> need a different solution.

> > A better solution would be to provide a less ugly way of checking whether
> > a user has called electric-indent-mode

> A different way would still be ugly, because this requirement is itself
> ugly.  We need to find a solution that does not depend on *how* we got
> to this state.

By "this state" you mean what?  The minor mode electric-indent-mode can
be in any of three states: (i) left at its default, (ii) set (or toggled)
to t, (iii) set (or toggled) to nil.

The challenge is to distinguish between (i) and ((ii) or (iii)).

>         Stefan

-- 
Alan Mackenzie (Nuremberg, Germany).



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-02 11:51           ` Alan Mackenzie
@ 2014-03-04  3:48             ` Stefan Monnier
  2014-03-08 22:58               ` Alan Mackenzie
  0 siblings, 1 reply; 64+ messages in thread
From: Stefan Monnier @ 2014-03-04  3:48 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: emacs-devel

> Using version numbers to check for features is not exactly clean coding.

Much less hideous than checking how many times a function was called.

> The default for electric-indent-mode is changed in a future Emacs
> version.

So it's hypothetical.  We'll cross this bridge if/when we get there.

> The challenge is to distinguish between (i) and ((ii) or (iii)).

No, we should only care about "enabled" and "disabled".


        Stefan



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-04  3:48             ` Stefan Monnier
@ 2014-03-08 22:58               ` Alan Mackenzie
  2014-03-09  1:57                 ` Stefan Monnier
  0 siblings, 1 reply; 64+ messages in thread
From: Alan Mackenzie @ 2014-03-08 22:58 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

Hello, Stefan.

On Mon, Mar 03, 2014 at 10:48:50PM -0500, Stefan Monnier wrote:
> > Using version numbers to check for features is not exactly clean coding.

> Much less hideous than checking how many times a function was called.

Uh??  Why are you comparing the checking of Emacs's version number with
testing whether a function has been called?

There lacks a clean way of determining if a minor-mode function has been
called.  There is a clear need for such a facility.

> > The default for electric-indent-mode is changed in a future Emacs
> > version.

> So it's hypothetical.  We'll cross this bridge if/when we get there.

> > The challenge is to distinguish between (i) and ((ii) or (iii)).

What exactly do (i), (ii), and (iii) mean?  You have cut so much out of
my post that the meaning has been lost.  This is extremely annoyinng, and
you do this frequently.  Could you be less severe with your cutting in
the future, please.

> No, we should only care about "enabled" and "disabled".

That's a fairly contentious opinion, not backed up by any reasoning.
Would you care to give your reasons why "default state" is not to be
cared about?

As we have discussed before, it is essential that c-electric-flag be
enabled by default for CC Mode buffers.  Without it, indentation would
need to be done manually, e.g. by continual use of the tab key.  Yet
c-electric-flag, a buffer local flag, is now inextricably coupled to
electric-indent-mode, a crude global flag.  A user wishing to disable
electric-indent-mode for some random buffer will find automatic
indentation broken in her C Mode buffers.

There is no mechanism provided to users by electric-indent-mode to enable
it selectively in a buffer.  Even the undocumented
electric-indent-local-mode doesn't work properly, as you admitted
recently.

In the massive confusion and possible protest that will follow in the
wake of the release of electric-indent-mode, one of your options will be
to disable the mode by default.  Would you please give your word, as a
gentleman, that whatever transpires, after the sequence emacs -Q, C-x C-f
foo.c, foo.c's copy of c-electric-flag will always be t.

>         Stefan

-- 
Alan Mackenzie (Nuremberg, Germany).



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-08 22:58               ` Alan Mackenzie
@ 2014-03-09  1:57                 ` Stefan Monnier
  2014-03-09 12:37                   ` Alan Mackenzie
  0 siblings, 1 reply; 64+ messages in thread
From: Stefan Monnier @ 2014-03-09  1:57 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: emacs-devel

> There lacks a clean way of determining if a minor-mode function has been
> called.  There is a clear need for such a facility.

I don't see what's clear about this supposed need.

> As we have discussed before, it is essential that c-electric-flag be
> enabled by default for CC Mode buffers.

And as you probably remember, I disagree.  What is essential for me is
that C-mode have the same behavior as other modes.  I.e. obey
electric-indent-mode.


        Stefan



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-09  1:57                 ` Stefan Monnier
@ 2014-03-09 12:37                   ` Alan Mackenzie
  2014-03-10  3:37                     ` Stefan Monnier
  0 siblings, 1 reply; 64+ messages in thread
From: Alan Mackenzie @ 2014-03-09 12:37 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

Hello, Stefan.

Thanks for ignoring practically all of my last email.  That really made
my day.

On Sat, Mar 08, 2014 at 08:57:57PM -0500, Stefan Monnier wrote:
> > There lacks a clean way of determining if a minor-mode function has been
> > called.  There is a clear need for such a facility.

> I don't see what's clear about this supposed need.

So it would seem.

> > As we have discussed before, it is essential that c-electric-flag be
> > enabled by default for CC Mode buffers.

> And as you probably remember, I disagree.

Yes, I remember well.  Your disagreement consisted of noting that you
personally like typing tab all the time, rather than having lines of code
indent automatically.

> What is essential for me is that C-mode have the same behavior as other
> modes.  I.e. obey electric-indent-mode.

Major modes provide different behaviours, behaviours appropriate to the
type of text being edited.  That's why we have major modes.

Electric indentation in CC Mode is not broken.  You're determined,
nevertheless, to fix it.  The consequences for Emacs cannot be good.

>         Stefan

-- 
Alan Mackenzie (Nuremberg, Germany).



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-09 12:37                   ` Alan Mackenzie
@ 2014-03-10  3:37                     ` Stefan Monnier
  2014-03-10  6:59                       ` Glenn Morris
                                         ` (2 more replies)
  0 siblings, 3 replies; 64+ messages in thread
From: Stefan Monnier @ 2014-03-10  3:37 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: emacs-devel

> Thanks for ignoring practically all of my last email.
> That really made my day.

OK, since you insist, see detailed answers below.

>> And as you probably remember, I disagree.
> Yes, I remember well.  Your disagreement consisted of noting that you
> personally like typing tab all the time, rather than having lines of code
> indent automatically.

No, my personal preference has nothing to do with it.  That would affect
my ~/.emacs, not Emacs's own defaults.

>> What is essential for me is that C-mode have the same behavior as other
>> modes.  I.e. obey electric-indent-mode.
> Major modes provide different behaviours, behaviours appropriate to the
> type of text being edited.  That's why we have major modes.

Right.  But I don't see what is so special about the C language that
makes c-electric-flag (aka electric-indent-mode) indispensable in c-mode.

Better don't bother answering: electric-indent-mode is enabled by
default anyway, so there's really no problem here.

The question is really: why do you need to know if electric-indent-mode
was called (and even how many times)?  From what I understand of your
previous answers it is because you want to only obey
electric-indent-mode if the user changed the default.  If so, what is
wrong about testing Emacs's version instead?

AFAIK your only worry is when electric-indent-mode is nil to make sure
that the user really meant it.  But if you test Emacs's version to make
sure it's >24.3, then electric-indent-mode can only be nil if the user
decided so.  So you don't need to know if electric-indent-mode has been
called nor how many times.


        Stefan


> > No, we should only care about "enabled" and "disabled".
> That's a fairly contentious opinion, not backed up by any reasoning.
> Would you care to give your reasons why "default state" is not to be
> cared about?

You know very well:
some major modes have historically setup some keys to electrically
reindent the current line.  And some haven't.  This just reflects
the personal preference of the major mode's author(s).  It also means
that a user who doesn't like this behavior needs to disable it
separately for each and every such major mode (which includes figuring
out how to disable it, which is not standardized either).  And it also
means that a user who does like this behavior will have to tweak the
other major modes.

Hence my introducing electric-indent-mode to standardize the behavior
across modes.  As is too often the case, CC-mode is the only one that
doesn't want to get in line.

> As we have discussed before, it is essential that c-electric-flag be
> enabled by default for CC Mode buffers.  Without it, indentation would
> need to be done manually, e.g. by continual use of the tab key.

Right: when electric-indent-mode is nil, it means that the user wants to
have control over when auto-indentation is performed.  That's not a bug.

On the contrary: it is crucial to stay sane when you're editing code
using an indentation convention that's different from the one supported
by the major mode.

But indeed, electric-indent-mode is enabled by default, because we
recognize that it is overall better to try and maintain indentation
without forcing the user to constantly use TAB.

> Yet c-electric-flag, a buffer local flag, is now inextricably coupled
> to electric-indent-mode, a crude global flag.  A user wishing to
> disable electric-indent-mode for some random buffer will find
> automatic indentation broken in her C Mode buffers.

No, she will find it correctly disabled, according to her wish expressed
by the fact that she disabled electric-indent-mode.

> There is no mechanism provided to users by electric-indent-mode to enable
> it selectively in a buffer.

Alan, please be constructive: you know full well this is untrue.

> Even the undocumented electric-indent-local-mode

The fact that it's not yet documented is irrelevant, since that's
a problem that needs to be addressed anyway (and rather sooner than
later since it's one of the hurdles remaining for the trunk to re-open).

> doesn't work properly, as you admitted recently.

Right, it has some bugs open, and we'll have to fix them for 24.4.

> In the massive confusion and possible protest that will follow in the
> wake of the release of electric-indent-mode, one of your options will be
> to disable the mode by default.

Come on, Alan.  You know me better than that.

And FWIW you've been the strongest voice *against* enabling
electric-indent-mode, oddly enough.

> Would you please give your word, as a gentleman, that whatever
> transpires, after the sequence emacs -Q, C-x C-f foo.c, foo.c's copy
> of c-electric-flag will always be t.

No, I can't, sorry: if it were up to me, c-electric-flag would not even
exist any more.

But I can give you my word that "automatic indentation as a side effect
of normal editing" will be enabled by default in programming modes,
including C-like modes, yes.


        Stefan



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-10  3:37                     ` Stefan Monnier
@ 2014-03-10  6:59                       ` Glenn Morris
  2014-03-10 12:24                       ` João Távora
  2014-03-16 22:35                       ` Alan Mackenzie
  2 siblings, 0 replies; 64+ messages in thread
From: Glenn Morris @ 2014-03-10  6:59 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Alan Mackenzie, emacs-devel

Stefan Monnier wrote:

>> Even the undocumented electric-indent-local-mode
>
> The fact that it's not yet documented is irrelevant, since that's
> a problem that needs to be addressed anyway (and rather sooner than
> later since it's one of the hurdles remaining for the trunk to re-open).

Since it doesn't even have a NEWS entry, don't hold your breath.



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-10  3:37                     ` Stefan Monnier
  2014-03-10  6:59                       ` Glenn Morris
@ 2014-03-10 12:24                       ` João Távora
  2014-03-10 18:30                         ` Stefan Monnier
  2014-03-16 22:35                       ` Alan Mackenzie
  2 siblings, 1 reply; 64+ messages in thread
From: João Távora @ 2014-03-10 12:24 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Alan Mackenzie, emacs-devel

Stefan Monnier <monnier@iro.umontreal.ca> writes:

> No, I can't, sorry: if it were up to me, c-electric-flag would not even
> exist any more.

FWIW, I've just noticed that when `electric-pair-mode' is enabled in
c-mode, it's `electric-pair-backward-delete-char' command it not
working, since c-mode rebinds it to `c-electric-backspace'.

It works when I unbind `c-electric-backspace' from
`c-mode-base-map'. All other autopairing/autoskipping works well.

Perhaps a lesser problem since `electric-pair-mode' is not enabled by
default.

There might also be non-intrusive solutions on elec-pair.el's
side. Other modes like python-mode also like to redefine the backspace
key. They all seem to call backward-delete-char-untabify eventually, so
maybe somehow transferring `electric-pair-mode's behaviour there is a
good idea.

Should I open a bug report?

João





^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-10 12:24                       ` João Távora
@ 2014-03-10 18:30                         ` Stefan Monnier
  0 siblings, 0 replies; 64+ messages in thread
From: Stefan Monnier @ 2014-03-10 18:30 UTC (permalink / raw)
  To: João Távora; +Cc: Alan Mackenzie, emacs-devel

> Should I open a bug report?

Yes.


        Stefan



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-10  3:37                     ` Stefan Monnier
  2014-03-10  6:59                       ` Glenn Morris
  2014-03-10 12:24                       ` João Távora
@ 2014-03-16 22:35                       ` Alan Mackenzie
  2014-03-17 15:48                         ` Stefan
  2 siblings, 1 reply; 64+ messages in thread
From: Alan Mackenzie @ 2014-03-16 22:35 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

Hi, Stefan.

On Sun, Mar 09, 2014 at 11:37:36PM -0400, Stefan Monnier wrote:

> >> What is essential for me is that C-mode have the same behavior as other
> >> modes.  I.e. obey electric-indent-mode.
> > Major modes provide different behaviours, behaviours appropriate to the
> > type of text being edited.  That's why we have major modes.

> Right.  But I don't see what is so special about the C language that
> makes c-electric-flag (aka electric-indent-mode) indispensable in c-mode.

CC Mode modes don't indent correctly automatically without electric
indentation.  This is in the typical case where lines of code are being
typed in, line by line.

> Better don't bother answering: electric-indent-mode is enabled by
> default anyway, so there's really no problem here.

Good!

> The question is really: why do you need to know if electric-indent-mode
> was called (and even how many times)?  From what I understand of your
> previous answers it is because you want to only obey
> electric-indent-mode if the user changed the default.

Not quite.  I want the default for CC Mode modes to be t, regardless of
any system wide default.  I think it likely there will be other major
modes which need a default of nil.  Once a user has positively indicated
which way she wants the setting, then that is fine.

> If so, what is wrong about testing Emacs's version instead?

????

> AFAIK your only worry is when electric-indent-mode is nil to make sure
> that the user really meant it.  But if you test Emacs's version to make
> sure it's >24.3, then electric-indent-mode can only be nil if the user
> decided so.

electric-indent-mode is, essentially, new code, and its default doesn't
appear yet to have stabilised.  As I've already said, I anticipate a
storm of protest and a sea of confusion over this new default.  In order
to quell the protest, there will be the option of making the default nil
in future versions.  It would be good to have CC Mode decoupled from
this.

> So you don't need to know if electric-indent-mode has been called nor
> how many times.


>         Stefan


> > > No, we should only care about "enabled" and "disabled".
> > That's a fairly contentious opinion, not backed up by any reasoning.
> > Would you care to give your reasons why "default state" is not to be
> > cared about?

> You know very well:
> some major modes have historically setup some keys to electrically
> reindent the current line.  And some haven't.  This just reflects
> the personal preference of the major mode's author(s).

No.  It reflects the intrinsic needs of the major mode.  CC Mode needs
it, Emacs Lisp Mode is never going to have a use for it, Text Mode needs
it nil, and in some modes, electric indentation plain doesn't work
(python, for example).

> It also means that a user who doesn't like this behavior needs to
> disable it separately for each and every such major mode (which
> includes figuring out how to disable it, which is not standardized
> either).  And it also means that a user who does like this behavior
> will have to tweak the other major modes.

I think you are wrong in your tacit assumption that liking of e-i-m is
person dependent rather than major mode dependent.

> Hence my introducing electric-indent-mode to standardize the behavior
> across modes.  As is too often the case, CC-mode is the only one that
> doesn't want to get in line.

The way electric-indent-mode was implemented seems optimised to maximise
the difficulty of integrating CC Mode with it.  My main concern over this
integration has been avoiding loss of or damage to functionality.  CC
Mode's electric indentation is essentially 100% perfect, all the rough
edges and conflicts having been debated and settled in long forgotten 20
year old exchanges.  Have you ever wondered why RET and C-j aren't
electric keys in CC Mode?

Compatibility with stand-alone CC Mode has also been of some concern.

> > As we have discussed before, it is essential that c-electric-flag be
> > enabled by default for CC Mode buffers.  Without it, indentation would
> > need to be done manually, e.g. by continual use of the tab key.

> Right: when electric-indent-mode is nil, it means that the user wants to
> have control over when auto-indentation is performed.  That's not a bug.

This is the case after e-i-m has been SET to nil.  What is a bug (IMNSHO)
is that this selection is not buffer local.  Other similar features are
implemented as buffer local with a "global-*" variant: font-lock-mode,
hi-lock-mode, .....  There are at least 17 such minor modes with a global
variant.  electric-indent-mode is going to be inconsistent with these
other modes.  Why couldn't we have had electric-indent-mode and
global-electric-indent-mode?

> On the contrary: it is crucial to stay sane when you're editing code
> using an indentation convention that's different from the one supported
> by the major mode.

That is indeed the use case for no electric indentation (with the lesser
one of newbies who can't yet cope with it).

> But indeed, electric-indent-mode is enabled by default, because we
> recognize that it is overall better to try and maintain indentation
> without forcing the user to constantly use TAB.

Yes.

> > Yet c-electric-flag, a buffer local flag, is now inextricably coupled
> > to electric-indent-mode, a crude global flag.  A user wishing to
> > disable electric-indent-mode for some random buffer will find
> > automatic indentation broken in her C Mode buffers.

> No, she will find it correctly disabled, according to her wish expressed
> by the fact that she disabled electric-indent-mode.

You're assuming here that she will be disabling e-i-m due to a general
dislike of electricity, rather than having an isolated chaotically indented
buffer.

> > There is no mechanism provided to users by electric-indent-mode to enable
> > it selectively in a buffer.

> Alan, please be constructive: you know full well this is untrue.

> > Even the undocumented electric-indent-local-mode

> The fact that it's not yet documented is irrelevant, since that's
> a problem that needs to be addressed anyway (and rather sooner than
> later since it's one of the hurdles remaining for the trunk to re-open).

:-)

> > doesn't work properly, as you admitted recently.

> Right, it has some bugs open, and we'll have to fix them for 24.4.

Double :-).  On 2014-02-18 you opined "I don't think it's worth the
trouble" to fix.  I feel relieved it will be getting fixed now.

> > In the massive confusion and possible protest that will follow in the
> > wake of the release of electric-indent-mode, one of your options will be
> > to disable the mode by default.

> Come on, Alan.  You know me better than that.

> And FWIW you've been the strongest voice *against* enabling
> electric-indent-mode, oddly enough.

I don't think so.  I have strongly objected to the design features of
electric-indent-mode and protested against the collateral effects they
have on the rest of Emacs.

> > Would you please give your word, as a gentleman, that whatever
> > transpires, after the sequence emacs -Q, C-x C-f foo.c, foo.c's copy
> > of c-electric-flag will always be t.

> No, I can't, sorry: if it were up to me, c-electric-flag would not even
> exist any more.

Yes, I'm sure.  The flag is needed for all Emacsen which aren't GNU Emacs
24.4+.  It is well tested, works, seems to be used, and has never
elicited complaints from users.

> But I can give you my word that "automatic indentation as a side effect
> of normal editing" will be enabled by default in programming modes,
> including C-like modes, yes.

Thanks.  That will do.

>         Stefan

-- 
Alan Mackenzie (Nuremberg, Germany).



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-16 22:35                       ` Alan Mackenzie
@ 2014-03-17 15:48                         ` Stefan
  2014-03-19 22:42                           ` Alan Mackenzie
  0 siblings, 1 reply; 64+ messages in thread
From: Stefan @ 2014-03-17 15:48 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: emacs-devel

>> Right.  But I don't see what is so special about the C language that
>> makes c-electric-flag (aka electric-indent-mode) indispensable in c-mode.
> CC Mode modes don't indent correctly automatically without electric
> indentation.

And the same holds true for all other programming modes.
Nothing special here.

For some major modes (like Lisp), using newline-and-indent is sufficient
to indent code as you type it.  For most others,
reindent-then-newline-and-indent is needed instead.

I don't know of any mode where electric behavior of something else than
the newline character is needed for the "typical case where lines of
code are being typed in, line by line".  But since this "typical case"
is not that typical, several major modes elect to make a few other keys
electric so as to try and maintain indentation even when code is being
modified rather than just being written linearly.

Maybe the special part of c-mode is that you used a set of electric
chars which is sufficient and yet does not include newline.

> Not quite.  I want the default for CC Mode modes to be t, regardless of
> any system wide default.

I know you steadfastly refuse to recognize that this is your personal
preference rather than a requirement of the languages you support.

> I think you are wrong in your tacit assumption that liking of e-i-m is
> person dependent rather than major mode dependent.

There are details about *how* e-i-m works which depend on the mode.
Yes.  That's why e-i-m has mode-local settings (e.g. which keys are
electric, or whether the indentation algorithm can reliably reindent).

But the global e-i-m setting is about deciding whether the user wants
his code to be automatically indented as he types (to the extent
possible).  It is *defined* as a person-dependent preference.

> The way electric-indent-mode was implemented seems optimised to maximise
> the difficulty of integrating CC Mode with it.

Of course, my main objective was to piss you off and make your
life miserable.  It hasn't worked as well as planned, but this is not
quite over yet ;-)


        Stefan



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-17 15:48                         ` Stefan
@ 2014-03-19 22:42                           ` Alan Mackenzie
  2014-03-20  1:46                             ` Stefan
  0 siblings, 1 reply; 64+ messages in thread
From: Alan Mackenzie @ 2014-03-19 22:42 UTC (permalink / raw)
  To: Stefan; +Cc: emacs-devel

Hello, Stefan.

On Mon, Mar 17, 2014 at 11:48:16AM -0400, Stefan wrote:
> >> Right.  But I don't see what is so special about the C language that
> >> makes c-electric-flag (aka electric-indent-mode) indispensable in c-mode.
> > CC Mode modes don't indent correctly automatically without electric
> > indentation.

> And the same holds true for all other programming modes.

No it doesn't.  We both agree that Emacs Lisp Mode has no use whatsoever
for electric indentation.  Clearly, only languages where a line's
indentation is dependent on the contents of that line can benefit from
electric indentation.

> Nothing special here.

> I don't know of any mode where electric behavior of something else than
> the newline character is needed for the "typical case where lines of
> code are being typed in, line by line".

Then I suggest you think hard about the disadvantages of RET as an
electric indentation key.  If there weren't such disadvantages, CC Mode
would have been using it for 20 years.

> But since this "typical case" is not that typical, several major modes
> elect to make a few other keys electric so as to try and maintain
> indentation even when code is being modified rather than just being
> written linearly.

Yes.

> Maybe the special part of c-mode is that you used a set of electric
> chars which is sufficient and yet does not include newline.

Newline is a poor choice for an electric indentation key.

> > Not quite.  I want the default for CC Mode modes to be t, regardless of
> > any system wide default.

> I know you steadfastly refuse to recognize that this is your personal
> preference rather than a requirement of the languages you support.

You're not going to accept reasoned argument here, so I think there's no
point continuing this line of discussion.

> > I think you are wrong in your tacit assumption that liking of e-i-m is
> > person dependent rather than major mode dependent.

> There are details about *how* e-i-m works which depend on the mode.
> Yes.  That's why e-i-m has mode-local settings (e.g. which keys are
> electric, or whether the indentation algorithm can reliably reindent).

Any "indentation algorithm" can reliably reindent.  It is the context in
which the algorithm is used which is important, not the algorithm itself.

> But the global e-i-m setting is about deciding whether the user wants
> his code to be automatically indented as he types (to the extent
> possible).  It is *defined* as a person-dependent preference.

Clearly.  I am pointing out that this definition is perhaps a suboptimal
one.  Your scheme makes it difficult for a user to set up a major mode as
being non e-i-m, or even an individual buffer.

> > The way electric-indent-mode was implemented seems optimised to maximise
> > the difficulty of integrating CC Mode with it.

> Of course, my main objective was to piss you off and make your
> life miserable.  It hasn't worked as well as planned, but this is not
> quite over yet ;-)

Not even that.  You were in so much of a hurry to reinvent the wheel,
that you were oblivious of perfectly round wheels with smooth bearings
which had been in existence for ~20 years.

>         Stefan

-- 
Alan Mackenzie (Nuremberg, Germany).



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-19 22:42                           ` Alan Mackenzie
@ 2014-03-20  1:46                             ` Stefan
  2014-03-20  8:35                               ` Thien-Thi Nguyen
  2014-03-22 13:13                               ` Alan Mackenzie
  0 siblings, 2 replies; 64+ messages in thread
From: Stefan @ 2014-03-20  1:46 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: emacs-devel

>> And the same holds true for all other programming modes.
> No it doesn't.  We both agree that Emacs Lisp Mode has no use whatsoever
> for electric indentation.

No, I don't agree.  First because most people don't use C-j but use
RET instead, and second because typing text linearly is far from being
the only important editing pattern.

> Then I suggest you think hard about the disadvantages of RET as an
> electric indentation key.  If there weren't such disadvantages, CC Mode
> would have been using it for 20 years.

I need your help here, I'm afraid.  And I'm obviously not the only,
because it's very common for text editors to "auto-indent on RET"
(either by default, or via a config setting).

>> There are details about *how* e-i-m works which depend on the mode.
>> Yes.  That's why e-i-m has mode-local settings (e.g. which keys are
>> electric, or whether the indentation algorithm can reliably reindent).
> Any "indentation algorithm" can reliably reindent.

No: python-mode, haskell-mode, and coffeescript-mode can't.

> Clearly.  I am pointing out that this definition is perhaps a suboptimal
> one.

I don't see what you mean by "definition" not "suboptimal".

> Your scheme makes it difficult for a user to set up a major mode as
> being non e-i-m, or even an individual buffer.

How so?

> Not even that.  You were in so much of a hurry to reinvent the wheel,
> that you were oblivious of perfectly round wheels with smooth bearings
> which had been in existence for ~20 years.

No, I know those wheels very well, because I suffered through many of
them.  The problem is they're not modular: your rebinding of ?{ to make
it auto-indent means that my global binding of ?{ to make it auto-pair
doesn't work in c-mode.


        Stefan



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-20  1:46                             ` Stefan
@ 2014-03-20  8:35                               ` Thien-Thi Nguyen
  2014-03-21  8:24                                 ` João Távora
  2014-03-22 13:13                               ` Alan Mackenzie
  1 sibling, 1 reply; 64+ messages in thread
From: Thien-Thi Nguyen @ 2014-03-20  8:35 UTC (permalink / raw)
  To: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 680 bytes --]

() Stefan <monnier@iro.umontreal.ca>
() Wed, 19 Mar 2014 21:46:03 -0400

   [...] because most people don't use C-j but use RET instead

Drat, another case where i am revealed to be not like Most People.  :-/

Seriously, typing RET often is a good way to twist the wrist and inflame
the nerves therein.  Personally, i avoid it as much as possible; when i
need to invoke the ‘newline’ command, i type ‘C-m’.

(end random data point)

-- 
Thien-Thi Nguyen
   GPG key: 4C807502
   (if you're human and you know it)
      read my lisp: (responsep (questions 'technical)
                               (not (via 'mailing-list)))
                     => nil

[-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-20  8:35                               ` Thien-Thi Nguyen
@ 2014-03-21  8:24                                 ` João Távora
  0 siblings, 0 replies; 64+ messages in thread
From: João Távora @ 2014-03-21  8:24 UTC (permalink / raw)
  To: emacs-devel

Thien-Thi Nguyen <ttn@gnu.org> writes:

>    [...] because most people don't use C-j but use RET instead
>
> Drat, another case where i am revealed to be not like Most People.
> :-/
> [...]
> need to invoke the ‘newline’ command, i type ‘C-m’.

But you are like most people, C-m *is* RET. By default I think.

J



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-20  1:46                             ` Stefan
  2014-03-20  8:35                               ` Thien-Thi Nguyen
@ 2014-03-22 13:13                               ` Alan Mackenzie
  2014-03-22 16:14                                 ` Stefan
  1 sibling, 1 reply; 64+ messages in thread
From: Alan Mackenzie @ 2014-03-22 13:13 UTC (permalink / raw)
  To: Stefan; +Cc: emacs-devel

Hello, Stefan.

On Wed, Mar 19, 2014 at 09:46:03PM -0400, Stefan wrote:
> >> And the same holds true for all other programming modes.
> > No it doesn't.  We both agree that Emacs Lisp Mode has no use whatsoever
> > for electric indentation.

> No, I don't agree.  First because most people don't use C-j but use
> RET instead, and second because typing text linearly is far from being
> the only important editing pattern.

????  That's a non-sequitur.  The indentation of an elisp line of code is
solely dependent on the the lines before it - its indentation is
completely determined before any of its contents are typed in.  Therefore
there is nothing to be gained by reindenting this line at any subsequent
time, i.e. electric indentation.

Whether a user uses C-j or RET to terminate this line is irrelevant.

> > Then I suggest you think hard about the disadvantages of RET as an
> > electric indentation key.  If there weren't such disadvantages, CC Mode
> > would have been using it for 20 years.

> I need your help here, I'm afraid.  And I'm obviously not the only,
> because it's very common for text editors to "auto-indent on RET"
> (either by default, or via a config setting).

You're being vague, here.  By "auto-indent on RET" you could mean indent
the existing line ("electric indentation") or the new line created
("newline-and-indent").  The newline-and-indent behaviour is common in
other editors, electric indentation is not.  (I'm not aware of another
editor which does it, but I'm willing to be informed of any.)

Using electric indentation on RET is poor, because it only works when you
actually type a RET (or a C-j).  This is often not the case, e.g. when
you open up a line (e.g. with C-M-o) then type in a new line of code.

If you are typing in comments at the end of code lines, you won't want
electric indentation messing up their alignment.  You also want to know
how much space you've got between the comment opener and "column 80", for
whatever value of column 80 you use.  You will want electric indentation
to have done its thing _before_ you start typing the comment.  Thus
electric indentation is needed on keys other than RET; when that is the
case, e-i on RET is superfluous.

> >> There are details about *how* e-i-m works which depend on the mode.
> >> Yes.  That's why e-i-m has mode-local settings (e.g. which keys are
> >> electric, or whether the indentation algorithm can reliably reindent).
> > Any "indentation algorithm" can reliably reindent.  It is the context
> > in which the algorithm is used which is important, not the algorithm
> > itself.

> No: python-mode, haskell-mode, and coffeescript-mode can't.

We're in violent agreement, here.  It is the context (i.e. the major
mode) these indentation algorithms are used in, not the algorithms
themselves.  The algorithms themselves are perfectly capable of
reindentation.

> > Clearly.  I am pointing out that this definition is perhaps a suboptimal
> > one.

> I don't see what you mean by "definition" not "suboptimal".

You've cut out the necessary context again, and put me to unnecessary
work to restore it.  This makes it look like you want to evade answering
the point, without being obvious that this is what you are doing.  This
is one of the most irritating tactics that can be used on a mailing list,
short of out and out trolling.  PLEASE STOP DOING THIS!!!!

Here is that context, restored:
>>> But the global e-i-m setting is about deciding whether the user wants
>>> his code to be automatically indented as he types (to the extent
>>> possible).  It is *defined* as a person-dependent preference.

>>Clearly.  I am pointing out that this definition is perhaps a suboptimal
>>one.

> I don't see what you mean by "definition" not "suboptimal"

I think it's now clear which definition, your definition, we're talking
about.  I put it to you, once more, that this "person-dependent"
preference, as contrasted with a major-mode or buffer dependent one, is
suboptimal. 

> > Not even that.  You were in so much of a hurry to reinvent the wheel,
> > that you were oblivious of perfectly round wheels with smooth bearings
> > which had been in existence for ~20 years.

> No, I know those wheels very well, because I suffered through many of
> them.

Your "suffering", outlined below, concerned a peripheral annoyance, not
the basic design.  If that suffering was so great, how come you never
sent a report to bug-cc-mode about it?

The point is, that you could easily have taken over the design features
of CC Mode's electric indentation, which would likely have gone through
all sorts of false starts and design mistakes 20 years ago before
emerging with its well considered, slick design.  Instead, you started
from scratch, repeating history instead of learning from it.

> The problem is they're not modular: your rebinding of ?{ to make it
> auto-indent means that my global binding of ?{ to make it auto-pair
> doesn't work in c-mode.

You're saying it's OK for a _MINOR_ mode to bind "{" ???  This is crazy.
Supposing another minor mode also wanted to bind "{" for its purposes?
Which one wins?  This is clearly unsustainable.

Minor modes which want to hook up their functionality to a key like "{"
should do just that, not attempt to supersede other functionality.
Mechanisms for this exist - electric-indent-mode uses one of these, for
example.

>         Stefan

-- 
Alan Mackenzie (Nuremberg, Germany).



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-22 13:13                               ` Alan Mackenzie
@ 2014-03-22 16:14                                 ` Stefan
  2014-03-22 20:19                                   ` David Caldwell
                                                     ` (2 more replies)
  0 siblings, 3 replies; 64+ messages in thread
From: Stefan @ 2014-03-22 16:14 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: emacs-devel

>> No, I don't agree.  First because most people don't use C-j but use
>> RET instead, and second because typing text linearly is far from being
>> the only important editing pattern.

> ????  That's a non-sequitur.  The indentation of an elisp line of code is
> solely dependent on the the lines before it - its indentation is
> completely determined before any of its contents are typed in.  Therefore
> there is nothing to be gained by reindenting this line at any subsequent
> time, i.e. electric indentation.
> Whether a user uses C-j or RET to terminate this line is irrelevant.

Then I have no idea what you're talking about.  "electric-indent" to me
means "try to keep code indented without having to hit TAB".  In Elisp,
without electric-indent you have to use C-j or TAB if you want your
code indented.  So whether the user hits C-j or RET is relevant.

> Using electric indentation on RET is poor, because it only works when you
> actually type a RET (or a C-j).

That doesn't mean it's poor.  Just that it's not sufficient.
And I fully agree on this, which is why we have electric-indent-chars.

> This is often not the case, e.g. when you open up a line (e.g. with
> C-M-o) then type in a new line of code.

Last I checked, RET is used more commonly than C-M-o.

> If you are typing in comments at the end of code lines, you won't want
> electric indentation messing up their alignment.

If auto-indentation gets it wrong, then indeed electric-indent will get
in the way.  That's true whether RET is electric or not.

> electric indentation is needed on keys other than RET; when that is the
> case, e-i on RET is superfluous.

Having RET in electric-indent-chars is not always indispensable, indeed.
But that doesn't make it harmful.  And of course, if you want, you can
remove it from electric-indent-chars either in your .emacs or in c-mode.

>> >> There are details about *how* e-i-m works which depend on the mode.
>> >> Yes.  That's why e-i-m has mode-local settings (e.g. which keys are
>> >> electric, or whether the indentation algorithm can reliably reindent).
>> > Any "indentation algorithm" can reliably reindent.  It is the context
>> > in which the algorithm is used which is important, not the algorithm
>> > itself.
>> No: python-mode, haskell-mode, and coffeescript-mode can't.
> We're in violent agreement, here.  It is the context (i.e. the major
> mode) these indentation algorithms are used in, not the algorithms
> themselves.  The algorithms themselves are perfectly capable of
> reindentation.

To me, the algorithm used by haskell-mode could not be used in
another context, so this distinction makes no sense.

> You've cut out the necessary context again, and put me to unnecessary
> work to restore it.

No, it's because the context did not manage to explain to me the text
that I quoted.  I stripped this context because it was not useful for me
to explain precisely which part I failed to understand.

> Here is that context, restored:
>>>> But the global e-i-m setting is about deciding whether the user wants
>>>> his code to be automatically indented as he types (to the extent
>>>> possible).  It is *defined* as a person-dependent preference.
>>> Clearly.  I am pointing out that this definition is perhaps a suboptimal
>>> one.
>> I don't see what you mean by "definition" not "suboptimal"
> I think it's now clear which definition, your definition, we're talking
> about.

Thanks, yes, that makes sense.

> I put it to you, once more, that this "person-dependent" preference,
> as contrasted with a major-mode or buffer dependent one,
> is suboptimal.

What would be more optimal?

Clearly, having the major mode decide for the user is not better because
I can assure you that there are users who want electric indentation in
C-mode and there are others who don't.

> Minor modes which want to hook up their functionality to a key like "{"
> should do just that, not attempt to supersede other functionality.
> Mechanisms for this exist - electric-indent-mode uses one of these, for
> example.

Well, mechanisms to do that were added at the same time as
electric-indent-mode.

But so it seems the part of the design you dislike in
electric-indent-mode is not the use of post-self-insert-hook (as
I assumed) but something else.  What is it?

It seems now that your main (only?) objection is having RET do
reindent-then-newline-and-indent instead of having it only do
newline-and-indent.  If that's the case, then let's focus on this.
In what scenario is it a problem?


        Stefan



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-22 16:14                                 ` Stefan
@ 2014-03-22 20:19                                   ` David Caldwell
  2014-03-22 22:05                                     ` David Kastrup
  2014-03-24  1:13                                     ` Stefan
  2014-03-22 22:34                                   ` Alan Mackenzie
  2014-03-22 23:10                                   ` Alan Mackenzie
  2 siblings, 2 replies; 64+ messages in thread
From: David Caldwell @ 2014-03-22 20:19 UTC (permalink / raw)
  To: Stefan, Alan Mackenzie; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 510 bytes --]

On 3/22/14, 9:14 AM, Stefan wrote:
> It seems now that your main (only?) objection is having RET do
> reindent-then-newline-and-indent instead of having it only do
> newline-and-indent.  If that's the case, then let's focus on this.
> In what scenario is it a problem?

Let me ask this, in what scenario does it actually do anything useful?

All the cases I can think of it's a nop, except when the indent guessing
is flat out wrong, and then it's just annoying (Grrrr, M-_ C-q RET TAB).

-David


[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4219 bytes --]

^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-22 20:19                                   ` David Caldwell
@ 2014-03-22 22:05                                     ` David Kastrup
  2014-03-22 22:32                                       ` David Caldwell
  2014-03-24  1:13                                     ` Stefan
  1 sibling, 1 reply; 64+ messages in thread
From: David Kastrup @ 2014-03-22 22:05 UTC (permalink / raw)
  To: emacs-devel

David Caldwell <david@porkrind.org> writes:

> On 3/22/14, 9:14 AM, Stefan wrote:
>> It seems now that your main (only?) objection is having RET do
>> reindent-then-newline-and-indent instead of having it only do
>> newline-and-indent.  If that's the case, then let's focus on this.
>> In what scenario is it a problem?
>
> Let me ask this, in what scenario does it actually do anything useful?

   }
   ^

When pressing RET now, the result should be

   }

   ^

with the added empty line being _empty_ rather than containing two
spaces.

> All the cases I can think of it's a nop, except when the indent
> guessing is flat out wrong, and then it's just annoying (Grrrr, M-_
> C-q RET TAB).

Yup.  The current behavior makes editing flex or bison files (a mixture
of patterns and/or rules and C code) a lot more annoying than it was a
year ago since at points of "bad indentation" (when in the pattern/rule
part or on its boundary to C code), RET does a lot more damage than
previously.

-- 
David Kastrup




^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-22 22:05                                     ` David Kastrup
@ 2014-03-22 22:32                                       ` David Caldwell
  0 siblings, 0 replies; 64+ messages in thread
From: David Caldwell @ 2014-03-22 22:32 UTC (permalink / raw)
  To: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 881 bytes --]

On 3/22/14, 3:05 PM, David Kastrup wrote:
> David Caldwell <david@porkrind.org> writes:
> 
>> On 3/22/14, 9:14 AM, Stefan wrote:
>>> It seems now that your main (only?) objection is having RET do
>>> reindent-then-newline-and-indent instead of having it only do
>>> newline-and-indent.  If that's the case, then let's focus on this.
>>> In what scenario is it a problem?
>>
>> Let me ask this, in what scenario does it actually do anything useful?
> 
>    }
>    ^
> 
> When pressing RET now, the result should be
> 
>    }
> 
>    ^
> 
> with the added empty line being _empty_ rather than containing two
> spaces.

Then perhaps it shouldn't act like "TAB RET TAB" but instead like "M-\
RET TAB". Or even "s/^\s +$// RET TAB" (in case preserving trailing
whitespace on a non-blank line is somehow better—though I think it would
not be).

-David



[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4219 bytes --]

^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-22 16:14                                 ` Stefan
  2014-03-22 20:19                                   ` David Caldwell
@ 2014-03-22 22:34                                   ` Alan Mackenzie
  2014-03-24  1:37                                     ` Stefan
  2014-03-22 23:10                                   ` Alan Mackenzie
  2 siblings, 1 reply; 64+ messages in thread
From: Alan Mackenzie @ 2014-03-22 22:34 UTC (permalink / raw)
  To: Stefan; +Cc: emacs-devel

Hello, Stefan.

On Sat, Mar 22, 2014 at 12:14:54PM -0400, Stefan wrote:
> > The indentation of an elisp line of code is solely dependent on the
> > the lines before it - its indentation is completely determined before
> > any of its contents are typed in.  Therefore there is nothing to be
> > gained by reindenting this line at any subsequent time, i.e. electric
> > indentation.  Whether a user uses C-j or RET to terminate this line
> > is irrelevant.

> Then I have no idea what you're talking about.  "electric-indent" to me
> means "try to keep code indented without having to hit TAB".

The actual definition of "electricity" is found in the Emacs manual, page
"Electric C", where it has been for a very long time indeed.  It runs as
follows:

    In C mode and related modes, certain printing characters are
    "electric"--in addition to inserting themselves, they also reindent
    the current line, and optionally also insert newlines.

.  If you redefine the "electric" in "electric-indent" as you have done,
you conflate unrelated topics, and both your thought patterns and the
code end up a mess.  It is not helpful to construe `newline-and-indent'
as somehow being "electric".

> In Elisp, without electric-indent you have to use C-j or TAB if you
> want your code indented.  So whether the user hits C-j or RET is
> relevant.

No.  To keep Elisp properly indented, you merely have to depress
whichever key is bound to `newline-and-indent', whether that be RET, or
C-j, or whatever.  Electric indentation doesn't come into it.

> > Using electric indentation on RET is poor, because it only works when you
> > actually type a RET (or a C-j).

> That doesn't mean it's poor.  Just that it's not sufficient.
> And I fully agree on this, which is why we have electric-indent-chars.

> > This is often not the case, e.g. when you open up a line (e.g. with
> > C-M-o) then type in a new line of code.

> Last I checked, RET is used more commonly than C-M-o.

Yes, but the point still stands.  You open up a fresh line, by RET, and
type code into it, but don't want to type RET/C-j at the end of it.
You'll want electric indentation on some other character you've just
typed.

> > If you are typing in comments at the end of code lines, you won't want
> > electric indentation messing up their alignment.

> If auto-indentation gets it wrong, then indeed electric-indent will get
> in the way.  That's true whether RET is electric or not.

No.  If electric indentation has already happened after typing the
semicolon/comma/brace, the alignment of the subsequent comment will
remain undisturbed.  If RET puts the alignment out, you're cursing it.

> > electric indentation is needed on keys other than RET; when that is the
> > case, e-i on RET is superfluous.

> Having RET in electric-indent-chars is not always indispensable, indeed.
> But that doesn't make it harmful.  And of course, if you want, you can
> remove it from electric-indent-chars either in your .emacs or in c-mode.

> >>>> But the global e-i-m setting is about deciding whether the user wants
> >>>> his code to be automatically indented as he types (to the extent
> >>>> possible).  It is *defined* as a person-dependent preference.
> >>> Clearly.  I am pointing out that this definition is perhaps a suboptimal
> >>> one.
> >> I don't see what you mean by "definition" not "suboptimal"
> > I think it's now clear which definition, your definition, we're talking
> > about.

> Thanks, yes, that makes sense.

> > I put it to you, once more, that this "person-dependent" preference,
> > as contrasted with a major-mode or buffer dependent one,
> > is suboptimal.

> What would be more optimal?

A mode-dependent or buffer-local dependent setting, as well as, rather
than instead of.

> Clearly, having the major mode decide for the user is not better because
> I can assure you that there are users who want electric indentation in
> C-mode and there are others who don't.

C Mode users who don't want electric indentation have been remarkably
quiet about it on bug-cc-mode, at least since `c-toggle-electric-state'
was introduced.

Each major mode should be able to decide on its own default, which the
user should be able to override easily.

> > Minor modes which want to hook up their functionality to a key like "{"
> > should do just that, not attempt to supersede other functionality.
> > Mechanisms for this exist - electric-indent-mode uses one of these, for
> > example.

> Well, mechanisms to do that were added at the same time as
> electric-indent-mode.

Yes.

> But so it seems the part of the design you dislike in
> electric-indent-mode is not the use of post-self-insert-hook (as
> I assumed) but something else.  What is it?

It is the conflation of electric indentation with the "-and-indent" part
of `newline-and-indent', and the poor quality code this has led to.  For
example, `newline' and `newline-and-indent', strong, well understood,
well coded functions have been superseeded by new `newline' and
`electric-newline-and-maybe-indent', both vague functions which sometimes
indent the new line, sometimes don't.  Another example: `newline' has
been sullied with a grotesque new parameter "interactive" whose meaning
can not be reconciled with `newline''s functionality, but can only be
described by a flowchart of new `newline''s internal workings.

Having a minor mode tweek the global keymap on being enabled was
grotesque, but that has, thankfully, now been fixed.  The wierd
implementation of `electric-indent-local-mode', which didn't work
properly, is also getting fixed, though it is still needlessly
complicated.

I strongly dislike, even despise, the conflation of electric indentation
with the way (RET C-j) are bound to (`newline' `newline-and-indent').
The bindings of these keys has nothing to do with electric indentation,
and swapping their functionalities on {en,dis}abling e-i-m is bizarre.
There was no discussion of this on emacs-devel, and no consensus for this
change.  What _was_ discussed was the swapping of the two bindings in
programming modes, and it was coincidental that this discussion happened
in an offshoot of a thread discussing electric indentation mode.  Why
can't we simply have RET bound to `newline-and-indent' and C-j bound to
`newline' in programming modes, as discussed and, pretty much agreed on,
in emacs-devel last autumn?

Given that electric-indent-mode could have been implemented with the same
functionality in a clear, straightforward fashion, it is galling to see
the "clever", fragile, difficult to maintain code which we now have.

None of this am I saying here for the first time.

I object to the documentation of e-i-m on the info page "Convenience
Functions", as though it were some minor convenience function rather than
the essential component of automatic indentation it actually is.  But I
think we would agree this documentation needs amending anyway.

> It seems now that your main (only?) objection is having RET do
> reindent-then-newline-and-indent instead of having it only do
> newline-and-indent.

See above.  ;-)

> If that's the case, then let's focus on this.  In what scenario is it a
> problem?

I suppose it's not really a big problem.  Having RET/C-j as electric keys
in CC Mode just isn't needed.  _Any_ line of code in a real C/C++/...
program is going to contain some other electric character.  Other major
modes would likely also benefit from having characters other than RET
electric.

Incidentally, in Emacs -Q, Text Mode and Fundamental Mode have gone back
to the unwanted state of RET doing `newline-and-indent'.  Should I raise
another bug report?

>         Stefan

-- 
Alan Mackenzie (Nuremberg, Germany).



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-22 16:14                                 ` Stefan
  2014-03-22 20:19                                   ` David Caldwell
  2014-03-22 22:34                                   ` Alan Mackenzie
@ 2014-03-22 23:10                                   ` Alan Mackenzie
  2014-03-24  1:39                                     ` Stefan
  2 siblings, 1 reply; 64+ messages in thread
From: Alan Mackenzie @ 2014-03-22 23:10 UTC (permalink / raw)
  To: Stefan; +Cc: emacs-devel

Hi, Stefan.

Another point:

On Sat, Mar 22, 2014 at 12:14:54PM -0400, Stefan wrote:

> Having RET in electric-indent-chars is not always indispensable, indeed.
> But that doesn't make it harmful.

See bug #16156 from Richard, which is still open:
"
In text mode, if the buffer contains
-----------------------------------------
foo
   bar
-----------------------------------------

and point is at the start of the second line, and I type RET,
it gives

-----------------------------------------
foo

bar
-----------------------------------------

This is clearly wrong.
"

This is caused by RET being in electric-indent-chars.  Here, it _is_
harmful.

>         Stefan

-- 
Alan Mackenzie (Nuremberg, Germany).



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-22 20:19                                   ` David Caldwell
  2014-03-22 22:05                                     ` David Kastrup
@ 2014-03-24  1:13                                     ` Stefan
  1 sibling, 0 replies; 64+ messages in thread
From: Stefan @ 2014-03-24  1:13 UTC (permalink / raw)
  To: David Caldwell; +Cc: Alan Mackenzie, emacs-devel

>> It seems now that your main (only?) objection is having RET do
>> reindent-then-newline-and-indent instead of having it only do
>> newline-and-indent.  If that's the case, then let's focus on this.
>> In what scenario is it a problem?
> Let me ask this, in what scenario does it actually do anything useful?

When you edit a line in such as way that this line's indentation is not
correct any more and then you hit RET.  E.g. start from

       foo();

put point right before "f" and type: "end RET".
Of course, in a language that uses "begin ... end" or something like that.

> All the cases I can think of it's a nop, except when the indent guessing
> is flat out wrong, and then it's just annoying (Grrrr, M-_ C-q RET TAB).

Yes, electric-indent is a pain when the indent guessing is wrong.
But that holds for all electric-indent-chars.


        Stefan



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-22 22:34                                   ` Alan Mackenzie
@ 2014-03-24  1:37                                     ` Stefan
  2014-03-24 22:40                                       ` Alan Mackenzie
  0 siblings, 1 reply; 64+ messages in thread
From: Stefan @ 2014-03-24  1:37 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: emacs-devel

> The actual definition of "electricity" is found in the Emacs manual, page

Use in other packages shows that people have understood the notion of
"electric" to mean many other things beside the very restricted
semantics you point to.

>> In Elisp, without electric-indent you have to use C-j or TAB if you
>> want your code indented.  So whether the user hits C-j or RET is
>> relevant.
> No.  To keep Elisp properly indented, you merely have to depress
> whichever key is bound to `newline-and-indent', whether that be RET, or
> C-j, or whatever.

"whichever key is bound to `newline-and-indent'" would be C-j and not
RET in all Emacsen released so far, so I see we violently agree.

> Electric indentation doesn't come into it.

Of course it does because electric-indent changes the behavior such that
RET can be (or has to be in 24.4) used instead of C-j.  But you knew
that, obviously.

> Yes, but the point still stands.  You open up a fresh line, by RET, and
> type code into it, but don't want to type RET/C-j at the end of it.

Fine.  Feel free to provide a patch to make split-line auto-indent when
electric-indent is enabled.

> You'll want electric indentation on some other character you've just
> typed.

Indeed that's also good.  But I don't know of any such character we
could use globally in electric-indent-chars, so it's up to each major
mode to specify which chars to use.

> No.  If electric indentation has already happened after typing the
> semicolon/comma/brace, the alignment of the subsequent comment will
> remain undisturbed.  If RET puts the alignment out, you're cursing it.

Then I misunderstood and don't know what you're talking about.  Can you
give a scenario?

>> What would be more optimal?
> A mode-dependent or buffer-local dependent setting, as well as, rather
> than instead of.

We have that: electric-indent-local-mode and electric-indent-inhibit.

> Why can't we simply have RET bound to `newline-and-indent' and C-j
> bound to `newline' in programming modes, as discussed and, pretty much
> agreed on, in emacs-devel last autumn?

Lack of patch implementing this (supposed) simple change?

> Incidentally, in Emacs -Q, Text Mode and Fundamental Mode have gone back
> to the unwanted state of RET doing `newline-and-indent'.  Should I raise
> another bug report?

You can, but it's not a bug.  It's a feature (not sure what you mean by
"back" since it's been this way ever since I enabled
electric-indent-mode by default, AFAIK).
So make this bug report specific about a particular circumstance where
the behavior is undesirable, or about how hard it is to disable it.


        Stefan



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-22 23:10                                   ` Alan Mackenzie
@ 2014-03-24  1:39                                     ` Stefan
  2014-03-24  6:59                                       ` Stephen J. Turnbull
  0 siblings, 1 reply; 64+ messages in thread
From: Stefan @ 2014-03-24  1:39 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: emacs-devel

> In text mode, if the buffer contains
> -----------------------------------------
> foo
>    bar
> -----------------------------------------

> and point is at the start of the second line, and I type RET, it gives

> -----------------------------------------
> foo
>
> bar
> -----------------------------------------

> This is clearly wrong.

I don't see what is "clear" about it being wrong, sorry.
I see you don't like it (and Richard apparently doesn't like it either),
but that's a different problem.


        Stefan



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-24  1:39                                     ` Stefan
@ 2014-03-24  6:59                                       ` Stephen J. Turnbull
  2014-03-24  9:08                                         ` Dmitry Gutov
  2014-03-24 21:12                                         ` Alan Mackenzie
  0 siblings, 2 replies; 64+ messages in thread
From: Stephen J. Turnbull @ 2014-03-24  6:59 UTC (permalink / raw)
  To: Stefan; +Cc: Alan Mackenzie, emacs-devel

Stefan writes:

 > > In text mode, if the buffer contains
 > > -----------------------------------------
 > > foo
 > >    bar
 > > -----------------------------------------
 > 
 > > and point is at the start of the second line, and I type RET, it gives
 > 
 > > -----------------------------------------
 > > foo
 > >
 > > bar
 > > -----------------------------------------
 > 
 > > This is clearly wrong.
 > 
 > I don't see what is "clear" about it being wrong, sorry.
 > I see you don't like it (and Richard apparently doesn't like it either),
 > but that's a different problem.

It would be nice if you guys would avoid using keystrokes instead of
commands in this discussion.  I think it's perfectly reasonable to
swap the usage of CR and LF from `newline' and `newline-and-indent' to
`newline-and-indent' and `newline', respectively.  That may disconcert
us oldtimers, but I suspect it's what newcomers to Emacs will expect.[1]
And it's easy enough to "fix" if you don't like it.  But I hope that's
not what Alan's talking about, although it's entirely unclear to me if
that's what Stefan's talking about.

That is, if what Alan means by "type RET" is "type a keystroke bound
to `newline'", then my preference accords with his.  For my usage that
behavior is *clearly* *wrong*, as in text modes when there's leading
whitespace on a line, either *I* put it there, or some electrically-
crapified command that I just disabled the electricity on did (and it
won't happen again, so there's no reason not to fix it by hand this
time).

Footnotes: 
[1]  I got used to it in Python-mode quite readily, despite continuing
to use the traditional bindings for RET and C-j in other modes.





^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-24  6:59                                       ` Stephen J. Turnbull
@ 2014-03-24  9:08                                         ` Dmitry Gutov
  2014-03-24 17:19                                           ` Eli Zaretskii
  2014-03-24 18:32                                           ` Stefan
  2014-03-24 21:12                                         ` Alan Mackenzie
  1 sibling, 2 replies; 64+ messages in thread
From: Dmitry Gutov @ 2014-03-24  9:08 UTC (permalink / raw)
  To: Stephen J. Turnbull; +Cc: Alan Mackenzie, Stefan, emacs-devel

"Stephen J. Turnbull" <stephen@xemacs.org> writes:

> That is, if what Alan means by "type RET" is "type a keystroke bound
> to `newline'", then my preference accords with his.  For my usage that
> behavior is *clearly* *wrong*, as in text modes when there's leading
> whitespace on a line, either *I* put it there, or some electrically-
> crapified command that I just disabled the electricity on did (and it
> won't happen again, so there's no reason not to fix it by hand this
> time).

FWIW, effectively doing `reindent-then-newline-and-indent' on RET also
seems gratuitous to me. When I reach the end of a line, usually text on
that line is already indented correctly (automatically, or through me
typing TAB manually), so the first `reindent' does nothing, unless the
indentation function was wrong about the current line in the first
place, and I had to adjust it manually.

The modes where reindenting the current line on RET is beneficial often,
can add `?\n' to electric-indent-chars themselves. For most, the
benefits are marginal and they are offset by having to tweak
`electric-indent-inhibit' or
`electric-indent-functions-without-reindent' for existing text-based
modes.

For all others, just swapping C-j and RET bindings would've worked just
as well, and I think it would result in simpler code.



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-24  9:08                                         ` Dmitry Gutov
@ 2014-03-24 17:19                                           ` Eli Zaretskii
  2014-03-24 17:29                                             ` David Kastrup
  2014-03-24 17:38                                             ` Dmitry Gutov
  2014-03-24 18:32                                           ` Stefan
  1 sibling, 2 replies; 64+ messages in thread
From: Eli Zaretskii @ 2014-03-24 17:19 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: acm, stephen, monnier, emacs-devel

> From: Dmitry Gutov <dgutov@yandex.ru>
> Date: Mon, 24 Mar 2014 11:08:43 +0200
> Cc: Alan Mackenzie <acm@muc.de>, Stefan <monnier@IRO.UMontreal.CA>,
> 	emacs-devel@gnu.org
> 
> FWIW, effectively doing `reindent-then-newline-and-indent' on RET also
> seems gratuitous to me. When I reach the end of a line, usually text on
> that line is already indented correctly (automatically, or through me
> typing TAB manually), so the first `reindent' does nothing, unless the
> indentation function was wrong about the current line in the first
> place, and I had to adjust it manually.

This might be mostly true, but not always.  E.g., what if you delete a
character whose electricity caused the line to be indented in some
special way, when that character was inserted earlier?  After deleting
that character, the line might no longer be indented correctly.



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-24 17:19                                           ` Eli Zaretskii
@ 2014-03-24 17:29                                             ` David Kastrup
  2014-03-24 17:39                                               ` David Kastrup
  2014-03-24 17:38                                             ` Dmitry Gutov
  1 sibling, 1 reply; 64+ messages in thread
From: David Kastrup @ 2014-03-24 17:29 UTC (permalink / raw)
  To: emacs-devel

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Dmitry Gutov <dgutov@yandex.ru>
>> Date: Mon, 24 Mar 2014 11:08:43 +0200
>> Cc: Alan Mackenzie <acm@muc.de>, Stefan <monnier@IRO.UMontreal.CA>,
>> 	emacs-devel@gnu.org
>> 
>> FWIW, effectively doing `reindent-then-newline-and-indent' on RET also
>> seems gratuitous to me. When I reach the end of a line, usually text on
>> that line is already indented correctly (automatically, or through me
>> typing TAB manually), so the first `reindent' does nothing, unless the
>> indentation function was wrong about the current line in the first
>> place, and I had to adjust it manually.
>
> This might be mostly true, but not always.  E.g., what if you delete a
> character whose electricity caused the line to be indented in some
> special way, when that character was inserted earlier?

I _expect_ to have to type TAB when deleting electric characters.

> After deleting that character, the line might no longer be indented
> correctly.

Really, the only actually valid argument so far is Stefan's of typing

end M-x newline-and-indent RET

when in pascal and on

   a := 7.0
  ^

since it is

   end a:= 7.0

but

end
a := 7.0

except, of course, that it is actually

end;
a := 7.0

after all even in Pascal.  And pressing TAB on

   end;a := 7.0

still will do the right thing.  So I don't really think the "inserting
newline will actually cause a different indentation for the line above"
case is relevant enough to fall over backwards for it.

-- 
David Kastrup




^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-24 17:19                                           ` Eli Zaretskii
  2014-03-24 17:29                                             ` David Kastrup
@ 2014-03-24 17:38                                             ` Dmitry Gutov
  2014-03-24 17:52                                               ` Eli Zaretskii
  1 sibling, 1 reply; 64+ messages in thread
From: Dmitry Gutov @ 2014-03-24 17:38 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: acm, stephen, monnier, emacs-devel

On 24.03.2014 19:19, Eli Zaretskii wrote:

> This might be mostly true, but not always.  E.g., what if you delete a
> character whose electricity caused the line to be indented in some
> special way, when that character was inserted earlier?  After deleting
> that character, the line might no longer be indented correctly.

This is covered by "through me typing TAB manually".

If I delete a char or a keyword making the line indented incorrectly, 
the next thing I do is type TAB. And `reindent-' on RET would still be a 
no-op.

This could be just me, but I somehow doubt that.



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-24 17:29                                             ` David Kastrup
@ 2014-03-24 17:39                                               ` David Kastrup
  0 siblings, 0 replies; 64+ messages in thread
From: David Kastrup @ 2014-03-24 17:39 UTC (permalink / raw)
  To: emacs-devel

David Kastrup <dak@gnu.org> writes:

> Really, the only actually valid argument so far is Stefan's of typing
>
> end M-x newline-and-indent RET
>
> after all even in Pascal.  And pressing TAB on
>
>    end;a := 7.0
>
> still will do the right thing.  So I don't really think the "inserting
> newline will actually cause a different indentation for the line above"
> case is relevant enough to fall over backwards for it.

Here are cases where it makes a difference: when pressing RET in the
middle of endend or enduntil or similar joined block-ending reserved
words.  But then typing SPC TAB Left RET is reasonably workable.  Or C-o
TAB C-n TAB or a number of other ways.

-- 
David Kastrup




^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-24 17:38                                             ` Dmitry Gutov
@ 2014-03-24 17:52                                               ` Eli Zaretskii
  2014-03-25  1:53                                                 ` Dmitry Gutov
  0 siblings, 1 reply; 64+ messages in thread
From: Eli Zaretskii @ 2014-03-24 17:52 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: acm, stephen, monnier, emacs-devel

> Date: Mon, 24 Mar 2014 19:38:44 +0200
> From: Dmitry Gutov <dgutov@yandex.ru>
> CC: stephen@xemacs.org, acm@muc.de, monnier@IRO.UMontreal.CA, 
>  emacs-devel@gnu.org
> 
> On 24.03.2014 19:19, Eli Zaretskii wrote:
> 
> > This might be mostly true, but not always.  E.g., what if you delete a
> > character whose electricity caused the line to be indented in some
> > special way, when that character was inserted earlier?  After deleting
> > that character, the line might no longer be indented correctly.
> 
> This is covered by "through me typing TAB manually".

It's a nuisance for me to have to type TAB every time.  Long time ago,
I switched to Emacs because it didn't require that to keep the source
nicely formatted, while other IDEs did.

> If I delete a char or a keyword making the line indented incorrectly, 
> the next thing I do is type TAB. And `reindent-' on RET would still be a 
> no-op.
> 
> This could be just me, but I somehow doubt that.

Not just you, but not me, either ;-)



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-24  9:08                                         ` Dmitry Gutov
  2014-03-24 17:19                                           ` Eli Zaretskii
@ 2014-03-24 18:32                                           ` Stefan
  2014-03-25  1:49                                             ` Dmitry Gutov
  2014-03-25  7:44                                             ` Stephen J. Turnbull
  1 sibling, 2 replies; 64+ messages in thread
From: Stefan @ 2014-03-24 18:32 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: Alan Mackenzie, Stephen J. Turnbull, emacs-devel

> FWIW, effectively doing `reindent-then-newline-and-indent' on RET also
> seems gratuitous to me. When I reach the end of a line, usually text on
> that line is already indented correctly (automatically, or through me
> typing TAB manually),

You might get used to "RET reindents" and stop hitting TAB that often ;-)
For me one of the reasons why it's not gratuitous is because of things like:

       begin
         blabla
         blibli
       end

Go to just before "blibli" and type "end RET": notice that hitting TAB
just before RET won't help you, because you need to reindent the line
after the newline is inserted.

This is admittedly less serious for interactive editing than for
keyboard macros (and templates/skeletons/snippets), but I find the
behavior to be handy.

> The modes where reindenting the current line on RET is beneficial often,
> can add `?\n' to electric-indent-chars themselves.

Indeed, we could do that.

> For most, the benefits are marginal and they are offset by having to
> tweak `electric-indent-inhibit' or
> `electric-indent-functions-without-reindent' for existing
> text-based modes.

Good point.

> For all others, just swapping C-j and RET bindings would've worked just
> as well, and I think it would result in simpler code.

Again "just swapping" sounds simple, but I'm not sure what patch you
have in mind.  I think it's important for the user to be able to easily
say something like (electric-indent-mode -1) (and/or its buffer-local
equivalent) to recover the Emacs-23 behavior.


        Stefan



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-24  6:59                                       ` Stephen J. Turnbull
  2014-03-24  9:08                                         ` Dmitry Gutov
@ 2014-03-24 21:12                                         ` Alan Mackenzie
  1 sibling, 0 replies; 64+ messages in thread
From: Alan Mackenzie @ 2014-03-24 21:12 UTC (permalink / raw)
  To: Stephen J. Turnbull; +Cc: Stefan, emacs-devel

Hello, Stephen.

On Mon, Mar 24, 2014 at 03:59:09PM +0900, Stephen J. Turnbull wrote:
> Stefan writes:

>  > > In text mode, if the buffer contains
>  > > -----------------------------------------
>  > > foo
>  > >    bar
>  > > -----------------------------------------

>  > > and point is at the start of the second line, and I type RET, it gives

>  > > -----------------------------------------
>  > > foo

>  > > bar
>  > > -----------------------------------------

>  > > This is clearly wrong.

>  > I don't see what is "clear" about it being wrong, sorry.
>  > I see you don't like it (and Richard apparently doesn't like it either),
>  > but that's a different problem.

> It would be nice if you guys would avoid using keystrokes instead of
> commands in this discussion.  I think it's perfectly reasonable to
> swap the usage of CR and LF from `newline' and `newline-and-indent' to
> `newline-and-indent' and `newline', respectively.

That's the consensus that was reached here last autumn, at least for
programming modes.  There was surprisingly little objection, not even
from me.  I think Drew is the only main objector.  For other modes, I
don't think such a consensus was reached at all.

> That may disconcert us oldtimers, but I suspect it's what newcomers to
> Emacs will expect.[1] And it's easy enough to "fix" if you don't like
> it.  But I hope that's not what Alan's talking about, although it's
> entirely unclear to me if that's what Stefan's talking about.

The entire section was a bug report by RMS, as was made clear in my post
before the attribution was removed by an overenthusiasticly cutting
reply, as so often happens in this group.

I think Richard was partly taking the role of a new user, and was partly
bewildered, possibly put out, himself.

> That is, if what Alan means by "type RET" is "type a keystroke bound
> to `newline'", then my preference accords with his.

I don't think that was what Richard (not me) meant - I think he meant
literally and spritiually what he wrote.

> For my usage that behavior is *clearly* *wrong*, as in text modes when
> there's leading whitespace on a line, either *I* put it there, or some
> electrically- crapified command that I just disabled the electricity on
> did (and it won't happen again, so there's no reason not to fix it by
> hand this time).

Yes.  I don't think this electric behaviour should be present in Text
Mode (and similar) either.

-- 
Alan Mackenzie (Nuremberg, Germany).



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-24  1:37                                     ` Stefan
@ 2014-03-24 22:40                                       ` Alan Mackenzie
  2014-03-25  1:37                                         ` Dmitry Gutov
  2014-03-25  1:54                                         ` Stefan
  0 siblings, 2 replies; 64+ messages in thread
From: Alan Mackenzie @ 2014-03-24 22:40 UTC (permalink / raw)
  To: Stefan; +Cc: emacs-devel

Hello, Stefan.

On Sun, Mar 23, 2014 at 09:37:09PM -0400, Stefan wrote:
> > The actual definition of "electricity" is found in the Emacs manual, page

> Use in other packages shows that people have understood the notion of
> "electric" to mean many other things beside the very restricted
> semantics you point to.

Yes, but as used in "electric indentation", I think the terminology, and
the methodology, has been as in C Mode's definition up until very
recently.

> > No.  To keep Elisp properly indented, you merely have to depress
> > whichever key is bound to `newline-and-indent', whether that be RET, or
> > C-j, or whatever.

> "whichever key is bound to `newline-and-indent'" would be C-j and not
> RET in all Emacsen released so far, so I see we violently agree.

> > Electric indentation doesn't come into it.

> Of course it does because electric-indent changes the behavior such that
> RET can be (or has to be in 24.4) used instead of C-j.  But you knew
> that, obviously.

OK, I meant "electric indentation" as defined in the manual page -
"reindenting the current line".  This has nothing to do with which way
round C-j and RET are bound.

> > You'll want electric indentation on some other character you've just
> > typed.

> Indeed that's also good.  But I don't know of any such character we
> could use globally in electric-indent-chars, so it's up to each major
> mode to specify which chars to use.

Yes.

> > No.  If electric indentation has already happened after typing the
> > semicolon/comma/brace, the alignment of the subsequent comment will
> > remain undisturbed.  If RET puts the alignment out, you're cursing it.

> Then I misunderstood and don't know what you're talking about.  Can you
> give a scenario?

Assume that electric indentation happens on \n, and not on {.  You type
in a { (which is intrinsically 4 characters too indented, for some value
of 4) then do M-; to insert a comment at comment-column.  You fill in the
comment, do C-e then RET.  The ensuing electric indentation on RET puts
out the alignment of the comment:

                            if (foo)       /* aligned comment */
			    {          /* coment misaligned by e-i-m */

> >> What would be more optimal?
> > A mode-dependent or buffer-local dependent setting, as well as, rather
> > than instead of.

> We have that: electric-indent-local-mode and electric-indent-inhibit.

OK, for electric-indent-local-mode, which is gradually becoming
prominent.  But I though electric-indent-inhibit was a variable for major
modes, not users - a mode initialisation thing, rather than a user
configuration variable.

> > Why can't we simply have RET bound to `newline-and-indent' and C-j
> > bound to `newline' in programming modes, as discussed and, pretty much
> > agreed on, in emacs-devel last autumn?

> Lack of patch implementing this (supposed) simple change?

Here is what I propose, and am willing to do:
1. For electric indentation:
  a - Restore `newline' and `newline-and-indent' to their traditional
    functionality, and remove `electric-newline-and-maybe-indent'.
  b - Simplify `electric-indent-post-self-insert-function' such that it
    reindents only the line on which the self-inserting character is
    typed.
  c - Reform `electric-indent-local-mode' as a first-class minor mode and
    `electric-indent-mode' as a global version of it.
2. For making RET indent the new line in programming modes:
  a - Bind RET to `newline-and-indent' and C-j to `newline' in
    `prog-mode-map' and possibly in certain other major mode maps (to be
    discussed).
  b - (Maybe) create a minor mode to restore RET and C-j to traditional
    bindings.

The above will leave electric-indent-mode functioning pretty much as it
currently does.  What do you say?

> > Incidentally, in Emacs -Q, Text Mode and Fundamental Mode have gone back
> > to the unwanted state of RET doing `newline-and-indent'.  Should I raise
> > another bug report?

> You can, but it's not a bug.  It's a feature (not sure what you mean by
> "back" since it's been this way ever since I enabled
> electric-indent-mode by default, AFAIK).

Apologies: I thought Text Mode had been restored to the traditional
bindings in the last few months.

> So make this bug report specific about a particular circumstance where
> the behavior is undesirable, or about how hard it is to disable it.

I think RMS's bug #16156, reproduced and being discussed on a parallel
thread, is a good enough example, so there's not much point in me opening
a new one.

>         Stefan

-- 
Alan Mackenzie (Nuremberg, Germany).



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-24 22:40                                       ` Alan Mackenzie
@ 2014-03-25  1:37                                         ` Dmitry Gutov
  2014-03-26 20:53                                           ` Alan Mackenzie
  2014-03-25  1:54                                         ` Stefan
  1 sibling, 1 reply; 64+ messages in thread
From: Dmitry Gutov @ 2014-03-25  1:37 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: Stefan, emacs-devel

Alan Mackenzie <acm@muc.de> writes:

>> > A mode-dependent or buffer-local dependent setting, as well as, rather
>> > than instead of.
>
>> We have that: electric-indent-local-mode and electric-indent-inhibit.
>
> OK, for electric-indent-local-mode, which is gradually becoming
> prominent.  But I though electric-indent-inhibit was a variable for major
> modes, not users - a mode initialisation thing, rather than a user
> configuration variable.

This is usually the case with buffer-local dependent settings. They're
impossible to set via Customize (I think), so one doesn't usually think
of them as user options, but a user can modify such var in a hook, too.

>  b - Simplify `electric-indent-post-self-insert-function' such that it
>    reindents only the line on which the self-inserting character is
>    typed.

It would still need to handle presence of ?\n in `electric-indent-chars'
when that's the case.  This value is somewhat special since the
line-to-be reindented would be the previous, not the current one.

> 2. For making RET indent the new line in programming modes:
>   a - Bind RET to `newline-and-indent' and C-j to `newline' in
>     `prog-mode-map' and possibly in certain other major mode maps (to be
>     discussed).

I believe there's something to be said for consistency: having RET
indent line in some modes, but not others doesn't make much sense to me.

There's a certain class of users who've been binding RET to
`newline-and-indent' for a long time (myself included), and I haven't
seen anyone mention only doing that in prog-mode, instead of globally.

>   b - (Maybe) create a minor mode to restore RET and C-j to traditional
>     bindings.

How hard can it be for a user to change the key bindings without a mode?

>> So make this bug report specific about a particular circumstance where
>> the behavior is undesirable, or about how hard it is to disable it.
>
> I think RMS's bug #16156, reproduced and being discussed on a parallel
> thread, is a good enough example, so there's not much point in me opening
> a new one.

This behavior, as described in the bug above, makes sense to me, so it's
clearly a personal preference.



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-24 18:32                                           ` Stefan
@ 2014-03-25  1:49                                             ` Dmitry Gutov
  2014-03-25  7:44                                             ` Stephen J. Turnbull
  1 sibling, 0 replies; 64+ messages in thread
From: Dmitry Gutov @ 2014-03-25  1:49 UTC (permalink / raw)
  To: Stefan; +Cc: Alan Mackenzie, Stephen J. Turnbull, emacs-devel

Stefan <monnier@IRO.UMontreal.CA> writes:

> You might get used to "RET reindents" and stop hitting TAB that often
> ;-)

Maybe. :) But if I'm going to type anything else at all on the given
line before typing RET, the hand is itching to reindent before that, to
make text look ordered.

> For me one of the reasons why it's not gratuitous is because of things like:
>
>        begin
>          blabla
>          blibli
>        end
>
> Go to just before "blibli" and type "end RET": notice that hitting TAB
> just before RET won't help you, because you need to reindent the line
> after the newline is inserted.

I can see how this could be handy, but it's not an example I see
frequently. In part because I use `ruby-end', which inserts `end' after
one types a block beginner and SPC or RET. So one's inclined to produce
all `end' keywords that way, to keep them paired.

In any case, this seems to depend on the language having
keyword-delimited blocks and no semicolons.  This does not characterize
the majority of the languages Emacs supports, I think.

>> For all others, just swapping C-j and RET bindings would've worked just
>> as well, and I think it would result in simpler code.
>
> Again "just swapping" sounds simple, but I'm not sure what patch you
> have in mind.

I've commented on Alan's proposed plan of action.

> I think it's important for the user to be able to easily
> say something like (electric-indent-mode -1) (and/or its buffer-local
> equivalent) to recover the Emacs-23 behavior.

The importance of this is not clear to me, but I guess it wouldn't hurt
to have this, either way.



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-24 17:52                                               ` Eli Zaretskii
@ 2014-03-25  1:53                                                 ` Dmitry Gutov
  2014-03-25  3:49                                                   ` Eli Zaretskii
  0 siblings, 1 reply; 64+ messages in thread
From: Dmitry Gutov @ 2014-03-25  1:53 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: acm, stephen, monnier, emacs-devel

Eli Zaretskii <eliz@gnu.org> writes:

>> > This might be mostly true, but not always.  E.g., what if you delete a
>> > character whose electricity caused the line to be indented in some
>> > special way, when that character was inserted earlier?  After deleting
>> > that character, the line might no longer be indented correctly.
>> 
>> This is covered by "through me typing TAB manually".
>
> It's a nuisance for me to have to type TAB every time.

"every time" sounds much more annoying than "every time I perform some
improbable operation". ;)

> I switched to Emacs because it didn't require that to keep the source
> nicely formatted, while other IDEs did.

I mostly like the fact that `indent-for-tab-command' is idempotent in
most modes.



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-24 22:40                                       ` Alan Mackenzie
  2014-03-25  1:37                                         ` Dmitry Gutov
@ 2014-03-25  1:54                                         ` Stefan
  2014-03-26 21:21                                           ` Alan Mackenzie
  1 sibling, 1 reply; 64+ messages in thread
From: Stefan @ 2014-03-25  1:54 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: emacs-devel

> Assume that electric indentation happens on \n, and not on {.  You type
> in a { (which is intrinsically 4 characters too indented, for some value
> of 4) then do M-; to insert a comment at comment-column.  You fill in the
> comment, do C-e then RET.  The ensuing electric indentation on RET puts
> out the alignment of the comment:
>                             if (foo)       /* aligned comment */
> 			    {          /* coment misaligned by e-i-m */

Ah, you're again pointing out the benefit of adding more chars to
electric-indent-chars.  Fine.  We've already been in violent agreement
on this time for a long time.

>> >> What would be more optimal?
>> > A mode-dependent or buffer-local dependent setting, as well as, rather
>> > than instead of.
>> We have that: electric-indent-local-mode and electric-indent-inhibit.
> OK, for electric-indent-local-mode, which is gradually becoming
> prominent.  But I thought electric-indent-inhibit was a variable for major
> modes, not users - a mode initialisation thing, rather than a user
> configuration variable.

Indeed electric-indent-inhibit is not meant as a user-config.
And electric-indent-mode is not meant as a buffer-local config.
So what?  There is electric-indent-local-mode which is meant as
a buffer-local user-config.

So what is the problem?  Please tell precisely what feature you miss
rather than just criticize the existing ones.

>> Lack of patch implementing this (supposed) simple change?
> Here is what I propose, and am willing to do:
> 1. For electric indentation:
>   a - Restore `newline' and `newline-and-indent' to their traditional
>     functionality, and remove `electric-newline-and-maybe-indent'.
>   b - Simplify `electric-indent-post-self-insert-function' such that it
>     reindents only the line on which the self-inserting character is
>     typed.
>   c - Reform `electric-indent-local-mode' as a first-class minor mode and
>     `electric-indent-mode' as a global version of it.
> 2. For making RET indent the new line in programming modes:
>   a - Bind RET to `newline-and-indent' and C-j to `newline' in
>     `prog-mode-map' and possibly in certain other major mode maps (to be
>     discussed).
>   b - (Maybe) create a minor mode to restore RET and C-j to traditional
>     bindings.
> The above will leave electric-indent-mode functioning pretty much as it
> currently does.  What do you say?

I want to keep electric-indent-mode as a global mode that determines
whether certain self-inserting keys (such as RET and others) auto-indent.

>> So make this bug report specific about a particular circumstance where
>> the behavior is undesirable, or about how hard it is to disable it.
> I think RMS's bug #16156, reproduced and being discussed on a parallel
> thread, is a good enough example, so there's not much point in me opening
> a new one.

Then post in that bug explaining why the behavior is undesirable or how
hard it is to disable it.


        Stefan



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-25  1:53                                                 ` Dmitry Gutov
@ 2014-03-25  3:49                                                   ` Eli Zaretskii
  0 siblings, 0 replies; 64+ messages in thread
From: Eli Zaretskii @ 2014-03-25  3:49 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: acm, stephen, monnier, emacs-devel

> From: Dmitry Gutov <dgutov@yandex.ru>
> Cc: acm@muc.de,  stephen@xemacs.org,  monnier@IRO.UMontreal.CA,  emacs-devel@gnu.org
> Date: Tue, 25 Mar 2014 03:53:35 +0200
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> >> > This might be mostly true, but not always.  E.g., what if you delete a
> >> > character whose electricity caused the line to be indented in some
> >> > special way, when that character was inserted earlier?  After deleting
> >> > that character, the line might no longer be indented correctly.
> >> 
> >> This is covered by "through me typing TAB manually".
> >
> > It's a nuisance for me to have to type TAB every time.
> 
> "every time" sounds much more annoying than "every time I perform some
> improbable operation". ;)

When I edit source code, I don't think in terms of whether I've just
performed some improbable operation.  I just edit, and expect Emacs to
do the rest.  Typing RET is a natural part of editing; typing TAB is
not.



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-24 18:32                                           ` Stefan
  2014-03-25  1:49                                             ` Dmitry Gutov
@ 2014-03-25  7:44                                             ` Stephen J. Turnbull
  2014-03-25  8:08                                               ` Steinar Bang
  2014-03-25 13:26                                               ` Stefan Monnier
  1 sibling, 2 replies; 64+ messages in thread
From: Stephen J. Turnbull @ 2014-03-25  7:44 UTC (permalink / raw)
  To: Stefan; +Cc: Alan Mackenzie, emacs-devel, Dmitry Gutov

Stefan writes:

 > > FWIW, effectively doing `reindent-then-newline-and-indent' on RET also
 > > seems gratuitous to me. When I reach the end of a line, usually text on
 > > that line is already indented correctly (automatically, or through me
 > > typing TAB manually),
 > 
 > You might get used to "RET reindents" and stop hitting TAB that often ;-)

I'm very unlikely to get used to it.  Specifically, in the very
annoying case where unconventional indentation gets blown away by it
(TAB won't fix that!)

 > For me one of the reasons why it's not gratuitous is because of things like:
 > 
 >        begin
 >          blabla
 >          blibli
 >        end
 > 
 > Go to just before "blibli" and type "end RET": notice that hitting TAB
 > just before RET won't help you, because you need to reindent the line
 > after the newline is inserted.

I wouldn't do that, because the right indentation for "blibli" depends
on intended semantics.  That is, if I started from syntactically valid
code, after inserting "end" I now have invalid code ("end without
begin").  Non-trivial edits are required to return the buffer to
"well-formed" state, and I personally prefer the now-orphaned fragment
to retain its indentation, indicating its previous semantics.

Therefore I would go to the end of "blabla", and hit RET.  Why would I
care about the "no-op" reindent?  Because it might not be a no-op.
("blabla" might not be conventionally indented.)

 > This is admittedly less serious for interactive editing than for
 > keyboard macros (and templates/skeletons/snippets), but I find the
 > behavior to be handy.

In case of such things, I'd want to do

    C-x ( C-SPC ... macro keys ... C-x C-x M-x indent-region C-x )

(except in Python, where you're screwed because block structure is
determined by indentation, so situations where determining the
appropriate number of dedents requires knowing the intended semantics
are common).

 > > For all others, just swapping C-j and RET bindings would've worked just
 > > as well, and I think it would result in simpler code.
 > 
 > Again "just swapping" sounds simple, but I'm not sure what patch you
 > have in mind.  I think it's important for the user to be able to easily
 > say something like (electric-indent-mode -1) (and/or its buffer-local
 > equivalent) to recover the Emacs-23 behavior.

"Just swapping" is entirely independent of electric-indent-mode.  It
wouldn't change the Emacs-23 behavior, just have it on different keys.




^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-25  7:44                                             ` Stephen J. Turnbull
@ 2014-03-25  8:08                                               ` Steinar Bang
  2014-03-25 16:49                                                 ` Stephen J. Turnbull
  2014-03-25 13:26                                               ` Stefan Monnier
  1 sibling, 1 reply; 64+ messages in thread
From: Steinar Bang @ 2014-03-25  8:08 UTC (permalink / raw)
  To: emacs-devel

>>>>> "Stephen J. Turnbull" <stephen@xemacs.org>:

>> You might get used to "RET reindents" and stop hitting TAB that often ;-)

> I'm very unlikely to get used to it.  Specifically, in the very
> annoying case where unconventional indentation gets blown away by it
> (TAB won't fix that!)

I've been C-j'ing to get return and indent, since I first startet using
emacs, back in 1987 or 1988 or thereabouts.

Works for me.




^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-25  7:44                                             ` Stephen J. Turnbull
  2014-03-25  8:08                                               ` Steinar Bang
@ 2014-03-25 13:26                                               ` Stefan Monnier
  2014-03-27  7:51                                                 ` Stephen J. Turnbull
  1 sibling, 1 reply; 64+ messages in thread
From: Stefan Monnier @ 2014-03-25 13:26 UTC (permalink / raw)
  To: Stephen J. Turnbull; +Cc: Alan Mackenzie, emacs-devel, Dmitry Gutov

> I'm very unlikely to get used to it.  Specifically, in the very
> annoying case where unconventional indentation gets blown away by it
> (TAB won't fix that!)

Of course, in that case you simply want to disable electric-indent-mode.


        Stefan



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-25  8:08                                               ` Steinar Bang
@ 2014-03-25 16:49                                                 ` Stephen J. Turnbull
  2014-03-25 17:08                                                   ` Steinar Bang
  0 siblings, 1 reply; 64+ messages in thread
From: Stephen J. Turnbull @ 2014-03-25 16:49 UTC (permalink / raw)
  To: Steinar Bang; +Cc: emacs-devel

Steinar Bang writes:
 > >>>>> "Stephen J. Turnbull" <stephen@xemacs.org>:
 > 
 > >> You might get used to "RET reindents" and stop hitting TAB that often ;-)
 > 
 > > I'm very unlikely to get used to it.  Specifically, in the very
 > > annoying case where unconventional indentation gets blown away by it
 > > (TAB won't fix that!)
 > 
 > I've been C-j'ing to get return and indent, since I first startet using
 > emacs, back in 1987 or 1988 or thereabouts.
 > 
 > Works for me.

*sigh* That is simply not the point, it has worked forever (I started
using Emacs in 1979, don't remember if `newline-and-indent' was
implemented in pre-GNU Emacsen) and I don't expect it to stop working.

There are two problems with binding `reindent-then-newline-and-indent'
(RTNAT) and `newline-and-indent' (NAT) but not `newline'.  The first
is that the simple, reliable "newline" behavior is not easily available
in macros and the like.

The second is that for many users RTNAT is going to be identical to
NAT 95% of the time, or perhaps more, depending on how often they edit
code such that the changed syntax requires changed indentation.  This
makes one simply an unreliable version of the other, ISTM.  If a user
likes RTNAT behavior, they probably are willing to put up with the
occasional spurious indentation change -- and won't use the NAT
binding.  If they don't like that behavior, they won't use the RTNAT
binding anyway.

I don't think this is good UI.  Keystrokes are scarce in Emacs.  They
shouldn't be spent on keeping users of different preferences happy,
that's the job of minor modes.





^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-25 16:49                                                 ` Stephen J. Turnbull
@ 2014-03-25 17:08                                                   ` Steinar Bang
  2014-03-25 17:31                                                     ` Dmitry Gutov
  0 siblings, 1 reply; 64+ messages in thread
From: Steinar Bang @ 2014-03-25 17:08 UTC (permalink / raw)
  To: emacs-devel

>>>>> "Stephen J. Turnbull" <stephen@xemacs.org>:

> *sigh* That is simply not the point, it has worked forever (I started
> using Emacs in 1979, don't remember if `newline-and-indent' was
> implemented in pre-GNU Emacsen) and I don't expect it to stop working.

Well, actually my message was meant to be that I agree with you.

What I tried to say was "that the functionality already exists, has
existed for a long time, and my fingers know how to find it, so please
don't touch the existing binding of RET!"




^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-25 17:08                                                   ` Steinar Bang
@ 2014-03-25 17:31                                                     ` Dmitry Gutov
  2014-03-25 19:28                                                       ` Steinar Bang
  0 siblings, 1 reply; 64+ messages in thread
From: Dmitry Gutov @ 2014-03-25 17:31 UTC (permalink / raw)
  To: emacs-devel

Steinar Bang <sb@dod.no> writes:

> What I tried to say was "that the functionality already exists, has
> existed for a long time, and my fingers know how to find it, so please
> don't touch the existing binding of RET!"

Seriously, that's a weak argument: changing the binding back is a
one-off operation.

It has been well-established that many existing and most new users
expect RET to perform indentation.



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-25 17:31                                                     ` Dmitry Gutov
@ 2014-03-25 19:28                                                       ` Steinar Bang
  2014-03-25 19:49                                                         ` David Kastrup
  0 siblings, 1 reply; 64+ messages in thread
From: Steinar Bang @ 2014-03-25 19:28 UTC (permalink / raw)
  To: emacs-devel

>>>>> Dmitry Gutov <dgutov@yandex.ru>:

> It has been well-established that many existing and most new users
> expect RET to perform indentation.

If they wish to, they can change the keybinding.

It's a one-time operation.





^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-25 19:28                                                       ` Steinar Bang
@ 2014-03-25 19:49                                                         ` David Kastrup
  2014-03-25 19:54                                                           ` Dmitry Gutov
  0 siblings, 1 reply; 64+ messages in thread
From: David Kastrup @ 2014-03-25 19:49 UTC (permalink / raw)
  To: emacs-devel

Steinar Bang <sb@dod.no> writes:

>>>>>> Dmitry Gutov <dgutov@yandex.ru>:
>
>> It has been well-established that many existing and most new users
>> expect RET to perform indentation.
>
> If they wish to, they can change the keybinding.
>
> It's a one-time operation.

Ah, but will it be easier for the new users or the old hands to do that
one-time operation?

Actually, that question may be harder to answer than it looks like,
considering that the old hands consider things like customization menus
the spawn of vi and have probably disabled menus so long ago that they
don't even remember their existence any more.

-- 
David Kastrup




^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-25 19:49                                                         ` David Kastrup
@ 2014-03-25 19:54                                                           ` Dmitry Gutov
  0 siblings, 0 replies; 64+ messages in thread
From: Dmitry Gutov @ 2014-03-25 19:54 UTC (permalink / raw)
  To: David Kastrup; +Cc: emacs-devel

David Kastrup <dak@gnu.org> writes:

> Ah, but will it be easier for the new users or the old hands to do that
> one-time operation?
>
> Actually, that question may be harder to answer than it looks like,
> considering that the old hands consider things like customization menus
> the spawn of vi and have probably disabled menus so long ago that they
> don't even remember their existence any more.

I'm pretty sure the old users are all familiar with `define-key' (among
other functions). Anyone who doesn't is insufficiently old.

The set of old users is limited, and it's bound to decline over time.

The set of new users is essentially unlimited, and we better hope it'll
exceed the amount of the current old users many times over.



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-25  1:37                                         ` Dmitry Gutov
@ 2014-03-26 20:53                                           ` Alan Mackenzie
  2014-03-27  8:02                                             ` Dmitry Gutov
  0 siblings, 1 reply; 64+ messages in thread
From: Alan Mackenzie @ 2014-03-26 20:53 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: Stefan, emacs-devel

Hello, Dmitry.

On Tue, Mar 25, 2014 at 03:37:15AM +0200, Dmitry Gutov wrote:
> Alan Mackenzie <acm@muc.de> writes:

> >> > A mode-dependent or buffer-local dependent setting, as well as, rather
> >> > than instead of.

> >> We have that: electric-indent-local-mode and electric-indent-inhibit.

> > OK, for electric-indent-local-mode, which is gradually becoming
> > prominent.  But I though electric-indent-inhibit was a variable for major
> > modes, not users - a mode initialisation thing, rather than a user
> > configuration variable.

> This is usually the case with buffer-local dependent settings. They're
> impossible to set via Customize (I think), so one doesn't usually think
> of them as user options, but a user can modify such var in a hook, too.

That's not what I meant.  I meant something more like
electric-indent-inhibit being a setting which defines a major mode rather
than being a way of configuring it.

> >  b - Simplify `electric-indent-post-self-insert-function' such that it
> >    reindents only the line on which the self-inserting character is
> >    typed.

> It would still need to handle presence of ?\n in `electric-indent-chars'
> when that's the case.  This value is somewhat special since the
> line-to-be reindented would be the previous, not the current one.

Yes to all of that.  But I expressed myself precisely, and meant what I
wrote.

> > 2. For making RET indent the new line in programming modes:
> >   a - Bind RET to `newline-and-indent' and C-j to `newline' in
> >     `prog-mode-map' and possibly in certain other major mode maps (to be
> >     discussed).

> I believe there's something to be said for consistency: having RET
> indent line in some modes, but not others doesn't make much sense to me.

Indentation (in the sense of what `indent-line-function' does) only makes
sense in programming (etc.) modes.  In text modes, and the like,
indentation is, in practice, done with adaptive fill prefices.

Having RET do `newline-and-indent' in Emacs Lisp Mode while doing
`newline' in Text Mode makes a lot of sense to me.  A trickier question
is to identify which of the non-programming modes really want this sort
of indentation.

> There's a certain class of users who've been binding RET to
> `newline-and-indent' for a long time (myself included), and I haven't
> seen anyone mention only doing that in prog-mode, instead of globally.

That was what we collectively decided last Autumn when the topic came up.

You've seen me mention it.  ;-)

Richard Stallman alluded to it in his disgust at bug #16156, when what
was bound to RET at the time zapped his indentation.

I personally would not be unhappy at leaving the traditional binding in
place for RET and C-j, but wouldn't mind them swapping in "indenting"
modes.  I'd object strongly to RET in text mode messing around with
indentation.

> >   b - (Maybe) create a minor mode to restore RET and C-j to traditional
> >     bindings.

> How hard can it be for a user to change the key bindings without a mode?

Middling, not very.  Such a minor mode might serve to damp down the
inevitable complaints the change in defaults will provoke.

> >> So make this bug report specific about a particular circumstance where
> >> the behavior is undesirable, or about how hard it is to disable it.

> > I think RMS's bug #16156, reproduced and being discussed on a parallel
> > thread, is a good enough example, so there's not much point in me opening
> > a new one.

> This behavior, as described in the bug above, makes sense to me, so it's
> clearly a personal preference.

By "makes sense" I think you mean "seems a sensible thing to do".  I take
issue with you here and say that, in Text Mode, it's a bizarre thing to
do.  I can't think of any normal circumstances where this behaviour would
be commonly desired; just how often in Text Mode do you not want RET just
to insert a new line when you type it at the beginning of a line?

-- 
Alan Mackenzie (Nuremberg, Germany).



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-25  1:54                                         ` Stefan
@ 2014-03-26 21:21                                           ` Alan Mackenzie
  2014-03-27 14:49                                             ` Stefan Monnier
  0 siblings, 1 reply; 64+ messages in thread
From: Alan Mackenzie @ 2014-03-26 21:21 UTC (permalink / raw)
  To: Stefan; +Cc: emacs-devel

Hello, Stefan.

On Mon, Mar 24, 2014 at 09:54:40PM -0400, Stefan wrote:

> >> > A mode-dependent or buffer-local dependent setting, as well as, rather
> >> > than instead of.
> >> We have that: electric-indent-local-mode and electric-indent-inhibit.
> > OK, for electric-indent-local-mode, which is gradually becoming
> > prominent.  But I thought electric-indent-inhibit was a variable for major
> > modes, not users - a mode initialisation thing, rather than a user
> > configuration variable.

> Indeed electric-indent-inhibit is not meant as a user-config.
> And electric-indent-mode is not meant as a buffer-local config.
> So what?  There is electric-indent-local-mode which is meant as
> a buffer-local user-config.

> So what is the problem?  Please tell precisely what feature you miss
> rather than just criticize the existing ones.

I seem to have lost the thread here.  Maybe there aren't any.

> >> Lack of patch implementing this (supposed) simple change?
> > Here is what I propose, and am willing to do:
> > 1. For electric indentation:
> >   a - Restore `newline' and `newline-and-indent' to their traditional
> >     functionality, and remove `electric-newline-and-maybe-indent'.
> >   b - Simplify `electric-indent-post-self-insert-function' such that it
> >     reindents only the line on which the self-inserting character is
> >     typed.
> >   c - Reform `electric-indent-local-mode' as a first-class minor mode and
> >     `electric-indent-mode' as a global version of it.
> > 2. For making RET indent the new line in programming modes:
> >   a - Bind RET to `newline-and-indent' and C-j to `newline' in
> >     `prog-mode-map' and possibly in certain other major mode maps (to be
> >     discussed).
> >   b - (Maybe) create a minor mode to restore RET and C-j to traditional
> >     bindings.
> > The above will leave electric-indent-mode functioning pretty much as it
> > currently does.  What do you say?

> I want to keep electric-indent-mode as a global mode that determines
> whether certain self-inserting keys (such as RET and others) auto-indent.

How is this not satisfied by e-i-m being a define-globalized-minor-mode?
With the current setup, we have a rather contorted relationship between
e-i-m and e-i-local-m, with buffer local copies of electric-indent-mode
popping into and out of existence.

What about the rest of my suggestion?

>         Stefan

-- 
Alan Mackenzie (Nuremberg, Germany).



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-25 13:26                                               ` Stefan Monnier
@ 2014-03-27  7:51                                                 ` Stephen J. Turnbull
  0 siblings, 0 replies; 64+ messages in thread
From: Stephen J. Turnbull @ 2014-03-27  7:51 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Alan Mackenzie, Dmitry Gutov, emacs-devel

Stefan Monnier writes:
 > > I'm very unlikely to get used to it.  Specifically, in the very
 > > annoying case where unconventional indentation gets blown away by it
 > > (TAB won't fix that!)
 > 
 > Of course, in that case you simply want to disable electric-indent-mode.

Doesn't that turn off *all* the electric characters?  Or are you
saying it's possible to turn of electric indent mode for a particular
line?

Also, the usual electric characters don't usually figure in the
affected lines.  It's only RET that I'd like to be able to use.




^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-26 20:53                                           ` Alan Mackenzie
@ 2014-03-27  8:02                                             ` Dmitry Gutov
  2014-03-30 14:57                                               ` Alan Mackenzie
  0 siblings, 1 reply; 64+ messages in thread
From: Dmitry Gutov @ 2014-03-27  8:02 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: Stefan, emacs-devel

Hi Alan,

On 26.03.2014 22:53, Alan Mackenzie wrote:

> Indentation (in the sense of what `indent-line-function' does) only makes
> sense in programming (etc.) modes.  In text modes, and the like,
> indentation is, in practice, done with adaptive fill prefices.

This could be considered a reason to improve the indent-line-function in 
text-mode. `indent-relative' offers behavior that's pretty close. Maybe 
it could be made to follow the behavior of auto-fill even closer.

> Having RET do `newline-and-indent' in Emacs Lisp Mode while doing
> `newline' in Text Mode makes a lot of sense to me.  A trickier question
> is to identify which of the non-programming modes really want this sort
> of indentation.

I'd rather make exceptions for specific "non-programming modes", where 
indentation of the next line is really hard to guess.

Many modes that don't inherit from prog-mode have something to do with 
structured content, and often define their own specific indentation 
functions (sgml-mode, markdown-mode inherit from text-mode, css-mode and 
yaml-mode inherit from fundamental-mode).

I'd really expect typing <div> and pressing RET in html-mode to offer 
hard +2 indentation on the next line, but I wouldn't call it a 
programming mode.

In Markdown, I'm often typing code blocks, and I expect RET to bring me 
to the column which the previous line was indented to, so I don't have 
to press TAB each time. And if I'm outside of a code block, the lines 
usually either have no indentation (then indent-relative indents to the 
0th column as well), or they serve as continuation of a paragraph, and I 
want each next line to have the same extra indentation until the 
paragraph ends (and indent-relative does that well enough).

The last time I used text-mode, it was for a similar purpose (a couple 
of code blocks, and the rest of the text is indented to column 0).

`M-x fill-paragraph' would slaughter the code blocks, and it wouldn't 
improve the indentation anywhere else.

It also eats line breaks that were put in manually. A good example is 
ChangeLog files: we often see cleanup commits in Emacs that change the 
places where the lines are broken, for better readability, in ways that 
fill-paragraph is unable to do automatically.

And if ChangeLog files didn't always magically have the right 
indentation (one tab), and one had to fix it with `fill-paragraph', all 
the manual line breaks would be mangled, each time. It still happens 
when I fix lines that are too long this way.

>> There's a certain class of users who've been binding RET to
>> `newline-and-indent' for a long time (myself included), and I haven't
>> seen anyone mention only doing that in prog-mode, instead of globally.
>
> That was what we collectively decided last Autumn when the topic came up.

Okay: I haven't seen anyone mention doing it outside of emacs-devel.

> Richard Stallman alluded to it in his disgust at bug #16156, when what
> was bound to RET at the time zapped his indentation.
>
> I personally would not be unhappy at leaving the traditional binding in
> place for RET and C-j, but wouldn't mind them swapping in "indenting"
> modes.  I'd object strongly to RET in text mode messing around with
> indentation.

Maybe text-mode by itself should be a special case. I don't use it often 
enough to have a strong opinion.

>> How hard can it be for a user to change the key bindings without a mode?
>
> Middling, not very.  Such a minor mode might serve to damp down the
> inevitable complaints the change in defaults will provoke.

As long as this new mode is divorced from electric-indent-mode, I'd be 
happy.

> By "makes sense" I think you mean "seems a sensible thing to do".  I take
> issue with you here and say that, in Text Mode, it's a bizarre thing to
> do.  I can't think of any normal circumstances where this behaviour would
> be commonly desired; just how often in Text Mode do you not want RET just
> to insert a new line when you type it at the beginning of a line?

This specific behavior is a consequence of using `newline-and-indent'. 
One answer may be "Don't want that? Use `open-line'", which I sometimes 
do, but special-casing indent-line-function in text-mode not to reindent 
on the first invocation (when point is at bol followed by whitespace and 
then non-whitespace on the same line) could well be another option.

What makes sense to me, is using `newline-and-indent' itself. Richard 
doesn't like

foo
|  bar

turning into

foo

|bar

I can understand that, but I don't like

foo
   bar|baz

turning into

foo
   bar
|baz  (note the missing indentation)

Which situation do you think occurs more frequently?



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-26 21:21                                           ` Alan Mackenzie
@ 2014-03-27 14:49                                             ` Stefan Monnier
  2014-03-30 11:37                                               ` Alan Mackenzie
  0 siblings, 1 reply; 64+ messages in thread
From: Stefan Monnier @ 2014-03-27 14:49 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: emacs-devel

>> I want to keep electric-indent-mode as a global mode that determines
>> whether certain self-inserting keys (such as RET and others) auto-indent.
> How is this not satisfied by e-i-m being a define-globalized-minor-mode?

AFAICT your suggestion would not swap RET/C-j depending on e-i-m.

> With the current setup, we have a rather contorted relationship between
> e-i-m and e-i-local-m, with buffer local copies of electric-indent-mode
> popping into and out of existence.

For a setting which is mostly global by nature (it reflects on the
user's general preference), I'm not worried and generally prefer this
over using define-globalized-minor-mode which is a fine hack, but
a hack nevertheless.

> What about the rest of my suggestion?

I'm worried about the possible consequences: e-i-m has been around for
a little while now and we're somewhat familiar with its problems.
Your approach might solve some problems (tho I haven't seen a clear
statement of what those problems are, in terms of *behavior*), but will
inevitably come with its own set of consequences.


        Stefan



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-27 14:49                                             ` Stefan Monnier
@ 2014-03-30 11:37                                               ` Alan Mackenzie
  2014-03-30 16:46                                                 ` Stefan Monnier
  0 siblings, 1 reply; 64+ messages in thread
From: Alan Mackenzie @ 2014-03-30 11:37 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

Hello, Stefan.

On Thu, Mar 27, 2014 at 10:49:06AM -0400, Stefan Monnier wrote:
> >> I want to keep electric-indent-mode as a global mode that determines
> >> whether certain self-inserting keys (such as RET and others) auto-indent.
> > How is this not satisfied by e-i-m being a define-globalized-minor-mode?

> AFAICT your suggestion would not swap RET/C-j depending on e-i-m.

It would most emphatically not do so.  That is something which was never
discussed on emacs-devel before it was implemented, and it is wrong.
Unrelated things should not be bound together into a single action.

> > With the current setup, we have a rather contorted relationship between
> > e-i-m and e-i-local-m, with buffer local copies of electric-indent-mode
> > popping into and out of existence.

> For a setting which is mostly global by nature (it reflects on the
> user's general preference), I'm not worried and generally prefer this
> over using define-globalized-minor-mode which is a fine hack, but
> a hack nevertheless.

Eh?  How does global-font-lock-mode, for example, not work 100%?  It is
also "mostly global by nature".  What might not work properly if e-i-m
was made into a globalized minor mode?

With a globalized-minor-mode, it is predictable which buffers are
affected when the global command is given, namely all of them.  With
e-i-m, only some buffers are affected, and there is currently no
rationale behind which ones are, which ones aren't.  You need to read the
source code to work this out, and that is bad.

> > What about the rest of my suggestion?

> I'm worried about the possible consequences: e-i-m has been around for
> a little while now and we're somewhat familiar with its problems.

The changes I'm proposing, with the exception already noted, are not
changes in functionality.  e-i-m is essentially still fresh code - one or
two enthusiasts used it in 24.3, but it hasn't really hit big time yet.
Now is the right time to sort out its problems.  Besides, we're hackers,
and we're competent.  :-)

> Your approach might solve some problems (tho I haven't seen a clear
> statement of what those problems are, in terms of *behavior*), ...

e-i-m also toggling RET/C-j is a behaviour problem, as noted above.

But the other problems are those of bad design and bad coding, not bad
behaviour.  They are all the the consequence of a single design mistake,
namely that e-i-post-self-insert-function tries to handle the indentation
of a new line.  This has led to difficult to understand overcomplicated
coding, functional duplication, disassociation of functionality from
defuns, damaged backward compatibility, ....

These problems should be _fixed_.  To fix them is not difficult.  I'm
willing to do this.

> .... but will inevitably come with its own set of consequences.

Inevitably?  How so?

>         Stefan

-- 
Alan Mackenzie (Nuremberg, Germany).



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-27  8:02                                             ` Dmitry Gutov
@ 2014-03-30 14:57                                               ` Alan Mackenzie
  2014-03-31 17:11                                                 ` Dmitry Gutov
  0 siblings, 1 reply; 64+ messages in thread
From: Alan Mackenzie @ 2014-03-30 14:57 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: Stefan, emacs-devel

Hello, Dmitry.

On Thu, Mar 27, 2014 at 10:02:49AM +0200, Dmitry Gutov wrote:
> On 26.03.2014 22:53, Alan Mackenzie wrote:

> > Indentation (in the sense of what `indent-line-function' does) only makes
> > sense in programming (etc.) modes.  In text modes, and the like,
> > indentation is, in practice, done with adaptive fill prefices.

> This could be considered a reason to improve the indent-line-function in 
> text-mode. `indent-relative' offers behavior that's pretty close. Maybe 
> it could be made to follow the behavior of auto-fill even closer.

Notice, here, how we're no longer talking about electric indentation, but
rather about newline-and-indent.  The two topics are distinct.

> > Having RET do `newline-and-indent' in Emacs Lisp Mode while doing
> > `newline' in Text Mode makes a lot of sense to me.  A trickier question
> > is to identify which of the non-programming modes really want this sort
> > of indentation.

> I'd rather make exceptions for specific "non-programming modes", where 
> indentation of the next line is really hard to guess.

Yes, but how?  fundamental-mode is a non-programming mode, so the global
key map needs RET set up for newline, C-j for newline-and-indent.  That
leaves lots of mode key maps to be set up.  At this point, your
suggestion and mine become the same.

> Many modes that don't inherit from prog-mode have something to do with 
> structured content, and often define their own specific indentation 
> functions (sgml-mode, markdown-mode inherit from text-mode, css-mode and 
> yaml-mode inherit from fundamental-mode).

> I'd really expect typing <div> and pressing RET in html-mode to offer 
> hard +2 indentation on the next line, but I wouldn't call it a 
> programming mode.

Yes.

> In Markdown, I'm often typing code blocks, and I expect RET to bring me 
> to the column which the previous line was indented to, so I don't have 
> to press TAB each time. And if I'm outside of a code block, the lines 
> usually either have no indentation (then indent-relative indents to the 
> 0th column as well), or they serve as continuation of a paragraph, and I 
> want each next line to have the same extra indentation until the 
> paragraph ends (and indent-relative does that well enough).

I usually think of html, markdown, and such like, as the "etc." in
"programming modes (etc.)".

> The last time I used text-mode, it was for a similar purpose (a couple 
> of code blocks, and the rest of the text is indented to column 0).

> `M-x fill-paragraph' would slaughter the code blocks, and it wouldn't 
> improve the indentation anywhere else.

If you edit the non-code blocks a lot in text mode, `fill-paragraph' is
_exactly_ what's wanted to restore the filling.  I think, in text mode,
M-q preserves existing indentation.

> >> There's a certain class of users who've been binding RET to
> >> `newline-and-indent' for a long time (myself included), and I
> >> haven't seen anyone mention only doing that in prog-mode, instead of
> >> globally.

> > That was what we collectively decided last Autumn when the topic came up.

> Okay: I haven't seen anyone mention doing it outside of emacs-devel.

> > Richard Stallman alluded to it in his disgust at bug #16156, when what
> > was bound to RET at the time zapped his indentation.

> > I personally would not be unhappy at leaving the traditional binding in
> > place for RET and C-j, but wouldn't mind them swapping in "indenting"
> > modes.  I'd object strongly to RET in text mode messing around with
> > indentation.

> Maybe text-mode by itself should be a special case. I don't use it often 
> enough to have a strong opinion.

I think RET should do the most natural sort of newline, and C-j the
subsidiary one, whatever they may happen to be for a particular mode.

> >> How hard can it be for a user to change the key bindings without a
> >> mode?

> > Middling, not very.  Such a minor mode might serve to damp down the
> > inevitable complaints the change in defaults will provoke.

> As long as this new mode is divorced from electric-indent-mode, I'd be 
> happy.

This is a key point.

> > By "makes sense" I think you mean "seems a sensible thing to do".  I take
> > issue with you here and say that, in Text Mode, it's a bizarre thing to
> > do.  I can't think of any normal circumstances where this behaviour would
> > be commonly desired; just how often in Text Mode do you not want RET just
> > to insert a new line when you type it at the beginning of a line?

> This specific behavior is a consequence of using `newline-and-indent'. 

No, not at all.  It's a consequence of electric behaviour getting
entangled with newline-and-indent.  Electric indentation doesn't belong
in Text Mode.  It's useful only where the indentation of a line of code
can be changed by what's in the line.

> One answer may be "Don't want that? Use `open-line'", which I sometimes 
> do, but special-casing indent-line-function in text-mode not to reindent 
> on the first invocation (when point is at bol followed by whitespace and 
> then non-whitespace on the same line) could well be another option.

;-)  That would be papering over the cracks.  Banishing electric
indentation from major modes where it's silly is what we really want.

> What makes sense to me, is using `newline-and-indent' itself. Richard 
> doesn't like

> foo
> |  bar

> turning into

> foo

> |bar

> I can understand that, but I don't like

> foo
>    bar|baz

> turning into

> foo
>    bar
> |baz  (note the missing indentation)

> Which situation do you think occurs more frequently?

The two are completely non-competing situations.  RMS's happened because
electric indentation was active where it shouldn't be.  Your situation is
a matter of binding (RET C-j) to ('newline 'newline-and-indent) the
appropriate way round.  Don't confuse these.

I think Text Mode is about typing natural language text in paragraphs.
The "indentation" will be the adaptive fill prefix inserted by
auto-fill-mode.  Normally, you'll be typing RET to start a new paragraph,
and this will either be at column 0, or at some column not dependent on
the previous text.  newline-and-indent isn't the Right Thing here.

-- 
Alan Mackenzie (Nuremberg, Germany).



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-30 11:37                                               ` Alan Mackenzie
@ 2014-03-30 16:46                                                 ` Stefan Monnier
  0 siblings, 0 replies; 64+ messages in thread
From: Stefan Monnier @ 2014-03-30 16:46 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: emacs-devel

>> >> I want to keep electric-indent-mode as a global mode that determines
>> >> whether certain self-inserting keys (such as RET and others) auto-indent.
>> > How is this not satisfied by e-i-m being a define-globalized-minor-mode?
>> AFAICT your suggestion would not swap RET/C-j depending on e-i-m.
> It would most emphatically not do so.

This is a non-starter: cutting the link between the two is not really up
for negotiation, it's an important part of keeping the interface simple.

That is: it's OK to have a custom var deciding whether e-i-m swaps RET
and LF, but by default that custom var should be enabled.

> Eh?  How does global-font-lock-mode, for example, not work 100%?

Analyze the code from a suspicious point of view, like you do for e-i-m,
and you'll soon find ways.  Or use your memory of problems we've had.

>> I'm worried about the possible consequences: e-i-m has been around for
>> a little while now and we're somewhat familiar with its problems.
> The changes I'm proposing, with the exception already noted, are not
> changes in functionality.

I'd be very surprised if it doesn't change functionality: saying it
doesn't is not sufficient.


        Stefan



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-30 14:57                                               ` Alan Mackenzie
@ 2014-03-31 17:11                                                 ` Dmitry Gutov
  2014-04-03 21:53                                                   ` Alan Mackenzie
  0 siblings, 1 reply; 64+ messages in thread
From: Dmitry Gutov @ 2014-03-31 17:11 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: Stefan, emacs-devel

On 30.03.2014 17:57, Alan Mackenzie wrote:

>> This could be considered a reason to improve the indent-line-function in
>> text-mode. `indent-relative' offers behavior that's pretty close. Maybe
>> it could be made to follow the behavior of auto-fill even closer.
>
> Notice, here, how we're no longer talking about electric indentation, but
> rather about newline-and-indent.  The two topics are distinct.

Yes, but I think we're discussing both in this thread. FWIW, I think 
we're in agreement about electric indentation on RET. See my message 
here, and also Stefan's reply:

http://lists.gnu.org/archive/html/emacs-devel/2014-03/msg00936.html
http://lists.gnu.org/archive/html/emacs-devel/2014-03/msg00957.html

> Yes, but how?  fundamental-mode is a non-programming mode, so the global
> key map needs RET set up for newline, C-j for newline-and-indent.  That
> leaves lots of mode key maps to be set up.  At this point, your
> suggestion and mine become the same.

Maybe.

> I usually think of html, markdown, and such like, as the "etc." in
> "programming modes (etc.)".

Yeah, okay. Which other modes exactly need newline-and-indent on RET 
could be a matter of debate, but one possible criteria is "mode has a 
meaningful/specialized indentation function".

> If you edit the non-code blocks a lot in text mode, `fill-paragraph' is
> _exactly_ what's wanted to restore the filling.

If the filling algorithm is perfect, then yes, it could be what's wanted.

> I think RET should do the most natural sort of newline, and C-j the
> subsidiary one, whatever they may happen to be for a particular mode.

Sounds okay, I guess.

>> As long as this new mode is divorced from electric-indent-mode, I'd be
>> happy.
>
> This is a key point.

It could be something called like `old-newline-keys-mode'. Appropriate 
major modes would swap RET and C-j bindings, and the above minor mode 
would force them all back to (RET C-j) -> (newline newline-and-indent).

>> This specific behavior is a consequence of using `newline-and-indent'.
>
> No, not at all.  It's a consequence of electric behaviour getting
> entangled with newline-and-indent.

It's the same if I disable `electric-indent-mode' but bind RET to 
`newline-and-indent'.

And if `electric-indent-mode' didn't do `-and-indent' but retained the 
electric indent on RET, a similar example is easy to demonstrate:

foo
   bar|

Press RET, see the same result.

IOW, text-mode could be considered in trouble if RET triggers call to 
indentation at any line.

> The two are completely non-competing situations.  RMS's happened because
> electric indentation was active where it shouldn't be.

AFAICT it's the opposite, but see the scenario above.

To quote the bug report: "and point is at the start of the second line"

> Your situation is
> a matter of binding (RET C-j) to ('newline 'newline-and-indent) the
> appropriate way round.  Don't confuse these.

Indeed, for my usage the above binding is sufficient.



^ permalink raw reply	[flat|nested] 64+ messages in thread

* Re: [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478.
  2014-03-31 17:11                                                 ` Dmitry Gutov
@ 2014-04-03 21:53                                                   ` Alan Mackenzie
  0 siblings, 0 replies; 64+ messages in thread
From: Alan Mackenzie @ 2014-04-03 21:53 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: Stefan, emacs-devel

Hello, Dmitry.

On Mon, Mar 31, 2014 at 08:11:58PM +0300, Dmitry Gutov wrote:
> On 30.03.2014 17:57, Alan Mackenzie wrote:

> >> This could be considered a reason to improve the
> >> indent-line-function in text-mode. `indent-relative' offers behavior
> >> that's pretty close. Maybe it could be made to follow the behavior
> >> of auto-fill even closer.

> > Notice, here, how we're no longer talking about electric indentation, but
> > rather about newline-and-indent.  The two topics are distinct.

> Yes, but I think we're discussing both in this thread. FWIW, I think 
> we're in agreement about electric indentation on RET. See my message 
> here, and also Stefan's reply:

> http://lists.gnu.org/archive/html/emacs-devel/2014-03/msg00936.html
> http://lists.gnu.org/archive/html/emacs-devel/2014-03/msg00957.html

Yes, I think we're in agreement with eachother, but not with Stefan.  He
has decided to conflate the RET/C-j bindings and electric-indent-mode,
and to have these bindings apparently flip each time e-i-m is called.
He's also decided to do this although there's never been any meaningful
discussion of it here, and there isn't going to be any.

> > I usually think of html, markdown, and such like, as the "etc." in
> > "programming modes (etc.)".

> Yeah, okay. Which other modes exactly need newline-and-indent on RET 
> could be a matter of debate, but one possible criteria is "mode has a 
> meaningful/specialized indentation function".

Hmm.  I'm not sure that gets us very far, in practice.  What does
"meaningful/specialized" mean?  I'll be more specific: programming modes
which use syntactic indentation (i.e. most of them) and the various
markup-like modes which are "like" programming languages.

> > I think RET should do the most natural sort of newline, and C-j the
> > subsidiary one, whatever they may happen to be for a particular mode.

> Sounds okay, I guess.

> >> As long as this new mode is divorced from electric-indent-mode, I'd be
> >> happy.

> > This is a key point.

> It could be something called like `old-newline-keys-mode'. Appropriate 
> major modes would swap RET and C-j bindings, and the above minor mode 
> would force them all back to (RET C-j) -> (newline newline-and-indent).

Again, Stefan has decided there will be no such new mode, and that its
functionality is going to be twisted up with electric-indent-mode, rather
than being independent of it.  It now seems us discussing this further
would just be a waste of time.


> >> This specific behavior is a consequence of using `newline-and-indent'.

> > No, not at all.  It's a consequence of electric behaviour getting
> > entangled with newline-and-indent.

> It's the same if I disable `electric-indent-mode' but bind RET to 
> `newline-and-indent'.

> And if `electric-indent-mode' didn't do `-and-indent' but retained the 
> electric indent on RET, a similar example is easy to demonstrate:

> foo
>    bar|

> Press RET, see the same result.

Yes.  Again, if we're in a programming mode that's what we want nearly
all the time - it's what electric indentation is for (despite all the
disadvantages of doing it on \n).  In non-programming modes it's what we
don't want.  It now seems Somebody (tm) is going to have to trawl through
all major modes disabling electric indentation for lots of them.

> IOW, text-mode could be considered in trouble if RET triggers call to 
> indentation at any line.

Yes indeed.

-- 
Alan Mackenzie (Nuremberg, Germany).



^ permalink raw reply	[flat|nested] 64+ messages in thread

end of thread, other threads:[~2014-04-03 21:53 UTC | newest]

Thread overview: 64+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <E1WFSpO-0001e7-Gm@vcs.savannah.gnu.org>
2014-02-18  0:11 ` [Emacs-diffs] trunk r116461: Connect electric-indent-mode up with CC Mode. Bug #15478 Stefan Monnier
2014-02-22 18:27   ` Alan Mackenzie
2014-02-25  3:24     ` Stefan Monnier
2014-02-28 19:50       ` Alan Mackenzie
2014-03-01 15:57         ` Stefan Monnier
2014-03-02 11:51           ` Alan Mackenzie
2014-03-04  3:48             ` Stefan Monnier
2014-03-08 22:58               ` Alan Mackenzie
2014-03-09  1:57                 ` Stefan Monnier
2014-03-09 12:37                   ` Alan Mackenzie
2014-03-10  3:37                     ` Stefan Monnier
2014-03-10  6:59                       ` Glenn Morris
2014-03-10 12:24                       ` João Távora
2014-03-10 18:30                         ` Stefan Monnier
2014-03-16 22:35                       ` Alan Mackenzie
2014-03-17 15:48                         ` Stefan
2014-03-19 22:42                           ` Alan Mackenzie
2014-03-20  1:46                             ` Stefan
2014-03-20  8:35                               ` Thien-Thi Nguyen
2014-03-21  8:24                                 ` João Távora
2014-03-22 13:13                               ` Alan Mackenzie
2014-03-22 16:14                                 ` Stefan
2014-03-22 20:19                                   ` David Caldwell
2014-03-22 22:05                                     ` David Kastrup
2014-03-22 22:32                                       ` David Caldwell
2014-03-24  1:13                                     ` Stefan
2014-03-22 22:34                                   ` Alan Mackenzie
2014-03-24  1:37                                     ` Stefan
2014-03-24 22:40                                       ` Alan Mackenzie
2014-03-25  1:37                                         ` Dmitry Gutov
2014-03-26 20:53                                           ` Alan Mackenzie
2014-03-27  8:02                                             ` Dmitry Gutov
2014-03-30 14:57                                               ` Alan Mackenzie
2014-03-31 17:11                                                 ` Dmitry Gutov
2014-04-03 21:53                                                   ` Alan Mackenzie
2014-03-25  1:54                                         ` Stefan
2014-03-26 21:21                                           ` Alan Mackenzie
2014-03-27 14:49                                             ` Stefan Monnier
2014-03-30 11:37                                               ` Alan Mackenzie
2014-03-30 16:46                                                 ` Stefan Monnier
2014-03-22 23:10                                   ` Alan Mackenzie
2014-03-24  1:39                                     ` Stefan
2014-03-24  6:59                                       ` Stephen J. Turnbull
2014-03-24  9:08                                         ` Dmitry Gutov
2014-03-24 17:19                                           ` Eli Zaretskii
2014-03-24 17:29                                             ` David Kastrup
2014-03-24 17:39                                               ` David Kastrup
2014-03-24 17:38                                             ` Dmitry Gutov
2014-03-24 17:52                                               ` Eli Zaretskii
2014-03-25  1:53                                                 ` Dmitry Gutov
2014-03-25  3:49                                                   ` Eli Zaretskii
2014-03-24 18:32                                           ` Stefan
2014-03-25  1:49                                             ` Dmitry Gutov
2014-03-25  7:44                                             ` Stephen J. Turnbull
2014-03-25  8:08                                               ` Steinar Bang
2014-03-25 16:49                                                 ` Stephen J. Turnbull
2014-03-25 17:08                                                   ` Steinar Bang
2014-03-25 17:31                                                     ` Dmitry Gutov
2014-03-25 19:28                                                       ` Steinar Bang
2014-03-25 19:49                                                         ` David Kastrup
2014-03-25 19:54                                                           ` Dmitry Gutov
2014-03-25 13:26                                               ` Stefan Monnier
2014-03-27  7:51                                                 ` Stephen J. Turnbull
2014-03-24 21:12                                         ` Alan Mackenzie

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).