From: "Aaron S. Hawley" <aaron.s.hawley@gmail.com>
To: Chong Yidong <cyd@gnu.org>
Cc: emacs-devel@gnu.org, Miles Bader <miles@gnu.org>
Subject: Re: bug: "C-x z" ("repeat") no longer works correctly with M-x
Date: Sat, 2 Jun 2012 18:07:52 -0400 [thread overview]
Message-ID: <CAFw1JJ63Z=H8bVfwgF=pPdkg8b1BnjuhdhMrsVbXJYc6HoYFLA@mail.gmail.com> (raw)
In-Reply-To: <8762ba8b6p.fsf@gnu.org>
On 6/2/12, Chong Yidong <cyd@gnu.org> wrote:
> "Aaron S. Hawley" <aaron.s.hawley@gmail.com> writes:
>
>> I had given a more literal translation of the C command to the
>> gnu-emacs-sources mailing list back in March. Stefan and I discussed
>> it but hadn't run across this issue with repeat. He later made some
>> modifications to my submission and committed it in May. I have only
>> now run it and can confirm this bug with repeat. I'm not sure what's
>> causing it though, but found the following fixes it. Again, I'm not
>> sure why. Nor am I sure if it's a wholly appropriate fix.
>
> No, tweaking the interactive spec does not really fix the problem.
>
> The problem is that the old execute-extended-command sets the
> real_this_command internal variable, which causes the Emacs command loop
> to record the command that was actually executed into real-last-command
> and last-repeatable-command.
>
> In other words, it's not just the fact that `C-x z' doesn't work
> properly. Moving execute-extended-command to Lisp produces a
> backward-incompatible change in the values of the real-last-command and
> last-repeatable-command variables for M-x. I suspect this may break
> things other than `C-x z'. I guess we could fix this by exposing
> real_this_command to Lisp too, but that kinda defeats the point of that
> variable...
>
> Is there a strong rationale for moving execute-extended-command to Lisp,
> other than the general principle that we want as much functionality
> implemented Lisp as possible? If not, it may not be worth making this
> change, at least in Emacs 24.2, due to the risk of gratuitous
> incompatibilities.
I agree, it's not worth it if things break. As I wrote to
gnu-emacs-sources, I've been using a Lisp version of M-x for several
years. Obviously, I ran into issues when I first tried writing the
code, but haven't run into any issues since. I am a big user of
repeat and repeat-complex-command and keyboard macros. I think it's
possible to get this Lisp version to work as well as the C version.
I understand your concern about real_this_command in command_loop and
call-interactively. However, it's not clear if there's any reason for
it for M-x. I'd be interested to know if there other issues. Perhaps
the timeline of 24.2 won't allow for it?
I've made sure repeat works if M-x is a mouse event by adding it to
the tool-bar or the menu-bar.
(define-key menu-bar-tools-menu [m-x]
`(menu-item ,(purecopy "M-x") execute-extended-command
:enable (menu-bar-non-minibuffer-window-p)
:help ,(purecopy "Execute extended command")))
(tool-bar-add-item-from-menu 'execute-extended-command "mpc/add"
nil :label "Execute extended command"
:vert-only t)
I do suggest the following fixes to rework Stefan's revision,
including the change to the interactive spec. Some of it is white
space changes and a comment that no longer applies.
2012-05-29 Aaron S. Hawley <aaron.s.hawley@gmail.com>
* simple.el (execute-extended-command): Reading command-name in
interactive form breaks the repeat command. Improve error message
for empty command-name.
--- simple.el 2012-05-29 08:21:45.000000000 -0400
+++ simple.el 2012-05-29 18:46:04.836717200 -0400
@@ -1373,17 +1373,20 @@
Noninteractively, the argument PREFIXARG is the prefix argument to
give to the command you invoke, if it asks for an argument."
- (interactive (list current-prefix-arg (read-extended-command)))
+ (interactive "P")
;; Emacs<24 calling-convention was with a single `prefixarg' argument.
- (if (null command-name) (setq command-name (read-extended-command)))
+ (when (null command-name)
+ ;; Could be in `interactive' as well, but it breaks `repeat'.
+ (setq command-name (read-extended-command)))
(let* ((function (and (stringp command-name) (intern-soft command-name)))
(binding (and suggest-key-bindings
- (not executing-kbd-macro)
- (where-is-internal function overriding-local-map t))))
+ (not executing-kbd-macro)
+ (where-is-internal function overriding-local-map t))))
+ (when (and (stringp command-name)
+ (= 0 (length command-name)))
+ (error "No command name given"))
(unless (commandp function)
(error "`%s' is not a valid command name" command-name))
- ;; Set this_command_keys to the concatenation of saved-keys and
- ;; function, followed by a RET.
(setq this-command function)
(let ((prefix-arg prefixarg))
(command-execute function 'record))
--
In general, we reserve the right to have a poor
memory--the computer, however, is supposed to
remember! Poor computer. -- Guy Lewis Steele Jr.
prev parent reply other threads:[~2012-06-02 22:07 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-05-17 14:06 bug: "C-x z" ("repeat") no longer works correctly with M-x Miles Bader
2012-05-29 14:24 ` Chong Yidong
2012-05-29 18:45 ` Aaron S. Hawley
2012-06-02 6:44 ` Chong Yidong
2012-06-02 7:45 ` Miles Bader
2012-06-02 19:21 ` bug#11506: " Stefan Monnier
[not found] ` <4DDFBCA4D529431F922887DF34538295@us.oracle.com>
[not found] ` <jwvvcj9cc32.fsf-monnier+emacs@gnu.org>
[not found] ` <702924CEED3B405D81D118DDE532C97F@us.oracle.com>
[not found] ` <jwv8vg4ctjl.fsf-monnier+emacs@gnu.org>
2012-06-04 13:47 ` Drew Adams
2012-06-02 22:07 ` Aaron S. Hawley [this message]
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='CAFw1JJ63Z=H8bVfwgF=pPdkg8b1BnjuhdhMrsVbXJYc6HoYFLA@mail.gmail.com' \
--to=aaron.s.hawley@gmail.com \
--cc=cyd@gnu.org \
--cc=emacs-devel@gnu.org \
--cc=miles@gnu.org \
/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.