branch: externals/pyim commit 792b6a9ee9c703653a14c3b4abada097b4b25ae6 Author: Feng Shu <tuma...@163.com> Commit: Feng Shu <tuma...@163.com>
Add pyim-add-unread-command-events and use it. * pyim-common.el (pyim-add-unread-command-events): New function. * pyim.el (pyim-start-translation, pyim-convert-string-at-point): Use pyim-add-unread-command-events. * pyim-page.el (pyim-page-minibuffer-message): Use pyim-add-unread-command-events. * pyim-entered.el (pyim-entered-refresh-1): Use pyim-add-unread-command-events. (pyim-common): required. Port http://git.savannah.gnu.org/cgit/emacs.git/commit/?id=bd5c7404195e45f11946b4e0933a1f8b697d8b87 --- pyim-common.el | 23 +++++++++++++++++++++++ pyim-entered.el | 13 ++++++------- pyim-page.el | 5 ++--- pyim.el | 21 ++++++--------------- 4 files changed, 37 insertions(+), 25 deletions(-) diff --git a/pyim-common.el b/pyim-common.el index 0ef39ba..0308b3c 100644 --- a/pyim-common.el +++ b/pyim-common.el @@ -163,6 +163,29 @@ for example: https://github.com/ch11ng/exwm/pull/831" (funcall in (1- i) (1- j))))))) (funcall in l1 l2)))) +(if (fboundp 'quail-add-unread-command-events) + (defalias 'pyim-add-unread-command-events 'quail-add-unread-command-events) + (defun pyim-add-unread-command-events (key &optional reset) + "Add KEY to `unread-command-events', ensuring that it is not recorded. +If KEY is a character, it is prepended to `unread-command-events' as +a cons cell of the form (no-record . KEY). +If KEY is a vector of events, the events in the vector are prepended +to `unread-command-events', after converting each event to a cons cell +of the form (no-record . EVENT). +Quail puts keys back in `unread-command-events' to be handled again, +and when it does this these keys have already been recorded in the +recent keys and in the keyboard macro being defined, which means that +recording them again creates duplicates. +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))))) + ;; * Footer (provide 'pyim-common) diff --git a/pyim-entered.el b/pyim-entered.el index 4332152..03fc09d 100644 --- a/pyim-entered.el +++ b/pyim-entered.el @@ -28,6 +28,7 @@ ;;; Code: ;; * 代码 :code: (require 'cl-lib) +(require 'pyim-common) (defgroup pyim-entered nil "Entered tools for pyim." @@ -246,10 +247,9 @@ TYPE 取值为 point-after, 返回 entered buffer 中 point 之后的字符 ;; autoselector 机制已经触发的时候,如果发现 entered buffer 中 ;; point 后面还有未处理的输入,就将其转到下一轮处理,这种情况 ;; 很少出现,一般是型码输入法,entered 编辑的时候有可能触发。 - (setq unread-command-events - (append (listify-key-sequence (pyim-entered-get 'point-after)) - unread-command-events)) - (push last-command-event unread-command-events) + (pyim-add-unread-command-events + (listify-key-sequence (pyim-entered-get 'point-after))) + (pyim-add-unread-command-events last-command-event) (pyim-terminate-translation)) ;; 假设用户已经输入 "niha", 然后按了 "o" 键,那么,当前 ;; entered 就是 "nihao". 如果 autoselector 函数返回一个 list: @@ -266,9 +266,8 @@ TYPE 取值为 point-after, 返回 entered buffer 中 point 之后的字符 (list str) pyim-candidates))) (pyim-outcome-handle 'candidate)) - (setq unread-command-events - (append (listify-key-sequence (pyim-entered-get 'point-after)) - unread-command-events)) + (pyim-add-unread-command-events + (listify-key-sequence (pyim-entered-get 'point-after))) (pyim-terminate-translation)) (t (setq pyim-candidate-position 1) (pyim-preview-refresh) diff --git a/pyim-page.el b/pyim-page.el index 0fc3648..8d3793e 100644 --- a/pyim-page.el +++ b/pyim-page.el @@ -506,9 +506,8 @@ minibuffer 原来显示的信息和 pyim 选词框整合在一起显示 (setq point-1 (point))) (sit-for 1000000) (delete-region (point) point-1) - (when quit-flag - (setq quit-flag nil - unread-command-events '(7))))) + (setq quit-flag nil) + (pyim-add-unread-command-events 7 t))) (defun pyim-page-hide () "Hide pyim page." diff --git a/pyim.el b/pyim.el index ac1459a..b7dee79 100644 --- a/pyim.el +++ b/pyim.el @@ -236,26 +236,19 @@ Return the input string. ;; 插入 preview string, pyim *强制* 将其设置为 nil (input-method-use-echo-area nil) (modified-p (buffer-modified-p)) - last-command-event last-command this-command inhibit-record) + last-command-event last-command this-command) (setq pyim-translating t) (pyim-entered-erase-buffer) (pyim-outcome-handle "") (when key - (setq unread-command-events - (cons key unread-command-events) - inhibit-record t)) + (pyim-add-unread-command-events key)) (while pyim-translating (set-buffer-modified-p modified-p) - (let* (;; 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 nil nil nil t)) + (let* ((keyseq (read-key-sequence nil nil nil t)) (cmd (lookup-key pyim-mode-map keyseq))) - (setq inhibit-record nil) ;; (message "key: %s, cmd:%s\nlcmd: %s, lcmdv: %s, tcmd: %s" ;; key cmd last-command last-command-event this-command) (if (if key @@ -273,8 +266,7 @@ Return the input string. (beep)))) ;; KEYSEQ is not defined in the translation keymap. ;; Let's return the event(s) to the caller. - (setq unread-command-events - (string-to-list (this-single-command-raw-keys))) + (pyim-add-unread-command-events (this-single-command-raw-keys) t) ;; (message "unread-command-events: %s" unread-command-events) (pyim-terminate-translation)))) ;; (message "return: %s" (pyim-outcome-get)) @@ -840,9 +832,8 @@ FILE 的格式与 `pyim-dcache-export' 生成的文件格式相同, (delete-char (- 0 length))) (run-hooks 'pyim-convert-string-at-point-hook) (when (> length 0) - (setq unread-command-events - (append (listify-key-sequence code) - unread-command-events)) + (pyim-add-unread-command-events + (listify-key-sequence code)) (setq pyim-force-input-chinese t))) ;; 当光标前的一个字符是标点符号时,半角/全角切换。 ((pyim-string-match-p "[[:punct:]:-]" (pyim-char-before-to-string 0))