unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Re: "whether the global keymap ‘C-x 4’ will be replaced by a command,"
       [not found] ` <83ft9woo68.fsf@gnu.org>
@ 2020-07-13  2:52   ` Richard Stallman
  2020-07-13 23:58     ` "whether the global keymap C-x 4 " Juri Linkov
  0 siblings, 1 reply; 45+ messages in thread
From: Richard Stallman @ 2020-07-13  2:52 UTC (permalink / raw)
  To: emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

What would it mean to replace that keymap with a command?

What would that change for users?
Would that make help commands give less useful results for C-x 4 C-f and so on?

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-13  2:52   ` "whether the global keymap ‘C-x 4’ will be replaced by a command," Richard Stallman
@ 2020-07-13 23:58     ` Juri Linkov
  2020-07-14  4:19       ` Drew Adams
  2020-07-14  5:55       ` Stefan Monnier
  0 siblings, 2 replies; 45+ messages in thread
From: Juri Linkov @ 2020-07-13 23:58 UTC (permalink / raw)
  To: Richard Stallman; +Cc: emacs-devel

> What would it mean to replace that keymap with a command?
>
> What would that change for users?
> Would that make help commands give less useful results for C-x 4 C-f and so on?

It's easy to answer your questions by just loading the package
other-frame-window.el from GNU ELPA, enabling other-frame-window-mode,
and seeing how it works.

By default, it uses 'C-x 7' for the other-window prefix
to support such keysequences as 'C-x 7 C-f'.

Trying to type 'C-h k C-x 7 C-f' ends the keysequence after
'C-h k C-x 7' and displays the help for the other-window command.

This means that after binding the current ctl-x-4-map in Emacs core
to the other-window command, 'C-h k C-x 4' will display the help for
that command, not for the whole sequence 'C-h k C-x 4 C-f'.



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

* RE: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-13 23:58     ` "whether the global keymap C-x 4 " Juri Linkov
@ 2020-07-14  4:19       ` Drew Adams
  2020-07-14  5:55       ` Stefan Monnier
  1 sibling, 0 replies; 45+ messages in thread
From: Drew Adams @ 2020-07-14  4:19 UTC (permalink / raw)
  To: Juri Linkov, Richard Stallman; +Cc: emacs-devel

> Trying to type 'C-h k C-x 7 C-f' ends the keysequence after
> 'C-h k C-x 7' and displays the help for the other-window command.
> 
> This means that after binding the current ctl-x-4-map in Emacs core
> to the other-window command, 'C-h k C-x 4' will display the help for
> that command, not for the whole sequence 'C-h k C-x 4 C-f'.

That's unfortunate.  `C-x 4 C-f' is presumably still
a key binding (?).  It should be, at least.  And as
such `C-h k' should tell you directly what it's
bound to etc.  We already have `C-x 4 C-h' to show
us all of the `C-x 4' bindings.

Sounds, so far, like a step backward.  Why?



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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-13 23:58     ` "whether the global keymap C-x 4 " Juri Linkov
  2020-07-14  4:19       ` Drew Adams
@ 2020-07-14  5:55       ` Stefan Monnier
  2020-07-14 14:41         ` Drew Adams
                           ` (3 more replies)
  1 sibling, 4 replies; 45+ messages in thread
From: Stefan Monnier @ 2020-07-14  5:55 UTC (permalink / raw)
  To: Juri Linkov; +Cc: Richard Stallman, emacs-devel

> This means that after binding the current ctl-x-4-map in Emacs core
> to the other-window command, 'C-h k C-x 4' will display the help for
> that command, not for the whole sequence 'C-h k C-x 4 C-f'.

I don't think we can/should make `C-h k` read all of `C-x 4 C-f`, indeed.
But maybe we could make the following work: `C-x 4 C-h k C-f`.


        Stefan




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

* RE: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-14  5:55       ` Stefan Monnier
@ 2020-07-14 14:41         ` Drew Adams
  2020-07-14 14:48           ` Stefan Monnier
  2020-07-14 15:35           ` John Yates
  2020-07-14 14:51         ` Eli Zaretskii
                           ` (2 subsequent siblings)
  3 siblings, 2 replies; 45+ messages in thread
From: Drew Adams @ 2020-07-14 14:41 UTC (permalink / raw)
  To: Stefan Monnier, Juri Linkov; +Cc: Richard Stallman, emacs-devel

> > This means that after binding the current ctl-x-4-map in Emacs core
> > to the other-window command, 'C-h k C-x 4' will display the help for
> > that command, not for the whole sequence 'C-h k C-x 4 C-f'.
> 
> I don't think we can/should make `C-h k` read all of `C-x 4 C-f`,
> indeed.  But maybe we could make the following work:
> `C-x 4 C-h k C-f`.

Quelle horreur !

Farther & farther from Occam - more & more complex.
For what gain?  Don't multiply things unnecessarily.

https://en.wikipedia.org/wiki/Occam%27s_razor

This _looks_ like a solution that's looking for
a problem to solve.  Evidence to the contrary?

We already have `C-x 4 C-h', which shows you
every `C-x 4' key sequence and its command, with
a link to its doc.  Que demande le peuple ?

Global Bindings Starting With C-x 4:
key             binding
---             -------

C-x 4 C-f       find-file-other-window
C-x 4 C-o       display-buffer
C-x 4 .         xref-find-definitions-other-window
C-x 4 0         kill-buffer-and-window
C-x 4 a         add-change-log-entry-other-window
C-x 4 b         switch-to-buffer-other-window
C-x 4 c         clone-indirect-buffer-other-window
C-x 4 d         dired-other-window
C-x 4 f         find-file-other-window
C-x 4 m         compose-mail-other-window
C-x 4 r         find-file-read-only-other-window

And we already have `C-h k C-x 4 C-f'.  `C-h k'
just _works_ -- for any key sequence.

It ain't broke; please don't fix it.  There are
many other things to work on - real, not imaginary,
problems.



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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-14 14:41         ` Drew Adams
@ 2020-07-14 14:48           ` Stefan Monnier
  2020-07-14 15:28             ` Drew Adams
  2020-07-14 15:35           ` John Yates
  1 sibling, 1 reply; 45+ messages in thread
From: Stefan Monnier @ 2020-07-14 14:48 UTC (permalink / raw)
  To: Drew Adams; +Cc: emacs-devel, Richard Stallman, Juri Linkov

>> > This means that after binding the current ctl-x-4-map in Emacs core
>> > to the other-window command, 'C-h k C-x 4' will display the help for
>> > that command, not for the whole sequence 'C-h k C-x 4 C-f'.
>> 
>> I don't think we can/should make `C-h k` read all of `C-x 4 C-f`,
>> indeed.  But maybe we could make the following work:
>> `C-x 4 C-h k C-f`.
>
> Quelle horreur !
>
> Farther & farther from Occam - more & more complex.

I don't see what's more or less complex about it.
With other-frame-window `C-x 4` is a (prefix) command.
So just like `C-h k C-u` gives you help about the `C-u` binding,
`C-h k C-x 4` naturally gives you help about the `C-x 4` binding.

So if you're interested in the `C-f` binding available after you hit
`C-x 4`, it's only natural to use `C-x 4 C-h k C-f` (and not only it's
natural, but it's the only sane option unless we break the `C-h k C-x 4`
case).

> We already have `C-x 4 C-h', which shows you
> every `C-x 4' key sequence and its command, with
> a link to its doc.  Que demande le peuple ?

You're talking about the current `C-x 4` which is a keymap.
I'm talking about the case when we've change `C-x 4` to be a prefix
command, as provided by other-frame-window.


        Stefan




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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-14  5:55       ` Stefan Monnier
  2020-07-14 14:41         ` Drew Adams
