unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#3938: 23.0.96; regression: minibuffer-message interferes with C-u
@ 2009-07-26 23:30 Drew Adams
  0 siblings, 0 replies; 2+ messages in thread
From: Drew Adams @ 2009-07-26 23:30 UTC (permalink / raw)
  To: emacs-pretest-bug

emacs -Q
 
Eval these:

(defun test-univ-arg ()
  (interactive)
  (setq prefix-arg                     (list 4)
        universal-argument-num-events  (length (this-command-keys)))
  (minibuffer-message "FOO") ; NO GOOD. OK ONLY IF THIS IS REMOVED
  (ensure-overriding-map-is-bound))
 
(defun test2 () (interactive) (describe-function '+))
 
(define-key minibuffer-local-completion-map "\C-f" 'test2)
(define-key minibuffer-local-completion-map
  (vector 'remap 'universal-argument) 'test-univ-arg)
 
Note that the definition of `test-univ-arg' is identical to the
definition of `universal-argument', except for the addition of the
call to `minibuffer-message'.


1. Now do this, without waiting for the 2-sec delay after C-u.
That is, hit C-f immediately after C-u.
 
M-x C-u C-f
 
2. Now do `M-x C-u C-f' again, this time waiting for the delay,
so the minibuffer message `FOO' is no longer displayed, before
hitting `C-f'.
 
#2 has the correct behavior: the input event `C-f' interrupts the
minibuffer message and immediately executes the `C-f' command (the
particular command used is immaterial; I use `describe-function'
just to easily see whether it is executed).
 
In Emacs 23, #1 has this incorrect effect: After C-u, the minibuffer
message FOO is erased, but the `C-f' is not picked up. You must
repeat `C-f' a second time, to get it to be picked up.

Note that if you hit C-f twice even very quickly, then the second
`C-f' is picked up (but not the first). IOW, the problem doesn't
seem to be that the delay has not passed. It seems to be that
only the first input event is ignored if the delay has not
expired. It's hard to hit C-f twice quickly, so I'm not certain
about this, but it seems to be the case.

In Emacs prior to Emacs 23, #1 also had the correct behavior of #2.
IOW, this is a regression.


In GNU Emacs 23.0.96.1 (i386-mingw-nt5.1.2600)
 of 2009-07-09 on SOFT-MJASON
Windowing system distributor `Microsoft Corp.', version 5.1.2600
configured using `configure --with-gcc (3.4)'
 






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

* bug#3938: 23.0.96; regression: minibuffer-message interferes with C-u
@ 2009-08-03  5:14 Drew Adams
  0 siblings, 0 replies; 2+ messages in thread
From: Drew Adams @ 2009-08-03  5:14 UTC (permalink / raw)
  To: emacs-pretest-bug, 3936

Taking off the "3938-done" address, I forgot to add back the original
recipients, so this would get to the bug list. So here it is again, with the bug
list added back as recipient.

[It is really a shame that once someone closes a bug you can no longer just
reply to the message; you have to reopen the bug and change the recipients... I
replied, and my reply was recorded as _me_ closing the bug. What a lame UI...
And of course none of that meta-conversation was added to the bug thread, except
for a bit by Stefan, who no doubt thought to add the bug list as recipient.]

Anyway...

-----Original Message-----
From: Drew Adams Sent: Sunday, August 02, 2009 10:07 PM
To: 'Chong Yidong'
Subject: RE: bug#3938: 23.0.96; regression: minibuffer-message interferes with
C-u

> 1. That kind of thing should not be necessary. Something has 
> become overly fragile or things have become overly coupled.
> 
> I'm not "hacking universal-argument this way" or in any way - 
> I don't redefine it. I just use a different binding for `C-u' 
> and a different keymap from `universal-argument-map'. (In the 
> bug report I show that even an exact copy of that map 
> demonstrates the bug, but in my real code I do use a slightly 
> different map.)
> 
> All my code does is change the behavior of `C-u' during 
> completion very slightly, so that the prefix arg is echoed in 
> the minibuffer using `minibuffer-message'. IOW, instead of 
> echoing "FOO" as in the bug report, it shows the prefix arg. 
> In Icicles, you can perform lots of operations during 
> completion, and you can use `C-u' with those operations.
> 
> That's true for vanilla Emacs too, but it's not as often that 
> users use `C-u' when editing minibuffer text. Because `C-u' 
> is used more during completion, Icicles shows the prefix value.
> 
> 
> 2. As I mentioned, the code for `sit-for' has not changed a 
> bit between Emacs 22 and 23 (and my code works in Emacs 
> 22-21-20). Something else must have changed. There should be 
> no need to replace any of the `sit-for' code. This should not 
> be happening. There should be no need for such jumping 
> through hoops and redefining multiple things.
> 
> I appreciate the workaround advice, and I'll look into it as 
> a temporary Emacs 23 workaround. But how about fixing this 
> regression? Interrupting `sit-for' with user input should 
> never cause the full `sit-for' delay to be waited out - 
> something is amiss. `sit-for' is not `sleep-for'.

In case it helps, below is what my code really does, so you can see that I am in
no way changing the code of `universal-argument' etc. In each case, I write and
use my own function and my own keymap. The code is nearly the same as the
original, with the only real change (and the purpose) being to add a minibuffer
message that echoes the prefix arg.

I hope this regression will be fixed. Thanks.

Here you have my complete use of this, so you can better understand. Each
function is identical to the original, except in the minor ways indicated:

;; Use my map for overriding terminal local.
;; Same as the definition of `ensure-overriding-map-is-bound',
;; except for using the different map.
(defun icicle-ensure-overriding-map-is-bound ()
  (unless overriding-map-is-bound
   (setq saved-overriding-map           overriding-terminal-local-map
         overriding-terminal-local-map  icicle-universal-argument-map
         overriding-map-is-bound        t)))

;; Bound to `C-<0-9>', `M-<0-9>', `C-M-<0-9>' in minibuffer.
(defun icicle-digit-argument (arg)
  "`digit-argument', but also echo the prefix arg."
  (interactive "P")
  (let* ((char   (if (integerp last-command-char)
                     last-command-char
                   (get last-command-char 'ascii-character)))
         (digit  (- (logand char ?\177) ?0)))
    (cond ((integerp arg)
           (setq prefix-arg  (+ (* arg 10) (if (< arg 0) (- digit) digit))))
          ((eq arg '-)
           ;; Treat -0 as just -, so that -01 will work.
           (setq prefix-arg  (if (zerop digit) '- (- digit))))
          (t
           (setq prefix-arg  digit))))
  (setq universal-argument-num-events  (length (this-command-keys)))
  (icicle-ensure-overriding-map-is-bound)
  (icicle-msg-maybe-in-minibuffer "prefix %S" prefix-arg))

;; Bound to `M--', `C-M--' in minibuffer.
(defun icicle-negative-argument (arg)
  "`negative-argument', but also echo the prefix arg."
  (interactive "P")
  (cond ((integerp arg) (setq prefix-arg  (- arg)))
        ((eq arg '-) (setq prefix-arg  nil))
        (t (setq prefix-arg  '-)))
  (setq universal-argument-num-events  (length (this-command-keys)))
  (icicle-ensure-overriding-map-is-bound)
  (icicle-msg-maybe-in-minibuffer "prefix %S" prefix-arg))

; Bound to `C-u' in minibuffer.
(defun icicle-universal-argument ()
  "`universal-argument', but also echo the prefix arg."
  (interactive)
  (setq prefix-arg                     (list 4)
        universal-argument-num-events  (length (this-command-keys)))
  (icicle-ensure-overriding-map-is-bound)
  (icicle-msg-maybe-in-minibuffer "prefix %S" prefix-arg))

(defun icicle-universal-argument-more (arg)
  "`universal-argument-more', but also echo the prefix arg."
  (interactive "P")
  (universal-argument-more arg)
  (icicle-msg-maybe-in-minibuffer "prefix %S" prefix-arg))

(defun icicle-universal-argument-other-key (arg)
  "`universal-argument-other-key', but also echo the prefix."
  (interactive "P")
  (universal-argument-other-key arg)
  (icicle-msg-maybe-in-minibuffer "prefix %S" prefix-arg))

(defun icicle-universal-argument-minus (arg)
  "`universal-argument-minus', but also echo the prefix arg."
  (interactive "P")
  (universal-argument-minus arg)
  (icicle-msg-maybe-in-minibuffer "prefix %S" prefix-arg))

(defun icicle-msg-maybe-in-minibuffer (format-string &rest args)
  "Display FORMAT-STRING as a message.
If called with the minibuffer inactive, use `message'.
Otherwise, use `minibuffer-message'."
  (if (active-minibuffer-window)
      (save-selected-window
        (select-window (minibuffer-window))
        (minibuffer-message
         (apply #'format (concat "  [" format-string "]") args)))
    (apply #'message format-string args)))

;; Same code as that defining `universal-argument-map',
;; but with the above corresponding functions substituted.
(defvar icicle-universal-argument-map
  (let ((map  (make-sparse-keymap)))
    (define-key map [t] 'icicle-universal-argument-other-key)
    (define-key map (vector meta-prefix-char t)
                    'icicle-universal-argument-other-key)
    (define-key map [switch-frame] nil)
    (define-key map [?\C-u] 'icicle-universal-argument-more)
    (define-key map [?-] 'icicle-universal-argument-minus)
    (define-key map [?0] 'icicle-digit-argument)
    (define-key map [?1] 'icicle-digit-argument)
    (define-key map [?2] 'icicle-digit-argument)
    (define-key map [?3] 'icicle-digit-argument)
    (define-key map [?4] 'icicle-digit-argument)
    (define-key map [?5] 'icicle-digit-argument)
    (define-key map [?6] 'icicle-digit-argument)
    (define-key map [?7] 'icicle-digit-argument)
    (define-key map [?8] 'icicle-digit-argument)
    (define-key map [?9] 'icicle-digit-argument)
    (define-key map [kp-0] 'icicle-digit-argument)
    (define-key map [kp-1] 'icicle-digit-argument)
    (define-key map [kp-2] 'icicle-digit-argument)
    (define-key map [kp-3] 'icicle-digit-argument)
    (define-key map [kp-4] 'icicle-digit-argument)
    (define-key map [kp-5] 'icicle-digit-argument)
    (define-key map [kp-6] 'icicle-digit-argument)
    (define-key map [kp-7] 'icicle-digit-argument)
    (define-key map [kp-8] 'icicle-digit-argument)
    (define-key map [kp-9] 'icicle-digit-argument)
    (define-key map [kp-subtract] 'icicle-universal-argument-minus)
    map)
  "Keymap used while processing `C-u' during Icicles completion.")

;; Use my `C-u' during completion (only).
(define-key minibuffer-local-completion-map
            (vector 'remap 'universal-argument) 'icicle-universal-argument)

Besides this, I think that your suggested workaround has no chance of solving
the problem. The problem cannot be in `sit-for', since that code has not changed
between Emacs 22 and 23. And this bug is a regression wrt Emacs 22 (and 21,
20...).

Thanks for taking another look.






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

end of thread, other threads:[~2009-08-03  5:14 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-08-03  5:14 bug#3938: 23.0.96; regression: minibuffer-message interferes with C-u Drew Adams
  -- strict thread matches above, loose matches on Subject: below --
2009-07-26 23:30 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).