[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master 0f7e343: * lisp/international/mule-cmds.el: Fix bug#38642
From: |
Stefan Monnier |
Subject: |
master 0f7e343: * lisp/international/mule-cmds.el: Fix bug#38642 |
Date: |
Fri, 20 Dec 2019 17:34:43 -0500 (EST) |
branch: master
commit 0f7e3430bba031a6c5f45e0afe2ddcac197603cf
Author: Stefan Monnier <address@hidden>
Commit: Stefan Monnier <address@hidden>
* lisp/international/mule-cmds.el: Fix bug#38642
(universal-coding-system-argument): Adjust the code to the way
`universal-argument` works nowadays. Handle `prefix-arg` a bit more
like `command_loop` does.
* test/lisp/international/mule-tests.el
(mule-cmds--test-universal-coding-system-argument): New test.
---
lisp/international/mule-cmds.el | 39 ++++++++++++++++-------------------
test/lisp/international/mule-tests.el | 8 +++++++
2 files changed, 26 insertions(+), 21 deletions(-)
diff --git a/lisp/international/mule-cmds.el b/lisp/international/mule-cmds.el
index e4f5bb2..0a8a4aa 100644
--- a/lisp/international/mule-cmds.el
+++ b/lisp/international/mule-cmds.el
@@ -295,10 +295,14 @@ wrong, use this command again to toggle back to the right
mode."
(format "Coding system for following command (default %s): "
default)
"Coding system for following command: ")
default))))
+ ;; FIXME: This "read-key-sequence + call-interactively" loop is trying to
+ ;; reproduce the normal command loop, but this "can't" be done faithfully so
+ ;; it necessarily suffers from breakage in corner cases (e.g. it fails to run
+ ;; pre/post-command-hook, doesn't properly set this-command/last-command, it
+ ;; doesn't handle keyboard macros, ...).
(let* ((keyseq (read-key-sequence
(format "Command to execute with %s:" coding-system)))
- (cmd (key-binding keyseq))
- prefix)
+ (cmd (key-binding keyseq)))
;; read-key-sequence ignores quit, so make an explicit check.
(if (equal last-input-event (nth 3 (current-input-mode)))
(keyboard-quit))
@@ -309,28 +313,21 @@ wrong, use this command again to toggle back to the right
mode."
(while (progn
(setq keyseq (read-key-sequence nil t)
cmd (key-binding keyseq t))
- (not (eq cmd 'universal-argument-other-key)))
- (let ((current-prefix-arg prefix-arg)
- ;; Have to bind `last-command-event' here so that
- ;; `digit-argument', for instance, can compute the
- ;; `prefix-arg'.
- (last-command-event (aref keyseq 0)))
- (call-interactively cmd)))
-
- ;; This is the final call to `universal-argument-other-key', which
- ;; sets the final `prefix-arg'.
- (let ((current-prefix-arg prefix-arg))
- (call-interactively cmd))
-
- ;; Read the command to execute with the given `prefix-arg'.
- (setq prefix prefix-arg
- keyseq (read-key-sequence nil t)
- cmd (key-binding keyseq)))
+ (memq cmd '(negative-argument digit-argument
+ universal-argument-more)))
+ (setq current-prefix-arg prefix-arg prefix-arg nil)
+ ;; Have to bind `last-command-event' here so that
+ ;; `digit-argument', for instance, can compute the
+ ;; `prefix-arg'.
+ (setq last-command-event (aref keyseq 0))
+ (call-interactively cmd)))
(let ((coding-system-for-read coding-system)
(coding-system-for-write coding-system)
- (coding-system-require-warning t)
- (current-prefix-arg prefix))
+ (coding-system-require-warning t))
+ (setq current-prefix-arg prefix-arg prefix-arg nil)
+ ;; Have to bind `last-command-event' e.g. for `self-insert-command'.
+ (setq last-command-event (aref keyseq 0))
(message "")
(call-interactively cmd))))
diff --git a/test/lisp/international/mule-tests.el
b/test/lisp/international/mule-tests.el
index 678cbc2..881d92a 100644
--- a/test/lisp/international/mule-tests.el
+++ b/test/lisp/international/mule-tests.el
@@ -40,6 +40,14 @@
(should (equal (encode-coding-char ?a 'ebcdic-int) "\201"))
(should (not (multibyte-string-p (encode-coding-char ?a 'utf-8)))))
+(ert-deftest mule-cmds--test-universal-coding-system-argument ()
+ (skip-unless (not noninteractive))
+ (should (equal "ccccccccccccccccab"
+ (let ((enable-recursive-minibuffers t)
+ (unread-command-events
+ (append (kbd "C-x RET c u t f - 8 RET C-u C-u c a b
RET") nil)))
+ (read-string "prompt:")))))
+
;; Stop "Local Variables" above causing confusion when visiting this file.
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- master 0f7e343: * lisp/international/mule-cmds.el: Fix bug#38642,
Stefan Monnier <=