X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/9877d20507782ef29cfa350b0c72ec58a3b8b9f6..25d2f683b3e5c624f23fb395fcf96e7c3b21a03e:/lisp/repeat.el diff --git a/lisp/repeat.el b/lisp/repeat.el index cc31a70d93..667303076d 100644 --- a/lisp/repeat.el +++ b/lisp/repeat.el @@ -9,12 +9,12 @@ ;; This file is part of GNU Emacs. -;; This program is free software; you can redistribute it and/or modify +;; GNU Emacs is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. -;; This program is distributed in the hope that it will be useful, +;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. @@ -271,16 +271,20 @@ can be modified by the global variable `repeat-on-final-keystroke'." ;; includes that many copies of the same character. ;; So use just the first character ;; and repeat it the right number of times. - (setq insertion (substring insertion 0 1)) + (setq insertion (substring insertion -1)) (let ((count (prefix-numeric-value repeat-arg)) (i 0)) (while (< i count) (repeat-self-insert insertion) (setq i (1+ i))))) - (if (or (stringp real-last-command) - (vectorp real-last-command)) - (execute-kbd-macro real-last-command) - (call-interactively real-last-command)))) + (let ((indirect (indirect-function real-last-command))) + (if (or (stringp indirect) + (vectorp indirect)) + ;; Bind real-last-command so that executing the macro + ;; does not alter it. + (let ((real-last-command real-last-command)) + (execute-kbd-macro real-last-command)) + (call-interactively real-last-command))))) (when repeat-repeat-char ;; A simple recursion here gets into trouble with max-lisp-eval-depth ;; on long sequences of repetitions of a command like `forward-word'