all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Drew Adams <drew.adams@oracle.com>
To: "Óscar Fuentes" <ofv@wanadoo.es>, emacs-devel@gnu.org
Subject: RE: Making `interactive' conditional
Date: Sun, 10 Jan 2016 10:23:38 -0800 (PST)	[thread overview]
Message-ID: <2b423be0-9378-44d7-abad-a649fdf1e3c2@default> (raw)
In-Reply-To: <878u3xfkkb.fsf@wanadoo.es>

> > This might be OK if the only reason you every use M-x is to execute a
> > command.  But it's not.  People (in particular, me) use it to discover
> > Emacs, to find the exact name of a command which has only vaguely
> > embedded itself in the memory, to get this name into the kill ring to be
> > yanked into another source file or into documentation, and so on.  Try
> > M-x <tab> <prior> sometime, and explore the wealth of Emacs commands.
> > :-)
> 
> The current implementation of M-x is, possibly, the worst way of
> exploring the wealth of Emacs commands.

I disagree strongly.  With good ways to match, and especially
with the ability to narrow (e.g. what is provided by Icicles
and Helm, and possibly other completion contexts), it is far
better, not worse, than `apropos-command' - for example.

Interactive, incremental, on-demand help of different degrees.
It is a fantastic tool for _discovery_ - another
Emacs-needs-better theme that has been brought up recently.

> M-x is for *executing* commands,
> not for learning about them (unless your learning method consists on
> executing commands you don't know about).

Very wrong.  `M-x' is for lots of things.  And discovery,
even for the limited completion that vanilla Emacs offers,
is one of the most important.

Don't you ever use `C-h f' or `C-h v' to discover/explore
(even for spelling information)?

Are you going to go whole-hog on this new idea, and so
decide to limit the completion candidates for `C-h f' to
only the functions that some Emacs Dev programmer decided
are "appropriate" for the current context?

I hope not.  I would hope that you see the point of
showing a user all of the function names that match the
current input.

> C-h f, the fine manual or,
> better, browsing the sources is what I would do (and have done) for
> exploring what Emacs has to offer.

See above.  If it is such a great idea to let Emacs Dev
predetermine which commands are appropriate for the current
`M-x' context, then why limit this great feature to `M-x'?
Surely `C-h f' and `C-h v' and ... can be enhanced the same
way?

Even thinking that Emacs Dev can specify what constitutes
"the current context" for a given user is presumptuous.
Not only does it depend on many tangible factors - more
than just the current mode(s).  It depends also on intangible
factors - in particular the user's current aim/intention.

Let's not be so presumptuous.  Instead, if we provide
guesses to try to help, let a user choose our guesses,
instead of imposing them.  And even more importantly, let
users ignore our brilliant guesses and decide for
themselves what they consider the "current context" to be.

Let _users_ filter, on demand.  Provide different, useful
ways for them to quickly and powerfully filter candidates
out/in, thus shaping the set of candidates (and thus
defining the context!), _themselves_.

Icicles and Helm have tried to do exactly that, and have
succeeded to some extent.  Let's move in the direction
of giving users _more_ control, and faster and more
powerful control - not in the direction of supposing,
at code time, that we know what's good for them.

> Besides, if you insist on using M-x for learning about new commands, I
> suppose that having only those that apply to your current context is
> helpful, to say the least.

Sure.  But WHO decides just what the "current context" means,
and when?  Is it the currently invoked command that is reading
your input that decides?  Can the user decide, interactively?

Or is it some Emacs maintainer who goes over all of the commands
in a wholesale fashion, applying some simplistic rule ahead of
time, prior to even distributing Emacs to users?

No one has spoken against being able to filter `M-x' candidates
to fit the user's current context.

[Please read that again, if it's not clear.]

The question is how what constitutes the "current context" is
determined/decided, and by whom, and when.

> > Again, what is this feature for?  Is it going to make editing easier for
> > experienced users?  Is it really going to attract new users, ones who
> > would be very happy in Emacs but for the huge number of commands
> > presented to them in an M-x?
> 
> How user-friendly is to type M-x and be offered with thousands of
> commands that have zero relation to the task you are performing?

If that's what you're doing then I submit that maybe you are
not using `M-x' as well as you might.  (Unless for some reason
you want to see those thousands.)