@ 2020-07-14 14:51         ` Eli Zaretskii
  2020-07-14 15:15           ` Stefan Monnier
  2020-07-14 22:27         ` Juri Linkov
  2020-07-15  3:32         ` Richard Stallman
  3 siblings, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2020-07-14 14:51 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel, rms, juri

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Date: Tue, 14 Jul 2020 01:55:10 -0400
> Cc: Richard Stallman <rms@gnu.org>, emacs-devel@gnu.org
> 
> > This means that after binding the current ctl-x-4-map in Emacs core
> > to the other-window command, 'C-h k C-x 4' will display the help for
> > that command, not for the whole sequence 'C-h k C-x 4 C-f'.
> 
> I don't think we can/should make `C-h k` read all of `C-x 4 C-f`, indeed.

I think that would be a step back.  Is it indeed not possible to keep
the existing behavior regarding prefixed commands?

> But maybe we could make the following work: `C-x 4 C-h k C-f`.

How would the user remember when to start with C-h and when to type it
in the middle of a key sequence?



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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-14 14:51         ` Eli Zaretskii
@ 2020-07-14 15:15           ` Stefan Monnier
  2020-07-14 16:29             ` Eli Zaretskii
  0 siblings, 1 reply; 45+ messages in thread
From: Stefan Monnier @ 2020-07-14 15:15 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel, rms, juri

>> But maybe we could make the following work: `C-x 4 C-h k C-f`.
> How would the user remember when to start with C-h and when to type it
> in the middle of a key sequence?

`C-x 4 C-f` would run 2 commands, just like `C-u C-f`, so just like you can't
do `C-x k C-u C-f` (because the `C-x k` stops after `C-u`).

So all the user needs to know is that `C-x 4` is a command and not s keymap.

BTW, we have th same problem with `C-x e e`: I can't do `C-x k C-x e e`
because `C-x k` stops after `C-x e`.  So for the same reason it would be
good to make it possible to do `C-x e C-x k e` to find out what `e` is
really bound to.


        Stefan




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

* RE: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-14 14:48           ` Stefan Monnier
@ 2020-07-14 15:28             ` Drew Adams
  0 siblings, 0 replies; 45+ messages in thread
From: Drew Adams @ 2020-07-14 15:28 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel, Richard Stallman, Juri Linkov

> >> I don't think we can/should make `C-h k` read all of `C-x 4 C-f`,
> >> indeed.  But maybe we could make the following work:
> >> `C-x 4 C-h k C-f`.
> >
> > Farther & farther from Occam - more & more complex.
> 
> I don't see what's more or less complex about it.

It's a new exception.  And it breaks `C-x 4 C-h'.

And `C-x C-h'?  Does that have different behavior
from `C-x 4 C-h' now, or does that too get broken
the same way?

> With other-frame-window `C-x 4` is a (prefix) command.

"With `other-frame-window'".  Precisely.  That's
apparently the motivation behind this `C-x 4 C-h'
kludge.

A solution looking for a problem engenders the
need for a solution (introducing exceptions) for
a problem it's created.  As they say, "Now you've
got two problems...".

> So just like `C-h k C-u` gives you help about the `C-u` binding,
> `C-h k C-x 4` naturally gives you help about the `C-x 4` binding.

`C-u' is an exception, not the rule.  It's not
a prefix key: it's not bound to a keymap.  It's
bound only to a command.  `C-u' - like what you
want to do to `C-x 4' - uses `set-transient-map'.

You want to make `C-x 4' another such exception,
like `C-u', right?

Try `C-h k C-x'.  What does that do for you?
`C-h k' has always waited for (expected) a full
key sequence.  This is the case in general -
menu, mouse, keyboard, whatever.

