From 55679336ddf8242b05e7397c472c0eb0dac26637 Mon Sep 17 00:00:00 2001 From: Gregory Heytings Date: Sat, 15 May 2021 08:52:57 +0000 Subject: [PATCH] Fix key recording bug when an input method is activated * lisp/international/quail.el (quail-add-unread-command-events): New function. (quail-start-translation, quail-start-conversion, quail-update-translation, quail-next-translation, quail-prev-translation, quail-next-translation-block, quail-prev-translation-block, quail-minibuffer-message): Use the new function (and partly revert 03e3440dbb). * src/keyboard.c (read_char): Remove the reference to quail.el. --- lisp/international/quail.el | 67 +++++++++++++++++-------------------- src/keyboard.c | 1 - 2 files changed, 30 insertions(+), 38 deletions(-) diff --git a/lisp/international/quail.el b/lisp/international/quail.el index fff06deee8..30b0353fa5 100644 --- a/lisp/international/quail.el +++ b/lisp/international/quail.el @@ -1368,6 +1368,22 @@ quail-delete-region (delete-region (overlay-start quail-overlay) (overlay-end quail-overlay)))) +(defun quail-add-unread-command-events (key &optional reset) + "Add KEY to `unread-command-events'. +When KEY is a character, it is prepended to `unread-command-events' as a +cons with a no-record car. +When KEY is a vector, its elements are prepended to `unread-command-events' +as conses with a no-record car. +When RESET is non-nil, the events in `unread-command-events' are first +discarded." + (if reset (setq unread-command-events nil)) + (setq unread-command-events + (if (characterp key) + (cons (cons 'no-record key) unread-command-events) + (append (mapcan (lambda (e) (list (cons 'no-record e))) + (append key nil)) + unread-command-events)))) + (defun quail-start-translation (key) "Start translation of the typed character KEY by the current Quail package. Return the input string." @@ -1385,13 +1401,11 @@ quail-start-translation ;; (generated-events nil) ;FIXME: What is this? (input-method-function nil) (modified-p (buffer-modified-p)) - last-command-event last-command this-command inhibit-record) + last-command-event last-command this-command) (setq quail-current-key "" quail-current-str "" quail-translating t) - (if key - (setq unread-command-events (cons key unread-command-events) - inhibit-record t)) + (if key (quail-add-unread-command-events key)) (while quail-translating (set-buffer-modified-p modified-p) (quail-show-guidance) @@ -1400,13 +1414,8 @@ quail-start-translation (or input-method-previous-message "") quail-current-str quail-guidance-str))) - ;; We inhibit record_char only for the first key, - ;; because it was already recorded before read_char - ;; called quail-input-method. - (inhibit--record-char inhibit-record) (keyseq (read-key-sequence prompt nil nil t)) (cmd (lookup-key (quail-translation-keymap) keyseq))) - (setq inhibit-record nil) (if (if key (and (commandp cmd) (not (eq cmd 'quail-other-command))) (eq cmd 'quail-self-insert-command)) @@ -1420,9 +1429,7 @@ quail-start-translation (quail-error (message "%s" (cdr err)) (beep)))) ;; KEYSEQ is not defined in the translation keymap. ;; Let's return the event(s) to the caller. - (setq unread-command-events - (append (this-single-command-raw-keys) - unread-command-events)) + (quail-add-unread-command-events (this-single-command-raw-keys)) (setq quail-translating nil)))) (quail-delete-region) quail-current-str) @@ -1450,15 +1457,13 @@ quail-start-conversion ;; (generated-events nil) ;FIXME: What is this? (input-method-function nil) (modified-p (buffer-modified-p)) - last-command-event last-command this-command inhibit-record) + last-command-event last-command this-command) (setq quail-current-key "" quail-current-str "" quail-translating t quail-converting t quail-conversion-str "") - (if key - (setq unread-command-events (cons key unread-command-events) - inhibit-record t)) + (if key (quail-add-unread-command-events key)) (while quail-converting (set-buffer-modified-p modified-p) (or quail-translating @@ -1474,13 +1479,8 @@ quail-start-conversion quail-conversion-str quail-current-str quail-guidance-str))) - ;; We inhibit record_char only for the first key, - ;; because it was already recorded before read_char - ;; called quail-input-method. - (inhibit--record-char inhibit-record) (keyseq (read-key-sequence prompt nil nil t)) (cmd (lookup-key (quail-conversion-keymap) keyseq))) - (setq inhibit-record nil) (if (if key (commandp cmd) (eq cmd 'quail-self-insert-command)) (progn (setq last-command-event (aref keyseq (1- (length keyseq))) @@ -1503,9 +1503,7 @@ quail-start-conversion (setq quail-converting nil))))) ;; KEYSEQ is not defined in the conversion keymap. ;; Let's return the event(s) to the caller. - (setq unread-command-events - (append (this-single-command-raw-keys) - unread-command-events)) + (quail-add-unread-command-events (this-single-command-raw-keys)) (setq quail-converting nil)))) (setq quail-translating nil) (if (overlay-start quail-conv-overlay) @@ -1551,9 +1549,8 @@ quail-update-translation (or input-method-exit-on-first-char (while (> len control-flag) (setq len (1- len)) - (setq unread-command-events - (cons (aref quail-current-key len) - unread-command-events)))))) + (quail-add-unread-command-events + (aref quail-current-key len)))))) ((null control-flag) (unless quail-current-str (setq quail-current-str @@ -1799,8 +1796,7 @@ quail-next-translation (setcar indices (1+ (car indices))) (quail-update-current-translations) (quail-update-translation nil))) - (setq unread-command-events - (cons last-command-event unread-command-events)) + (quail-add-unread-command-events last-command-event) (quail-terminate-translation))) (defun quail-prev-translation () @@ -1814,8 +1810,7 @@ quail-prev-translation (setcar indices (1- (car indices))) (quail-update-current-translations) (quail-update-translation nil))) - (setq unread-command-events - (cons last-command-event unread-command-events)) + (quail-add-unread-command-events last-command-event) (quail-terminate-translation))) (defun quail-next-translation-block () @@ -1830,8 +1825,7 @@ quail-next-translation-block (setcar indices (+ (nth 2 indices) offset)) (quail-update-current-translations) (quail-update-translation nil))) - (setq unread-command-events - (cons last-command-event unread-command-events)) + (quail-add-unread-command-events last-command-event) (quail-terminate-translation))) (defun quail-prev-translation-block () @@ -1850,8 +1844,7 @@ quail-prev-translation-block (setcar indices (+ (nth 1 indices) offset)) (quail-update-current-translations))) (quail-update-translation nil))) - (setq unread-command-events - (cons last-command-event unread-command-events)) + (quail-add-unread-command-events last-command-event) (quail-terminate-translation))) (defun quail-abort-translation () @@ -2006,8 +1999,8 @@ quail-minibuffer-message (sit-for 1000000) (delete-region point-max (point-max)) (when quit-flag - (setq quit-flag nil - unread-command-events '(7))))) + (setq quit-flag nil) + (quail-add-unread-command-events 7 t)))) (defun quail-show-guidance () "Display a guidance for Quail input method in some window. diff --git a/src/keyboard.c b/src/keyboard.c index 47b5e59024..135d6a6f50 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -3233,7 +3233,6 @@ help_char_p (Lisp_Object c) static void record_char (Lisp_Object c) { - /* quail.el binds this to avoid recording keys twice. */ if (inhibit_record_char) return; -- 2.30.2