[And aside from considering `M-x' for this, I would hope that
you would have something more specific than just `M-x' to use,
to help you carry out the "task you are performing".  If you
are using `M-x' only to invoke commands, and you are using
only or mainly `M-x' to invoke commands, then something is
missing.]

You should be able to quickly & easily filter `M-x' candidates
by pattern matching.  And hopefully you would be able to also
filter them with additional conditions/predicates.

But YOU should be able to do that, together with the invoked
command (`M-x' in this case, which already filters using
`commandp') - not just some hard-coded filtering done at
code time.

_Late binding_ is a user's friend, especially for a user of
an interactive, self-documenting, and extensible environment
such as Emacs.

Lifting such decisions to the earliest possible stage, code
time, is going backward.  Let's concentrate, instead, on
giving users _more_, not less, control over the set of
completion candidates.

Let's help users filter more powerfully, instead of
hard-coding what we think is the right filtering them.
Let users decide.

> Some of those commands can cause undesirable effects if you
> invoke them by accident,

Too vague.  If so, then fix those particular commands.
Make sure that the commands themselves take care of the
context in which they are invoked.

Let's not try to solve _that_ problem using a
one-size-fits-all, abstract, general rule, applied at
code time to a huge code base.

> I experienced that as a beginner and is very confusing.

When that happens, file a bug report so we can fix that
command.  Such a problem is particular to _that_ command
and should be fixed in a way that is appropriat to _it_.

> Talking about discoverability and your M-x learning method, if I'm
> interested on learning what can I do while editing a C file, how does
> help me having to skim over thousands upon thousands of unrelated
> commands that only make sense for their respective modes?

No one is arguing that you should need to scan thousands
of unrelated commands.  The question is _how_ to determine
which commands _you_ want to see in the _current context_.

That question needs to be answered with finesse, not just
using a sledge hammer.  And the best way to start answering
it is to give _you_, the user, great ways to filter
interactively.

_You_ should decide just how you see the current context,
what you see it to be.  Emacs should not be second-guessing
you about that.

There are many users and many use cases for something
even as simple as `M-x'.  Do not presume to guess what
is good for everyone.

> Why we hide the menus of the modes that are not active for the current
> buffer? Why we have local keymaps? Where were you at the time those
> repressing features were imposed on the masses?

Modes and buffers and such are useful ways to categorize
or define contexts.  And there are others.  We could do
with some more (IMO).  (Common Lisp "packages", i.e.,
namespaces is one.)

But looking for ways to precisely specify a context is
_opposite_ to what is being proposed here.  What is being
proposed here is to _interpret_ the absence of a context
specification as a particular context, ahead of time.

You cannot (should not) assume that the only appropriate
user context for `M-x' is the current major mode (or
that mode plus the current minor modes).

`M-x' is completely general, and it should remain so.

Nothing prevents a mode or library from defining a
different command that reads command names and invokes
one that is chosen by the user, and that imposes a
particular interpretation of the current context, i.e.,
provides only certain command names as candidates.

