diff options
author | Stefan Monnier <monnier@iro.umontreal.ca> | 2019-12-20 17:34:38 -0500 |
---|---|---|
committer | Stefan Monnier <monnier@iro.umontreal.ca> | 2019-12-20 17:34:38 -0500 |
commit | 0f7e3430bba031a6c5f45e0afe2ddcac197603cf (patch) | |
tree | 34c14495d9e17d4a674bb57563980c507084b47f /lisp | |
parent | 2c8f1539ab0a2d8b6b2bb9982249c5aa2dbd27b1 (diff) | |
download | emacs-0f7e3430bba031a6c5f45e0afe2ddcac197603cf.tar.gz |
* 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.
Diffstat (limited to 'lisp')
-rw-r--r-- | lisp/international/mule-cmds.el | 39 |
1 files changed, 18 insertions, 21 deletions
diff --git a/lisp/international/mule-cmds.el b/lisp/international/mule-cmds.el index e4f5bb2a5f0..0a8a4aa6610 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)))) |