[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debbugs-tracker] bug#14095: closed (24.3.50; REGRESSION: `repeat' broke

From: GNU bug Tracking System
Subject: [debbugs-tracker] bug#14095: closed (24.3.50; REGRESSION: `repeat' broken by use of `set-temporary-overlay-map')
Date: Thu, 13 Jun 2013 22:34:02 +0000

Your message dated Thu, 13 Jun 2013 16:44:15 -0400
with message-id <address@hidden>
and subject line Re: bug#14095: 24.3.50; REGRESSION: `repeat' broken by use of 
has caused the debbugs.gnu.org bug report #14095,
regarding 24.3.50; REGRESSION: `repeat' broken by use of 
to be marked as done.

(If you believe you have received this mail in error, please contact

14095: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=14095
GNU Bug Tracking System
Contact address@hidden with problems
--- Begin Message --- Subject: 24.3.50; REGRESSION: `repeat' broken by use of `set-temporary-overlay-map' Date: Sat, 30 Mar 2013 10:13:21 -0700
I believe this regression was introduced at the same time as the
regression of bug #12232 (which has been fixed).  The change that
introduced this problem was to use `set-temporary-overlay-map'.
The code for `repeat' before that change, e.g. the code from Emacs 23.4,
had this:
(when repeat-repeat-char
  (let (repeat-on-final-keystroke
        (undo-inhibit-record-point t))
    (setq real-last-command 'repeat)
    (setq repeat-undo-count 1)
        (while (let ((evt (read-key)))
                 (eq (or (car-safe evt) evt)
                     (or (car-safe repeat-repeat-char)
          (repeat repeat-arg))
      ;; Make sure `repeat-undo-count' is reset.
      (setq repeat-undo-count nil))
    (setq unread-command-events (list last-input-event))))
That was changed to this (the current code):
(when repeat-repeat-char
  (set-temporary-overlay-map ; <===================
   (let ((map (make-sparse-keymap)))
     (define-key map (vector repeat-repeat-char)
       (if (null repeat-message-function) 'repeat
         (let ((fun repeat-message-function))
           (lambda ()
             (let ((repeat-message-function fun))
               (setq this-command 'repeat)
               (setq real-this-command 'repeat)
               (call-interactively 'repeat))))))
This change breaks the use of `repeat' in the following context, because
Isearch uses `overriding-terminal-local-map'.  Recipe:
emacs -Q

(defun isearchp-yank-line ()
    "Yank text from buffer up to end of line onto search string.
You can repeat this by hitting the last key again..."
    (require 'repeat nil t)
    (isearchp-repeat-command 'isearch-yank-line))

(defun isearchp-repeat-command (command)
  "Repeat COMMAND."
  (let ((repeat-message-function  'ignore))
    (setq last-repeatable-command  command)
    (repeat nil)))

(define-key isearch-mode-map (kbd "C-y C-e")
C-s  C-y  C-e  C-e  C-e
That works if the old definition of `repeat' is used.  It does not work
with the new definition, which uses `set-temporary-overlay-map', because
the temporary map is overruled by `overriding(-terminal)-local-map'.
Users should be able to use `repeat' in contexts such as this.  For
Isearch, for example, this lets you put multiple yank commands on the
same prefix key (e.g., `C-y').
For instance, I bind 8 yank commands to prefix C-y, 5 of which are
repeatable (i.e., they are repeatable in Emacs 22-23 and should also
be repeatable in later releases):
 C-y C-_   isearchp-yank-symbol-or-char
 C-y C-(   isearchp-yank-sexp-symbol-or-char
 C-y C-2   isearch-yank-secondary
 C-y C-c   isearchp-yank-char
 C-y C-e   isearchp-yank-line
 C-y C-w   isearchp-yank-word-or-char
 C-y C-y   isearch-yank-kill
 C-y M-y   isearch-yank-pop
(FWIW/FYI: It took me quite a while to figure out why this was not working.)

In GNU Emacs (i386-mingw-nt5.1.2600)
 of 2013-03-23 on VBOX
Bzr revision: 112115 address@hidden
Windowing system distributor `Microsoft Corp.', version 5.1.2600
Configured using:
 `configure --with-gcc (4.7) --no-opt --enable-checking --cflags
 -IC:/emacs/libs/libXpm-3.5.10/include -IC:/emacs/libs/libXpm-3.5.10/src

--- End Message ---
--- Begin Message --- Subject: Re: bug#14095: 24.3.50; REGRESSION: `repeat' broken by use of `set-temporary-overlay-map' Date: Thu, 13 Jun 2013 16:44:15 -0400 User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3.50 (gnu/linux)
> C-s  C-y  C-e  C-e  C-e
> That works if the old definition of `repeat' is used.  It does not work

This should work now, thank you,


--- End Message ---

reply via email to

[Prev in Thread] Current Thread [Next in Thread]