That's exactly what's called for - not breaking the
legs off of `M-x' to make it fit some rigid mold.



  reply	other threads:[~2016-01-10 18:23 UTC|newest]

Thread overview: 141+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-25  6:21 4K Bugs Lars Ingebrigtsen
2015-12-25  7:46 ` Eli Zaretskii
2015-12-25 17:00 ` John Wiegley
2015-12-25 17:30   ` Lars Ingebrigtsen
2015-12-25 17:51     ` John Wiegley
2015-12-25 17:53       ` Lars Ingebrigtsen
2015-12-25 17:59         ` John Wiegley
2015-12-25 18:27           ` jpff
2015-12-25 18:35             ` Lars Ingebrigtsen
2015-12-25 18:33           ` Dmitry Gutov
2015-12-25 18:40             ` Lars Ingebrigtsen
2015-12-25 18:54               ` Lars Ingebrigtsen
2015-12-25 19:46                 ` Dmitry Gutov
2015-12-25 20:06                   ` Lars Ingebrigtsen
2015-12-25 19:36               ` John Wiegley
2015-12-25 19:56               ` Dmitry Gutov
2015-12-25 20:05                 ` Eli Zaretskii
2015-12-25 20:26                 ` Lars Ingebrigtsen
2015-12-26 13:16           ` Michael Albinus
2015-12-26  8:07   ` Andreas Röhler
2015-12-26 10:29     ` Eli Zaretskii
2015-12-26 15:14       ` Andreas Röhler
2015-12-26 16:34         ` Eli Zaretskii
2015-12-26 16:41           ` Lars Ingebrigtsen
2015-12-26 16:52             ` Eli Zaretskii
2015-12-26 16:59               ` Lars Ingebrigtsen
2015-12-26 17:55                 ` Ivan Shmakov
2015-12-26 17:58                   ` Lars Ingebrigtsen
2015-12-26 18:12                     ` Ivan Shmakov
2015-12-26 18:21                       ` Lars Ingebrigtsen
2015-12-26 18:42                         ` Ivan Shmakov
2015-12-26 18:48                           ` Lars Ingebrigtsen
2015-12-27 22:41               ` Per Starbäck
2015-12-28  9:44                 ` Andreas Röhler
2015-12-28 20:18               ` John Wiegley
2015-12-26 16:59             ` Paul Eggert
2015-12-26 17:48               ` Lars Ingebrigtsen
2015-12-28 20:15                 ` John Wiegley
2015-12-26 14:55     ` Lars Ingebrigtsen
2015-12-27  2:52       ` Richard Stallman
2015-12-27  6:07         ` Lars Ingebrigtsen
2016-01-07 20:10 ` Phillip Lord
2016-01-07 22:38   ` Phillip Lord
2016-01-09  4:26     ` Andrew Hyatt
2016-01-09  9:20       ` Michael Albinus
2016-01-07 23:32   ` John Wiegley
2016-01-08  0:17   ` Xue Fuqiao
2016-01-08 12:49     ` Phillip Lord
2016-01-08  1:41   ` Alexis
2016-01-08  1:50     ` Richard Copley
2016-01-08  2:41       ` Alexis
2016-01-09  1:51         ` John Wiegley
2016-01-08 12:48     ` Phillip Lord
2016-01-08 13:06     ` Michael Albinus
2016-01-08 13:59       ` Phillip Lord
2016-01-08 14:12         ` Michael Albinus
2016-01-09  2:52       ` Alexis
2016-01-10 15:58         ` Michael Albinus
2016-01-11  8:05           ` Alexis
2016-01-08  8:28   ` Lars Magne Ingebrigtsen
2016-01-08 12:57     ` Phillip Lord
2016-01-08 13:37       ` Michael Albinus
2016-01-08 13:52       ` Lars Magne Ingebrigtsen
2016-01-11 13:52         ` Phillip Lord
2016-01-11 16:18           ` Lars Magne Ingebrigtsen
2016-01-08 15:05     ` Stefan Monnier
2016-01-08 23:16     ` Leaving out non-applicable commands on Mx (was: 4K Bugs) Óscar Fuentes
2016-01-09  0:22       ` Leaving out non-applicable commands on Mx John Wiegley
2016-01-09  0:55         ` Óscar Fuentes
2016-01-09  1:46           ` John Wiegley
2016-01-09  1:54             ` Spencer Boucher
2016-01-09  3:09               ` Drew Adams
2016-01-09  3:37                 ` Óscar Fuentes
2016-01-09  2:15             ` Óscar Fuentes
2016-01-09  3:09               ` Drew Adams
2016-01-09  3:49                 ` Óscar Fuentes
2016-01-09  4:14               ` Stefan Monnier
2016-01-09  3:09             ` Drew Adams
2016-01-09  3:08           ` Drew Adams
2016-01-09  3:33             ` Óscar Fuentes
2016-01-09  9:05             ` Yuri Khan
2016-01-09 19:27               ` Drew Adams
2016-01-09 20:55               ` Making `interactive' conditional (was: Leaving out non-applicable commands on Mx) John Wiegley
2016-01-09 21:53                 ` Drew Adams
2016-01-11 12:02                   ` Drew Adams
2016-01-10  9:02                 ` Making `interactive' conditional Lars Magne Ingebrigtsen
2016-01-10 10:09                   ` Clément Pit--Claudel
2016-01-10 17:55                     ` Drew Adams
     [not found]                   ` <CAAdUY-Kfm-0JbOLpi4KE5wkmp6hfG+-y3V-_vTExaFkmF5RmEg@mail.gmail.com>
2016-01-10 12:36                     ` Artur Malabarba
2016-01-11  3:46                   ` Richard Stallman
2016-01-11 15:13                     ` Lars Magne Ingebrigtsen
2016-01-11  6:13                   ` Stefan Monnier
2016-01-11  6:48                     ` Óscar Fuentes
2016-01-11 14:08                       ` Herring, Davis
2016-01-11 16:34                         ` Óscar Fuentes
2016-01-12  4:46                           ` Herring, Davis
2016-01-12  4:59                             ` Óscar Fuentes
2016-01-11 15:15                     ` Lars Magne Ingebrigtsen
2016-01-12  2:14                   ` Clément Pit--Claudel
2016-01-10 15:27                 ` Making `interactive' conditional (was: Leaving out non-applicable commands on Mx) Alan Mackenzie
2016-01-10 16:47                   ` Making `interactive' conditional Óscar Fuentes
2016-01-10 18:23                     ` Drew Adams [this message]
2016-01-10 19:31                       ` Óscar Fuentes
2016-01-10 22:40                         ` Drew Adams
2016-01-10 23:19                           ` Óscar Fuentes
2016-01-10 18:22                   ` Making `interactive' conditional (was: Leaving out non-applicable commands on Mx) Drew Adams
2016-01-11  6:29                     ` Making `interactive' conditional Stefan Monnier
2016-01-11 11:48                       ` Drew Adams
2016-01-10 18:33                   ` Clément Pit--Claudel
2016-01-10 22:28                   ` Making `interactive' conditional (was: Leaving out non-applicable commands on Mx) Marcin Borkowski
2016-01-11  6:19                 ` Making `interactive' conditional Stefan Monnier
2016-01-19  6:24                   ` John Wiegley
2016-01-19 10:11                     ` Lars Magne Ingebrigtsen
2016-01-19 11:17                       ` Lars Magne Ingebrigtsen
2016-01-19 13:31                       ` Stefan Monnier
2016-01-19 16:52                       ` Drew Adams
2016-01-19 15:28                     ` Óscar Fuentes
2016-01-19 16:07                       ` Lars Magne Ingebrigtsen
2016-01-19 20:24                         ` Óscar Fuentes
2016-01-19 16:20                       ` John Wiegley
2016-01-19 17:55                         ` Lars Magne Ingebrigtsen
2016-01-19 18:39                           ` John Wiegley
2016-01-19 19:02                             ` Lars Magne Ingebrigtsen
2016-01-19 20:23                         ` Óscar Fuentes
2016-01-09  8:06         ` Leaving out non-applicable commands on Mx Lars Magne Ingebrigtsen
2016-01-09 14:50           ` Óscar Fuentes
2016-01-09 17:32           ` Stefan Monnier
2016-01-10  8:53             ` Lars Magne Ingebrigtsen
2016-01-10 16:05               ` Stefan Monnier
2016-02-04  3:19                 ` Lars Ingebrigtsen
2016-01-10 16:07               ` Stefan Monnier
2016-01-10 16:14                 ` Óscar Fuentes
2016-01-08 10:50   ` 4K Bugs Michael Albinus
2016-01-08 13:21     ` Phillip Lord
2016-01-08 13:33       ` Michael Albinus
2016-01-08 14:08         ` Phillip Lord
2016-01-09  4:21           ` Andrew Hyatt
2016-01-09  8:42             ` Michael Albinus
2016-01-11 13:54               ` Phillip Lord
2016-01-08 19:27         ` Stephen Leake
2016-01-08 20:52           ` Michael Albinus

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=2b423be0-9378-44d7-abad-a649fdf1e3c2@default \
    --to=drew.adams@oracle.com \
    --cc=emacs-devel@gnu.org \
    --cc=ofv@wanadoo.es \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

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

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.