GNU bug report logs - #47215
28.0.50; Let M-x switch between M-x and M-X

Previous Next

Package: emacs;

Reported by: Felician Nemeth <felician.nemeth <at> gmail.com>

Date: Wed, 17 Mar 2021 17:57:01 UTC

Severity: wishlist

Found in version 28.0.50

Fixed in version 29.1

Done: Lars Ingebrigtsen <larsi <at> gnus.org>

Bug is archived. No further changes may be made.

Full log


View this message in rfc822 format

From: Felician Nemeth <felician.nemeth <at> gmail.com>
To: 47215 <at> debbugs.gnu.org
Cc: Lars Ingebrigtsen <larsi <at> gnus.org>
Subject: bug#47215: 28.0.50; Let M-x switch between M-x and M-X
Date: Sun, 04 Apr 2021 19:51:17 +0200
>> I wish there was a convenient way to switch back and forth between
>> execute-extended-command and execute-extended-command-for-buffer.  I
>> think M-x would be an ideal binding for this as it is easy to press and
>> more useful than the current "Command attempted to use minibuffer while
>> in minibuffer".
>>
>> I'd imagine this feature being somewhat analogous to how ido-find-file
>> falls back to find-file after C-f.
>
> Yes, being able to move from `execute-extended-command-for-buffer' to
> `execute-extended-command' makes sense, but I'm not sure the other
> direction is as useful.  And while there's only two of these commands
> today, I think it's likely that (in the future) that we'll grow more of
> these.

I think cycling makes even more sense when there are more than two of
these execute-extended-commands.  Currently, going from
`execute-extended-command' to `execute-extended-command-for-buffer'
would be useful for me because I can type M-x M-x more easily than type
M-X.

> I'm not quite sure how to implement this, though -- we basically end up
> in `completing-read', and `execute-extended-command-for-buffer' would
> have to define an `M-x' binding there, I guess...  and then somehow call
> `read-extended-command' with the text already in the minibuffer.
>
> Anybody got an idea as to how to implement this without rewriting
> `read-extended-command' completely?

The execute-extended-commands have two undocumented optional arguments
(command-name and typed).  What are they used for?

Anyway, following the fallback logic of `ido-find-file', I was able to
rebind `M-x' and save the content of the minibuffer with a non-standard
exit from `execute-extended-command'.  Maybe the ugly code below can
give ideas to someone more knowledgeable.


(defun my-exit ()
  (interactive)
  (throw 'cycle (cons 'cycle (minibuffer-contents))))

(let ((minibuffer-local-completion-map minibuffer-local-completion-map)
      ret)
  (define-key minibuffer-local-completion-map (kbd "M-x") 'my-exit)
  (setq ret (catch 'cycle
	      (execute-extended-command nil)))
  (if (eq 'cycle (car ret))
      (message "Should switch to M-X with %s" (cdr ret))
    ret))


Thanks.




This bug report was last modified 2 years and 363 days ago.

Previous Next


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