(Not to mention that there are 3rd-party help
libraries that let you navigate up, down, and
around the keymap hierarchy, treating prefix
keys the way they are now.  Apparently `C-x 4'
will no longer be an ordinary prefix key, i.e.,
bound to a keymap.  So that will likely break
such help systems.)

> So if you're interested in the `C-f` binding available after you hit
> `C-x 4`, it's only natural to use `C-x 4 C-h k C-f` (and not only it's
> natural, but it's the only sane option unless we break the `C-h k C-x
> 4` case).

I disagree that it's "only natural".  Natural
is as natural does, and it's in the eye of the
beholder or practitioner.

I'd say it's only natural that `C-h k C-x 4 C-f'
does what it does.  `C-h k' reads a key sequence
and tells you what it's bound to - what it does.

> > We already have `C-x 4 C-h', which shows you
> > every `C-x 4' key sequence and its command, with
> > a link to its doc.  Que demande le peuple ?
> 
> You're talking about the current `C-x 4` which is a keymap.
> I'm talking about the case when we've change `C-x 4` to be a prefix
> command, as provided by other-frame-window.

Exactly.  I'm questioning that change.  I'd
like `C-x 4' to continue to be an ordinary
prefix key, i.e., bound to a keymap, and not
to become something exceptional.

That change offer what, that's worth tossing
the standard, longstanding behavior?  Please
answer the questions from the previous mail.
We already have `C-h' following a prefix key,
to give you info about it.  `C-h k' is for
info about a complete key sequence.

(And we already have 3rd-party libraries that
let you explore the keymap hierarchy in detail,
and they typically work by handling real prefix
keys, bound to real keymaps.)



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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-14 14:41         ` Drew Adams
  2020-07-14 14:48           ` Stefan Monnier
@ 2020-07-14 15:35           ` John Yates
  1 sibling, 0 replies; 45+ messages in thread
From: John Yates @ 2020-07-14 15:35 UTC (permalink / raw)
  To: Drew Adams
  Cc: Emacs developers, Stefan Monnier, Richard Stallman, Juri Linkov

> Quelle horreur !

Absolument!

> Que demande le peuple ?

De la brioche.

/john



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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-14 15:15           ` Stefan Monnier
@ 2020-07-14 16:29             ` Eli Zaretskii
  2020-07-15  4:06               ` Stefan Monnier
  0 siblings, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2020-07-14 16:29 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel, rms, juri

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: juri@linkov.net,  rms@gnu.org,  emacs-devel@gnu.org
> Date: Tue, 14 Jul 2020 11:15:53 -0400
> 
> >> But maybe we could make the following work: `C-x 4 C-h k C-f`.
> > How would the user remember when to start with C-h and when to type it
> > in the middle of a key sequence?
> 
> `C-x 4 C-f` would run 2 commands, just like `C-u C-f`, so just like you can't
> do `C-x k C-u C-f` (because the `C-x k` stops after `C-u`).

The problem with C-u is actually my long-time lament.  Making this
"spread" to more commands doesn't sound like progress to me.  What
advantages and exciting new features will this enable, that could
outweigh the downsides?



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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-14  5:55       ` Stefan Monnier
  2020-07-14 14:41         ` Drew Adams
  2020-07-14 14:51         ` Eli Zaretskii
@ 2020-07-14 22:27         ` Juri Linkov
  2020-07-14 22:55           ` Drew Adams
                             ` (2 more replies)
  2020-07-15  3:32         ` Richard Stallman
  3 siblings, 3 replies; 45+ messages in thread
From: Juri Linkov @ 2020-07-14 22:27 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Richard Stallman, emacs-devel

>> This means that after binding the current ctl-x-4-map in Emacs core
>> to the other-window command, 'C-h k C-x 4' will display the help for
>> that command, not for the whole sequence 'C-h k C-x 4 C-f'.
>
> I don't think we can/should make `C-h k` read all of `C-x 4 C-f`, indeed.
> But maybe we could make the following work: `C-x 4 C-h k C-f`.

Would it be more expected for `C-x 4 C-h k C-f` to show the help buffer
about `C-f` (forward-char) in another window?

The prefix `C-x 4` says "show the output of the next command in
another window" where the next command is `C-h k C-f`.



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

* RE: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-14 22:27         ` Juri Linkov
@ 2020-07-14 22:55           ` Drew Adams
  2020-07-15  4:06           ` Stefan Monnier
  2020-07-16  3:21           ` Richard Stallman
  2 siblings, 0 replies; 45+ messages in thread
From: Drew Adams @ 2020-07-14 22:55 UTC (permalink / raw)
  To: Juri Linkov, Stefan Monnier; +Cc: Richard Stallman, emacs-devel

> >> This means that after binding the current ctl-x-4-map in Emacs core
> >> to the other-window command, 'C-h k C-x 4' will display the help for
> >> that command, not for the whole sequence 'C-h k C-x 4 C-f'.
> >
> > I don't think we can/should make `C-h k` read all of `C-x 4 C-f`,
> indeed.
> > But maybe we could make the following work: `C-x 4 C-h k C-f`.
> 
> Would it be more expected for `C-x 4 C-h k C-f` to show the help buffer
> about `C-f` (forward-char) in another window?
> 
> The prefix `C-x 4` says "show the output of the next command in
> another window" where the next command is `C-h k C-f`.

Par exemple.  Good point.

Scratch a bit more, and I won't be surprised if we
stumble on other such dilemmas/surprises.



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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-14  5:55       ` Stefan Monnier
                           ` (2 preceding siblings ...)
  2020-07-14 22:27         ` Juri Linkov
@ 2020-07-15  3:32         ` Richard Stallman
  2020-07-19 13:00           ` Barry Fishman
  3 siblings, 1 reply; 45+ messages in thread
From: Richard Stallman @ 2020-07-15  3:32 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel, juri

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

If this change will make help commands fail to entirely work,
why do it?

On he other hand, if the change is a great big improvement, I suppose
we can create a mechanism to allow the help commands to work 100% with
this new command.  Please don't fail to make that work.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-14 16:29             ` Eli Zaretskii
@ 2020-07-15  4:06               ` Stefan Monnier
  2020-07-15 14:16                 ` Eli Zaretskii
                                   ` (2 more replies)
  0 siblings, 3 replies; 45+ messages in thread
From: Stefan Monnier @ 2020-07-15  4:06 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel, rms, juri

> The problem with C-u is actually my long-time lament.  Making this
> "spread" to more commands doesn't sound like progress to me.

It also affects `C-x RET c`, which is another standard prefix command.
I think we'll be better off making those prefix commands work well, than
keeping them half-working and then having to avoid introducing more
of them.

> What advantages and exciting new features will this enable, that could
> outweigh the downsides?

Prefix commands give structure to the space of key-bindings.
E.g. the new `C-x 4 4` prefix command makes almost all the special
`foo-other-window` commands (and their key bindings) redundant.

I think prefix commands are a powerful way to design the UI, making it
overall simpler.  I'm not sure if we want to go to something like Vi
(where `forward-word` is split into a `forward` command and a `by-word`
prefix command), but the principle of prefix command appears in
several places, even though it's rarely implemented with as much care as
`C-u` is.



        Stefan


PS: The active region is another similar "structuring tool".




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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-14 22:27         ` Juri Linkov
  2020-07-14 22:55           ` Drew Adams
@ 2020-07-15  4:06           ` Stefan Monnier
  2020-07-16  3:21           ` Richard Stallman
  2 siblings, 0 replies; 45+ messages in thread
From: Stefan Monnier @ 2020-07-15  4:06 UTC (permalink / raw)
  To: Juri Linkov; +Cc: Richard Stallman, emacs-devel

>>> This means that after binding the current ctl-x-4-map in Emacs core
>>> to the other-window command, 'C-h k C-x 4' will display the help for
>>> that command, not for the whole sequence 'C-h k C-x 4 C-f'.
>>
>> I don't think we can/should make `C-h k` read all of `C-x 4 C-f`, indeed.
>> But maybe we could make the following work: `C-x 4 C-h k C-f`.
>
> Would it be more expected for `C-x 4 C-h k C-f` to show the help buffer
> about `C-f` (forward-char) in another window?

Oh, right!


        Stefan




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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-15  4:06               ` Stefan Monnier
@ 2020-07-15 14:16                 ` Eli Zaretskii
  2020-07-15 23:54                 ` Juri Linkov
  2020-07-17  0:56                 ` Richard Stallman
  2 siblings, 0 replies; 45+ messages in thread
From: Eli Zaretskii @ 2020-07-15 14:16 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel, rms, juri

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Cc: juri@linkov.net,  rms@gnu.org,  emacs-devel@gnu.org
> Date: Wed, 15 Jul 2020 00:06:14 -0400
> 
> > The problem with C-u is actually my long-time lament.  Making this
> > "spread" to more commands doesn't sound like progress to me.
> 
> It also affects `C-x RET c`, which is another standard prefix command.
> I think we'll be better off making those prefix commands work well, than
> keeping them half-working and then having to avoid introducing more
> of them.

What about the solution proposed by Richard: to program something
special for these cases, such that the user won't see any difference?



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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-15  4:06               ` Stefan Monnier
  2020-07-15 14:16                 ` Eli Zaretskii
@ 2020-07-15 23:54                 ` Juri Linkov
  2020-07-16  4:07                   ` Stefan Monnier
  2020-07-17  0:56                 ` Richard Stallman
  2 siblings, 1 reply; 45+ messages in thread
From: Juri Linkov @ 2020-07-15 23:54 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Eli Zaretskii, rms, emacs-devel

> Prefix commands give structure to the space of key-bindings.
> E.g. the new `C-x 4 4` prefix command makes almost all the special
> `foo-other-window` commands (and their key bindings) redundant.

It seems one of remaining major problems is how to make the most
frequently used key sequences for other-window commands shorter,
e.g. how to reduce `C-x 4 4 C-x C-f` to just `C-x 4 C-f`.

This suggests there is a need for a new general function that could be
used in a prefix command.  Such function should prepare the environment
for the next command to run it with modified variable bindings.

Currently I have no idea for implementation, but maybe it's possible
for a such function (and the prefix command where it's used) to
return a closure in which the next command should be invoked?

Then it could bind `overriding-terminal-local-map` (instead of using
`set-transient-map`) and also bind `display-buffer-overriding-action`
(instead of using `display-buffer-override-next-command`).

This will also solve the problem of setting `default-directory`
for `C-x p p` (project-switch-project).  As explained in
https://debbugs.gnu.org/41890#196
currently it's not possible to bind the value of `default-directory`
for the next command, but with a closure the variable binding will have
the effect during the next command.



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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-14 22:27         ` Juri Linkov
  2020-07-14 22:55           ` Drew Adams
  2020-07-15  4:06           ` Stefan Monnier
@ 2020-07-16  3:21           ` Richard Stallman
  2020-07-16 15:05             ` Eli Zaretskii
  2020-07-16 23:05             ` Juri Linkov
  2 siblings, 2 replies; 45+ messages in thread
From: Richard Stallman @ 2020-07-16  3:21 UTC (permalink / raw)
  To: Juri Linkov; +Cc: monnier, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > Would it be more expected for `C-x 4 C-h k C-f` to show the help buffer
  > about `C-f` (forward-char) in another window?

For consistency, C-h k C-x 4 C-f should show the help for C-x 4 C-f.
That is find-file-other-window.

C-x 4 C-f is an important command -- don't break it!

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-15 23:54                 ` Juri Linkov
@ 2020-07-16  4:07                   ` Stefan Monnier
  2020-07-16 22:57                     ` Juri Linkov
  0 siblings, 1 reply; 45+ messages in thread
From: Stefan Monnier @ 2020-07-16  4:07 UTC (permalink / raw)
  To: Juri Linkov; +Cc: Eli Zaretskii, rms, emacs-devel

> Then it could bind `overriding-terminal-local-map` (instead of using
> `set-transient-map`)

Not sure what's the difference.

> and also bind `display-buffer-overriding-action`
> (instead of using `display-buffer-override-next-command`).

Neither do I understand what's better about "bind
`display-buffer-overriding-action`" compared to using
`display-buffer-override-next-command`.

> This will also solve the problem of setting `default-directory`
> for `C-x p p` (project-switch-project).  As explained in
> https://debbugs.gnu.org/41890#196
> currently it's not possible to bind the value of `default-directory`
> for the next command, but with a closure the variable binding will have
> the effect during the next command.

This sounds like it might benefit from using a trick like the one I use
in `mule-cmds--prefixed-command-pch` in order to let-bind
`coding-system-for-read/write` around the call of the next command.


        Stefan




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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-16  3:21           ` Richard Stallman
@ 2020-07-16 15:05             ` Eli Zaretskii
  2020-07-16 23:05             ` Juri Linkov
  1 sibling, 0 replies; 45+ messages in thread
From: Eli Zaretskii @ 2020-07-16 15:05 UTC (permalink / raw)
  To: rms; +Cc: emacs-devel, monnier, juri

> From: Richard Stallman <rms@gnu.org>
> Date: Wed, 15 Jul 2020 23:21:15 -0400
> Cc: monnier@iro.umontreal.ca, emacs-devel@gnu.org
> 
> C-x 4 C-f is an important command -- don't break it!

And likewise "C-x 4 f", IMO.



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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-16  4:07                   ` Stefan Monnier
@ 2020-07-16 22:57                     ` Juri Linkov
  2020-07-17  2:56                       ` Stefan Monnier
  0 siblings, 1 reply; 45+ messages in thread
From: Juri Linkov @ 2020-07-16 22:57 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Eli Zaretskii, rms, emacs-devel

>> Then it could bind `overriding-terminal-local-map` (instead of using
>> `set-transient-map`)
>
> Not sure what's the difference.

It could simplify implementation of commands that need to modify more variables,
e.g. both `overriding-terminal-local-map` and `display-buffer-overriding-action`.

>> and also bind `display-buffer-overriding-action`
>> (instead of using `display-buffer-override-next-command`).
>
> Neither do I understand what's better about "bind
> `display-buffer-overriding-action`" compared to using
> `display-buffer-override-next-command`.

For simplicity as well.  And for uniformity of modifying the environment
of the next command the same way for different variables.

>> This will also solve the problem of setting `default-directory`
>> for `C-x p p` (project-switch-project).  As explained in
>> https://debbugs.gnu.org/41890#196
>> currently it's not possible to bind the value of `default-directory`
>> for the next command, but with a closure the variable binding will have
>> the effect during the next command.
>
> This sounds like it might benefit from using a trick like the one I use
> in `mule-cmds--prefixed-command-pch` in order to let-bind
> `coding-system-for-read/write` around the call of the next command.

It's surprising that such trick works without problems.  And it seems it's exactly
what is needed for `project-switch-project`.  I could try to generalize it
to support modification of arbitrary variables.



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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-16  3:21           ` Richard Stallman
  2020-07-16 15:05             ` Eli Zaretskii
@ 2020-07-16 23:05             ` Juri Linkov
  2020-07-17  2:10               ` Drew Adams
  2020-07-18  1:54               ` Richard Stallman
  1 sibling, 2 replies; 45+ messages in thread
From: Juri Linkov @ 2020-07-16 23:05 UTC (permalink / raw)
  To: Richard Stallman; +Cc: monnier, emacs-devel

>   > Would it be more expected for `C-x 4 C-h k C-f` to show the help buffer
>   > about `C-f` (forward-char) in another window?
>
> For consistency, C-h k C-x 4 C-f should show the help for C-x 4 C-f.
> That is find-file-other-window.

A special handling of prefix commands could be added to the
implementation of 'C-h k'.

Then instead of saying that the command is 'find-file-other-window',
it could say: "the command is like 'find-file' but displays the buffer
in another window."

> C-x 4 C-f is an important command -- don't break it!

Its effect should remain the same (displaying the output buffer in
another window), but the command namespace will be cleaner by removing
duplicated commands with '-other-window' and '-other-frame' suffixes.

Also it should allow the users to add the effect of displaying the command
output buffer in another window to more commands easily, by just adding
a key binding to the existing non-window command in the 'C-x 4' keymap.

Anyway, before changing the 'C-x 4' keymap we could try this approach only
on project-specific submap 'C-x 4 p' to see how well it works.



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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-15  4:06               ` Stefan Monnier
  2020-07-15 14:16                 ` Eli Zaretskii
  2020-07-15 23:54                 ` Juri Linkov
@ 2020-07-17  0:56                 ` Richard Stallman
  2 siblings, 0 replies; 45+ messages in thread
From: Richard Stallman @ 2020-07-17  0:56 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: eliz, juri, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > It also affects `C-x RET c`, which is another standard prefix command.

The effect of that modifier is totally uniform.  We should not think
of it as like a prefix command.  It is not similar to this issue.

A numeric argument is also a uniform modifier.  However, plain C-u is
a fishy halfway case.  Because we have made so many commands do
something different after C-u, semantically it makes sense, sort of,
to think of C-u WHATEVER as a different command from plain WHATEVER.
That is why that case is confusing.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





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

* RE: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-16 23:05             ` Juri Linkov
@ 2020-07-17  2:10               ` Drew Adams
  2020-07-18  1:57                 ` Richard Stallman
  2020-07-18  1:54               ` Richard Stallman
  1 sibling, 1 reply; 45+ messages in thread
From: Drew Adams @ 2020-07-17  2:10 UTC (permalink / raw)
  To: Juri Linkov, Richard Stallman; +Cc: monnier, emacs-devel

> > C-x 4 C-f is an important command -- don't break it!
> 
> Its effect should remain the same (displaying the output buffer in
> another window), but the command namespace will be cleaner by removing
> duplicated commands with '-other-window' and '-other-frame' suffixes.

I _want_ separate commands.  They're wonderful.  Beautiful, handy, first-class citizens.

I want to be able to bind a same-window, other-window, or other-frame command to a simple key in this or that mode, depending on what the command does.  For some actions in the same mode I want the same-window command, for other actions I want the other-window command.  For some actions I might not want there to exist a (predefined) other-frame or other-window or same-window command.  Some actions make good sense only for one or two such manifestations.

You apparently see only a (neglible, IMO) upside to the changes being proposed/made.  I see also downsides.

The minor downside of defining multiple commands (same, other-win, other-frame) for the same basic action, and of thus having multiple such in the namespace, doesn't bother me at all.

And in fact, the presence of multiple such in the namespace is a plus in my eyes, not a minus.  A plus interactively and programmatically.

As usual, my somewhat defeatist, rearguard plea is to please, at a bare minimum, give users an easy way to 100% return to the situation ante, i.e., to undo such an "improvement", globally & comprehensively, as well as just for individual instances.

The goal should keep users foremost in mind.  It shouldn't be to simplify the implementation or the code maintenance, or to see how clever we can make the implementation.  It should be all about the users.

> Also it should allow the users to add the effect of displaying the
> command output buffer in another window to more commands easily, by just adding
> a key binding to the existing non-window command in the 'C-x 4' keymap.

As I said earlier: seems like a solution looking for a problem to solve.  I haven't heard of any real problem that will be solved.  Is there one?  What's the disease this cure is for?

> Anyway, before changing the 'C-x 4' keymap we could try this approach
> only on project-specific submap 'C-x 4 p' to see how well it works.

Please don't change `ctl-x-4-map' or any of the others.  If you must fiddle, please fiddle in a new, tiny sandbox off in a corner somewhere.



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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-16 22:57                     ` Juri Linkov
@ 2020-07-17  2:56                       ` Stefan Monnier
  0 siblings, 0 replies; 45+ messages in thread
From: Stefan Monnier @ 2020-07-17  2:56 UTC (permalink / raw)
  To: Juri Linkov; +Cc: Eli Zaretskii, rms, emacs-devel

>>> Then it could bind `overriding-terminal-local-map` (instead of using
>>> `set-transient-map`)
>> Not sure what's the difference.
> It could simplify implementation of commands that need to modify more variables,
> e.g. both `overriding-terminal-local-map` and `display-buffer-overriding-action`.

You mean you're interested in providing a generic way to "set some vars
for the next command"?  I can see why you'd want that, but:
- It's not as uniform as it seems: `overriding-terminal-local-map` needs
  to be set while "reading" the next command but not while running it,
  whereas `display-buffer-overriding-action` needs to be set while
  running the next command and not while reading it.  
- `set-temporary-map` doesn't need to just "set" the var: it needs to
  modify it and then revert the modification (and handle the case where
  some other modification took place in the mean time).  IOW we need
  some way to "add" and "remove" something from that var.  Now, that
  probably applies to other vars, so it would indeed be good to provide some
  more generic support for that.

>> This sounds like it might benefit from using a trick like the one I use
>> in `mule-cmds--prefixed-command-pch` in order to let-bind
>> `coding-system-for-read/write` around the call of the next command.
>
> It's surprising that such trick works without problems.  And it seems it's exactly
> what is needed for `project-switch-project`.  I could try to generalize it
> to support modification of arbitrary variables.

Beware: let-binding a var like that can lead to undesired results if the
command run within the let-binding wants to modify this var (the
modification is typically lost) or make it buffer-local (the temporary
let-bound value may "leak" outside of the let-binding).  IOW, some such
variables want to be let-bound but others prefer to be `setq`.


        Stefan




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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-16 23:05             ` Juri Linkov
  2020-07-17  2:10               ` Drew Adams
@ 2020-07-18  1:54               ` Richard Stallman
  2020-07-18 23:21                 ` Juri Linkov
  1 sibling, 1 reply; 45+ messages in thread
From: Richard Stallman @ 2020-07-18  1:54 UTC (permalink / raw)
  To: Juri Linkov; +Cc: monnier, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > For consistency, C-h k C-x 4 C-f should show the help for C-x 4 C-f.
  > > That is find-file-other-window.

  > A special handling of prefix commands could be added to the
  > implementation of 'C-h k'.

  > Then instead of saying that the command is 'find-file-other-window',
  > it could say: "the command is like 'find-file' but displays the buffer
  > in another window."

That would address this issue.

  > > C-x 4 C-f is an important command -- don't break it!

  > Its effect should remain the same (displaying the output buffer in
  > another window), but the command namespace will be cleaner by removing
  > duplicated commands with '-other-window' and '-other-frame' suffixes.

I see.

That would handle C-x 4 C-f ok, but someone pointed out there is also
C-x 4 f.  People would not like it if that started to do C-x f in another
window.

So I think there needs to be a exception list, a way of defining a few
key sequences starting with C-x 4 so that they depart from the usual
rule and maintain backwards compatibility instead.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-17  2:10               ` Drew Adams
@ 2020-07-18  1:57                 ` Richard Stallman
  2020-07-18 16:23                   ` Sean Whitton
  0 siblings, 1 reply; 45+ messages in thread
From: Richard Stallman @ 2020-07-18  1:57 UTC (permalink / raw)
  To: Drew Adams; +Cc: emacs-devel, monnier, juri

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > I want to be able to bind a same-window, other-window, or
  > other-frame command to a simple key in this or that mode,
  > depending on what the command does.  For some actions in the same
  > mode I want the same-window command, for other actions I want the
  > other-window command.

Maybe it would be possible to make a function that would generate
an "other-window" version of an existing command, by making code to call
that command.



-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-18  1:57                 ` Richard Stallman
@ 2020-07-18 16:23                   ` Sean Whitton
  2020-07-18 17:00                     ` Drew Adams
  2020-07-19  2:28                     ` Richard Stallman
  0 siblings, 2 replies; 45+ messages in thread
From: Sean Whitton @ 2020-07-18 16:23 UTC (permalink / raw)
  To: rms, emacs-devel

Hello Richard,

On Fri 17 Jul 2020 at 09:57PM -04, Richard Stallman wrote:

> Maybe it would be possible to make a function that would generate
> an "other-window" version of an existing command, by making code to call
> that command.

This is why my original patch which partly prompted this discussion did
(bug#42210), but the feedback I got was that it would be better to avoid
cluttering the function symbol namespace with lots of -other-window
commands.

-- 
Sean Whitton



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

* RE: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-18 16:23                   ` Sean Whitton
@ 2020-07-18 17:00                     ` Drew Adams
  2020-07-19  2:28                     ` Richard Stallman
  1 sibling, 0 replies; 45+ messages in thread
From: Drew Adams @ 2020-07-18 17:00 UTC (permalink / raw)
  To: Sean Whitton, rms, emacs-devel

> the feedback I got was that it would be better to
> avoid cluttering the function symbol namespace with
> lots of -other-window commands.

My feedback is that I _want_ separate other-window
(and other-frame) commands.  Explicit commands.

But _not_ in some general, apply-to-all-commands (or
all commands that show something in a window or select
a window).

I want such commands only when and where I want them,
and I want them bound to keys only when and where I
want such bindings.  I don't want something to create
such other-* commands willy nilly, automatically.

IOW, I want just what we have now:

. ability for anyone to explicitly define an other-*
  command

. ability for anyone to bind any same-* or other-*
  command to any key in any mode or other context.

. ability for anyone to _not_ have a given same-*
  or other-* command be bound in a given mode or
  context.

In Dired, for example, for some actions I want to
have _only_ a key that reuses the same window.  For
other actions I want to have _only_ a key that uses
another window - or another frame.  And for still
other actions I want to have keys for _both_, or
all 3, possibilities.

To me, it would be a step backward to treat any of
this stuff in some one-size-fits-all, blanket way:
either by automatically creating other-* commands
for everything, or by automatically creating
bindings for them.

Or by automatically creating the equivalent:
providing keys everywhere, for everything, that
provide other-* behavior without creating other-*
commands.  I want only keys that I or some mode
or other context has decided are the most useful
for that particular context.

I have no problem with the supposed "cluttering
[of] the function symbol namespace" from the
existence of separate other-* commands.

(Perhaps that's partly because I use a completion
framework that isn't bothered by the existence of
two commands `foo' and `foo-other-window' etc.)

To me, this "project" of replacing `C-x 4' by a
command is an anti-feature.  (Same for other
prefix keys.)

And again, though I've asked several times now,
I've seen _no_ description of anything useful that
this project aims to provide.  So far, it seems
only like a thought-to-be-clever solution that's
still looking for a problem to solve.

If the problem is _really_ only "cluttering [of]
the function symbol namespace", then that, to me
(just one user) is 100% a non-problem.

And IMO it's certainly not worth tossing out the
beautiful baby of simple prefix-key bindings to
keymaps with the supposedly too-cluttered-namespace
bathwater.

IMO, that bathwater itself is in fact clean &
clear.  It's a mountain stream, not dirty suds.

Just one opinion.



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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-18  1:54               ` Richard Stallman
@ 2020-07-18 23:21                 ` Juri Linkov
  2020-07-19  0:11                   ` Drew Adams
                                     ` (3 more replies)
  0 siblings, 4 replies; 45+ messages in thread
From: Juri Linkov @ 2020-07-18 23:21 UTC (permalink / raw)
  To: Richard Stallman; +Cc: monnier, emacs-devel

> So I think there needs to be a exception list, a way of defining a few
> key sequences starting with C-x 4 so that they depart from the usual
> rule and maintain backwards compatibility instead.

I propose the following design:

1. keep the existing 'C-x 4' bindings and other-window commands
   unchanged to maintain backwards compatibility;

2. add a catch-all fallback to ctl-x-4-map and bind it to the command
   invoked when an unbound key is typed after 'C-x 4'.

There are 2 possibilities what to do with an unbound key in this command:

2.1. define a new keymap with mappings from such unbound keys to commands.

For example, using project-prefix-map where "f" is bound to 'project-find-file'
and while project-prefix-map itself is bound to "p" would enable such
key sequences 'C-x 4 p f' to find a project file in another window.

There is no need to add all -other-window variants in such additional keymap,
it should handle the existing no-window commands, and display their buffers
in another window.

2.2. another possibility is when the above keymap doesn't match
     an unbound key then run its global keybinding.

For example, typing 'C-x 4 C-h i' will display the Info manual
in another window.

Now I tried to implement this, but the problem is that the fallback
'[remap t]' doesn't work, for example in:

  (define-key ctl-x-4-map [remap t] 'other-window-prefix)

it has no effect.  Then I discovered this explanation in
(info "(elisp) Remapping Commands"):

     Note that remapping only takes place through active keymaps; for
  example, putting a remapping in a prefix keymap like 'ctl-x-map'
  typically has no effect, as such keymaps are not themselves active.

So it seems remapping in ctl-x-4-map has no effect.



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

* RE: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-18 23:21                 ` Juri Linkov
@ 2020-07-19  0:11                   ` Drew Adams
  2020-07-19  3:38                   ` Stefan Monnier
                                     ` (2 subsequent siblings)
  3 siblings, 0 replies; 45+ messages in thread
From: Drew Adams @ 2020-07-19  0:11 UTC (permalink / raw)
  To: Juri Linkov, Richard Stallman; +Cc: monnier, emacs-devel

Read your post quickly.  Apologies if this is
off the mark.

Would the use of the fallback behavior be optional,
i.e., choosable by users (e.g. opt-in)?

Would it affect command (and key) discovery, e.g.,
giving a (false) impression that such-and-such an
other-* behavior, for which there is no explicit
command and no explicit key binding, but which is
available only via your fallback, is in fact a
real command/key?

Would a user be able to somehow reify/manifest
the fallback behavior as an actual other-*
command, which s?he could then bind to a key?

Generally, is the fallback thingy only a plus, as
opposed to being a possible substitute for what
we do now?

It bothers me that you might see it as an eventual
replacement, since it doesn't seem to offer the
same things.  Speaking of "backward compatible"
doesn't inspire confidence that it would be only
an optional plus, and not, e.g., a trojan horse.



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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-18 16:23                   ` Sean Whitton
  2020-07-18 17:00                     ` Drew Adams
@ 2020-07-19  2:28                     ` Richard Stallman
  2020-07-19 15:28                       ` Drew Adams
  2020-07-21  0:22                       ` Sean Whitton
  1 sibling, 2 replies; 45+ messages in thread
From: Richard Stallman @ 2020-07-19  2:28 UTC (permalink / raw)
  To: Sean Whitton; +Cc: emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > Maybe it would be possible to make a function that would generate
  > > an "other-window" version of an existing command, by making code to call
  > > that command.

  > This is why my original patch which partly prompted this discussion did
  > (bug#42210),

Sorry, I wasn't following this at that point.

                 but the feedback I got was that it would be better to avoid
  > cluttering the function symbol namespace with lots of -other-window
  > commands.

I think we are miscommunicating very slightly.  There are two closely
related but distinct questions.

1. Whether Drew would like to use that facility to make -other-window
  functions.

2. What to do about the standard C-x 4 commands, with three options:

   2a. Leave them as they are now.

   2b. Use your proposed generator facility to make a lot of
   -other-window functions.

   2c. Make C-x 4 handle them all automatically.

Your message talked about choosing between 2b and 2c, whereas I was
suggesting that Drew could do 1.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-18 23:21                 ` Juri Linkov
  2020-07-19  0:11                   ` Drew Adams
@ 2020-07-19  3:38                   ` Stefan Monnier
  2020-07-19 22:07                     ` Juri Linkov
  2020-07-20  2:39                   ` Richard Stallman
  2020-07-20  3:13                   ` Stefan Monnier
  3 siblings, 1 reply; 45+ messages in thread
From: Stefan Monnier @ 2020-07-19  3:38 UTC (permalink / raw)
  To: Juri Linkov; +Cc: Richard Stallman, emacs-devel

>> So I think there needs to be a exception list, a way of defining a few
>> key sequences starting with C-x 4 so that they depart from the usual
>> rule and maintain backwards compatibility instead.

In `other-frame-window` this is done via `ofw-transient-map`.


        Stefan




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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-15  3:32         ` Richard Stallman
@ 2020-07-19 13:00           ` Barry Fishman
  2020-07-19 15:38             ` Drew Adams
  0 siblings, 1 reply; 45+ messages in thread
From: Barry Fishman @ 2020-07-19 13:00 UTC (permalink / raw)
  To: emacs-devel


On 2020-07-14 23:32:33 -04, Richard Stallman wrote:
> If this change will make help commands fail to entirely work,
> why do it?
>
> On he other hand, if the change is a great big improvement, I suppose
> we can create a mechanism to allow the help commands to work 100% with
> this new command.  Please don't fail to make that work.

There seems to be alternatives to those proposed.

When getting "C-h k" help and you enter a prefix command, Emacs it
waiting for you to finish the command.  If you then type 'C-h', and that
has no binding it could just list what the bindings at that point are.
The use of C-h after a prefix tends to be use only to list the bindings
anyway, so if it is defined it only tells you that it is a command to
give you what you are looking for.

A less useful though more complex solution is to use tab with "C-h k"
help to first give you a list of possible completions and having to
type tab again to get help for tab itself.

The least work would be to just add a "C-h 4 C-h" command to get help
on the "C-h 4" commands available as is done in many other places.
--
Barry Fishman




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

* RE: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-19  2:28                     ` Richard Stallman
@ 2020-07-19 15:28                       ` Drew Adams
  2020-07-21  0:22                       ` Sean Whitton
  1 sibling, 0 replies; 45+ messages in thread
From: Drew Adams @ 2020-07-19 15:28 UTC (permalink / raw)
  To: rms, Sean Whitton; +Cc: emacs-devel

> There are two closely related but distinct questions.
> 
> 1. Whether Drew would like to use that facility to
>    make -other-window functions.

I hope I answered that clearly: No, I would not.

a. To me, the difficulty of, and the need to,
   automatically, programmatically create -other-*
   commands are non-problems.

   It's not difficult to create an -other-* command.

   When it's helpful to do so programmatically (e.g.
   to reduce repetitive code) I use (context-specific)
   Elisp macros to do so.  I do that quite a lot, in
   fact, but always context-specifically.

b. Beyond difficulty or need, it is, IMO, misguided
   to _automatically_ do that.  Such commands should
   be created only as needed, as decided by whoever
   wants them (user or library author).

There is neither a need nor a desire to systematically
have -other-* versions of all commands that display
something or otherwise use a window or frame.

My point was that for -other-* behavior I _do_ want
explicit commands.  And I don't want some blanket,
implicit, general "prefix command" behavior with no
explicit commands that I can bind as I like.

Saying I want explicit commands for -other-* behavior
does not mean that I want such behavior - or such
commands - everywhere and always.

There's nothing wrong with creating prefix commands.
I and others do that, and Emacs has some predefined.

What I object to is replacing the use of prefix keys,
which are bound to keymaps, with some general
mechanism that uses a prefix command.

And in particular, replacing prefix keys such as
`C-x' and `C-x 4', and their keymap bindings, with
some prefix command that simulates what they do,
especially in some blanket way, automatically
giving _everything_ an -other-* behavior.  Not
everything deserves/needs an -other-* behavior.

There is talk, wrt explicit -other-* commands, of
polluting the function/command namespace.  The
same thing can be said of the proposal, but even
more so, wrt a resultant plethora of -other-*
behavior.

The proposal apparently makes `C-x 4' provide
-other-* behavior _generally_, far more than
what's available today using explicit keys bound
in `ctl-x-4-map'.

> 2. What to do about the standard C-x 4 commands,
>    with three options:
> 
>    2a. Leave them as they are now.
> 
>    2b. Use your proposed generator facility to make
>        a lot of -other-window functions.

I don't think that was proposed, at least initially.

It may have been offered as a kind of sop, to respond
(misguidedly) to my desire/need to have explicit
-other-* commands (e.g. to bind wherever one likes).

For my opinion on that, see above - no need.  There's
no problem defining -other-* commands, manually or
using macros.

>    2c. Make C-x 4 handle them all automatically.
> 
> Your message talked about choosing between 2b and 2c,
> whereas I was suggesting that Drew could do 1.



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

* RE: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-19 13:00           ` Barry Fishman
@ 2020-07-19 15:38             ` Drew Adams
  2020-07-19 16:20               ` Barry Fishman
  0 siblings, 1 reply; 45+ messages in thread
From: Drew Adams @ 2020-07-19 15:38 UTC (permalink / raw)
  To: Barry Fishman, emacs-devel

> The least work would be to just add a "C-h 4 C-h" command to get help
> on the "C-h 4" commands available as is done in many other places.

`C-h r C-h' already lists all of the `C-x 4' keys
and their commands.  And choosing any of those
then shows you its complete help.



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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-19 15:38             ` Drew Adams
@ 2020-07-19 16:20               ` Barry Fishman
  2020-07-19 17:45                 ` Drew Adams
  0 siblings, 1 reply; 45+ messages in thread
From: Barry Fishman @ 2020-07-19 16:20 UTC (permalink / raw)
  To: emacs-devel


On 2020-07-19 15:38:57 GMT, Drew Adams wrote:
> `C-h r C-h' already lists all of the `C-x 4' keys
> and their commands.  And choosing any of those
> then shows you its complete help.

If you mean "C-x 4 C-h", yes but, "C-h k C-x 4" is left waiting for
further input and "C-h k C-x 4 C-h" just says there is no binding for
it.

There is no universal way to get further information at that point.  If
"C-h k" had a solution it would apply uniformly and not require mucking about
which changing any (other) key bindings.

Should there be a general rule than any partial key sequence have "C-h"
show the possible options?  And if so wouldn't it be more straight
forward to not have to manually define for each possible key sequence,
but still have any exiting such binding still work?

--
Barry Fishman




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

* RE: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-19 16:20               ` Barry Fishman
@ 2020-07-19 17:45                 ` Drew Adams
  0 siblings, 0 replies; 45+ messages in thread
From: Drew Adams @ 2020-07-19 17:45 UTC (permalink / raw)
  To: Barry Fishman, emacs-devel

> > `C-h r C-h' already lists all of the `C-x 4' keys
> > and their commands.  And choosing any of those
> > then shows you its complete help.
> 
> If you mean "C-x 4 C-h", yes 

Yep.  Finger-flunked; sorry.

> but, "C-h k C-x 4" is left waiting for further input
> and "C-h k C-x 4 C-h" just says there is no binding for it.

> There is no universal way to get further information at that point.

I guess the info you want at that point is the
info you'd get from `C-x 4 C-h'.  Is that right?

> If "C-h k" had a solution it would apply uniformly and not require mucking
> about which changing any (other) key bindings.

OK.

> Should there be a general rule than any partial key sequence have "C-h"
> show the possible options?

Maybe.

Have you really found this to be a problem?

I haven't.  But I know that some users don't
know about using `C-h' after a prefix key.

And I do get your point, about not wanting to
abandon `C-h k C-x 4' and use `C-x 4 C-h' at
that point.  That doesn't bother me, but OK.

> And if so wouldn't it be more straight
> forward to not have to manually define for each possible key sequence,
> but still have any exi[s]ting such binding still work?

Definitely.  But only if implementing that
doesn't remove/break something else (unlike
what's being proposed in this thread).

No one has to explicitly define a binding for
`C-h' after a prefix key, for example.  (And
as you point out, there is in fact _no_ such
key binding.)  Yes, the same should apply for
what you suggest.

But I don't think the overall discussion is
really about `C-h k' and its getting to the
help for a prefix key (e.g. help like what
`C-h 4 C-h' shows).

But if it were, then my reply would be (besides
perhaps doing something such as you suggest -
which AFAIK doesn't require changes such as
those proposed), to instead provide something
like the help that key completion (library
Key See or Icicles) or `which-key' provides.

https://www.emacswiki.org/emacs/KeySee

https://www.emacswiki.org/emacs/Icicles

https://github.com/justbur/emacs-which-key

Those all, like an appended `C-h', let you see
the keys that complete a prefix key, as well
as their commands.  And unlike `C-h', they
don't interrupt use of the prefix key.

(In addition, Icicles lets you get the full
doc string for any such completing key.)




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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-19  3:38                   ` Stefan Monnier
@ 2020-07-19 22:07                     ` Juri Linkov
  2020-07-20  3:09                       ` Stefan Monnier
  0 siblings, 1 reply; 45+ messages in thread
From: Juri Linkov @ 2020-07-19 22:07 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Richard Stallman, emacs-devel

> In `other-frame-window` this is done via `ofw-transient-map`.

`C-x 4` could fall back to `ofw-transient-map` when `C-x 4` is
followed by an unbound key that has a binding in `ofw-transient-map`.
Otherwise, when there is no binding in the `C-x 4` keymap,
and no binding in `ofw-transient-map` then the key sequence
could be followed by a global binding.

But such fallback currently is impossible to implement because
`[remap t]` doesn't work in `ctl-x-4-map`.  Tried with:

  (define-key ctl-x-4-map [remap t] 'other-window-prefix)

then typed `C-x 4 C-x C-f` and the result is:

  C-x 4 C-x C-f is undefined



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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-18 23:21                 ` Juri Linkov
  2020-07-19  0:11                   ` Drew Adams
  2020-07-19  3:38                   ` Stefan Monnier
@ 2020-07-20  2:39                   ` Richard Stallman
  2020-07-20  3:13                   ` Stefan Monnier
  3 siblings, 0 replies; 45+ messages in thread
From: Richard Stallman @ 2020-07-20  2:39 UTC (permalink / raw)
  To: Juri Linkov; +Cc: monnier, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > I propose the following design:

  > 1. keep the existing 'C-x 4' bindings and other-window commands
  >    unchanged to maintain backwards compatibility;

  > 2. add a catch-all fallback to ctl-x-4-map and bind it to the command
  >    invoked when an unbound key is typed after 'C-x 4'.

LGTM.

  > There are 2 possibilities what to do with an unbound key in this command:

  > 2.1. define a new keymap with mappings from such unbound keys to commands.

Why do we need this -- can't we define those exceptions directly
in ctl-x-4-map?

  > 2.2. another possibility is when the above keymap doesn't match
  >      an unbound key then run its global keybinding.

  > For example, typing 'C-x 4 C-h i' will display the Info manual
  > in another window.

  > Now I tried to implement this, but the problem is that the fallback
  > '[remap t]' doesn't work, for example in:

  >   (define-key ctl-x-4-map [remap t] 'other-window-prefix)

We could make that work, one way or another.


-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-19 22:07                     ` Juri Linkov
@ 2020-07-20  3:09                       ` Stefan Monnier
  2020-07-20 20:50                         ` Juri Linkov
  0 siblings, 1 reply; 45+ messages in thread
From: Stefan Monnier @ 2020-07-20  3:09 UTC (permalink / raw)
  To: Juri Linkov; +Cc: Richard Stallman, emacs-devel

>> In `other-frame-window` this is done via `ofw-transient-map`.
> `C-x 4` could fall back to `ofw-transient-map` when `C-x 4` is
> followed by an unbound key that has a binding in `ofw-transient-map`.
> Otherwise, when there is no binding in the `C-x 4` keymap,
> and no binding in `ofw-transient-map` then the key sequence
> could be followed by a global binding.

I don't understand how that's different from how `ofw-transient-map` is
used in `other-frame-window`.

> But such fallback currently is impossible to implement because
> `[remap t]` doesn't work in `ctl-x-4-map`.  Tried with:
>
>   (define-key ctl-x-4-map [remap t] 'other-window-prefix)

`other-frame-window` uses `set-transient-map`, not [remap t] (which
indeed is basically unusable, at least not without introducing weird
corner cases).

And of course, it would still suffer from the same problem of how to
make `C-x k` return the command bound to `C-x 4 C-f` or to `C-x e e e`.


        Stefan




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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-18 23:21                 ` Juri Linkov
                                     ` (2 preceding siblings ...)
  2020-07-20  2:39                   ` Richard Stallman
@ 2020-07-20  3:13                   ` Stefan Monnier
  3 siblings, 0 replies; 45+ messages in thread
From: Stefan Monnier @ 2020-07-20  3:13 UTC (permalink / raw)
  To: Juri Linkov; +Cc: Richard Stallman, emacs-devel

> 2. add a catch-all fallback to ctl-x-4-map and bind it to the command
>    invoked when an unbound key is typed after 'C-x 4'.

I don't know how to implement that in a way that works well enough
(i.e. without suffering from weird corner case behaviors due to
interactions with `input-decode-map`, `function-key-map`, etc...).

`set-transient-map` is the least bad I way I found to provide this kind
of behavior.


        Stefan




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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-20  3:09                       ` Stefan Monnier
@ 2020-07-20 20:50                         ` Juri Linkov
  0 siblings, 0 replies; 45+ messages in thread
From: Juri Linkov @ 2020-07-20 20:50 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Richard Stallman, emacs-devel

>> `C-x 4` could fall back to `ofw-transient-map` when `C-x 4` is
>> followed by an unbound key that has a binding in `ofw-transient-map`.
>> Otherwise, when there is no binding in the `C-x 4` keymap,
>> and no binding in `ofw-transient-map` then the key sequence
>> could be followed by a global binding.
>
> I don't understand how that's different from how `ofw-transient-map` is
> used in `other-frame-window`.

This was intended to address TODO items in `other-frame-window`.
The first TODO item:

;; - Pay attention to bindings added to ctl-x-4-map and ctl-x-5-map

can be solved by just leaving the existing ctl-x-4-map and ctl-x-5-map
as they are now.  And by adding to these maps the [remap t] fallback
bound to the `ofw--set-prefix` command it would be possible to use key bindings
from `ofw-transient-map` where keys don't need to be bound to special
-other-window variants.

And when no key is found in `ofw-transient-map`, then the global binding
could be appled.  For example, `C-x 4 C-h i' could show the Info manual
in another window.



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

* Re: "whether the global keymap C-x 4 will be replaced by a command,"
  2020-07-19  2:28                     ` Richard Stallman
  2020-07-19 15:28                       ` Drew Adams
@ 2020-07-21  0:22                       ` Sean Whitton
  1 sibling, 0 replies; 45+ messages in thread
From: Sean Whitton @ 2020-07-21  0:22 UTC (permalink / raw)
  To: rms; +Cc: emacs-devel

Hello,

On Sat 18 Jul 2020 at 10:28PM -04, Richard Stallman wrote:

> I think we are miscommunicating very slightly.  There are two closely
> related but distinct questions.
> [...]

Thanks, I see what you mean.

-- 
Sean Whitton



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

end of thread, other threads:[~2020-07-21  0:22 UTC | newest]

Thread overview: 45+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <E1juSI3-0005ai-6j@fencepost.gnu.org>
     [not found] ` <83ft9woo68.fsf@gnu.org>
2020-07-13  2:52   ` "whether the global keymap ‘C-x 4’ will be replaced by a command," Richard Stallman
2020-07-13 23:58     ` "whether the global keymap C-x 4 " Juri Linkov
2020-07-14  4:19       ` Drew Adams
2020-07-14  5:55       ` Stefan Monnier
2020-07-14 14:41         ` Drew Adams
2020-07-14 14:48           ` Stefan Monnier
2020-07-14 15:28             ` Drew Adams
2020-07-14 15:35           ` John Yates
2020-07-14 14:51         ` Eli Zaretskii
2020-07-14 15:15           ` Stefan Monnier
2020-07-14 16:29             ` Eli Zaretskii
2020-07-15  4:06               ` Stefan Monnier
2020-07-15 14:16                 ` Eli Zaretskii
2020-07-15 23:54                 ` Juri Linkov
2020-07-16  4:07                   ` Stefan Monnier
2020-07-16 22:57                     ` Juri Linkov
2020-07-17  2:56                       ` Stefan Monnier
2020-07-17  0:56                 ` Richard Stallman
2020-07-14 22:27         ` Juri Linkov
2020-07-14 22:55           ` Drew Adams
2020-07-15  4:06           ` Stefan Monnier
2020-07-16  3:21           ` Richard Stallman
2020-07-16 15:05             ` Eli Zaretskii
2020-07-16 23:05             ` Juri Linkov
2020-07-17  2:10               ` Drew Adams
2020-07-18  1:57                 ` Richard Stallman
2020-07-18 16:23                   ` Sean Whitton
2020-07-18 17:00                     ` Drew Adams
2020-07-19  2:28                     ` Richard Stallman
2020-07-19 15:28                       ` Drew Adams
2020-07-21  0:22                       ` Sean Whitton
2020-07-18  1:54               ` Richard Stallman
2020-07-18 23:21                 ` Juri Linkov
2020-07-19  0:11                   ` Drew Adams
2020-07-19  3:38                   ` Stefan Monnier
2020-07-19 22:07                     ` Juri Linkov
2020-07-20  3:09                       ` Stefan Monnier
2020-07-20 20:50                         ` Juri Linkov
2020-07-20  2:39                   ` Richard Stallman
2020-07-20  3:13                   ` Stefan Monnier
2020-07-15  3:32         ` Richard Stallman
2020-07-19 13:00           ` Barry Fishman
2020-07-19 15:38             ` Drew Adams
2020-07-19 16:20               ` Barry Fishman
2020-07-19 17:45                 ` Drew Adams

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).