branch: externals/pyim commit b13a2ee5c9ef64f4011b611c6191cb4648851099 Author: Feng Shu <tuma...@163.com> Commit: Feng Shu <tuma...@163.com>
Add Refresh Component. * Development.org (整体架构): Add Refresh info. * pyim-entered.el (pyim-entered-refresh-timer) (pyim-entered-backward-point, pyim-entered-backward-imelem) (pyim-entered-forward-imelem, pyim-entered-end-of-line) (pyim-entered-beginning-of-line, pyim-entered-refresh) (pyim-entered-refresh-1, pyim-entered-refresh-with-thread) (pyim-entered-refresh-timer-reset) (pyim-entered-delete-backward-char) (pyim-entered-delete-forward-char) (pyim-entered-delete-backward-imelem) (pyim-entered-delete-forward-imelem): Removed. * pyim-liberime.el (pyim-select-word:rime): Use pyim-refresh. * pyim-refresh.el (pyim-refresh-timer, pyim-refresh) (pyim-refresh-1, pyim-refresh-with-thread) (pyim-refresh-timer-reset): New file. * pyim.el (pyim-self-insert-command, pyim-terminate-translation) (pyim-select-word:pinyin, pyim-select-word:xingma) (pyim-toggle-assistant-scheme): use pyim-refresh-* (pyim-entered-forward-point, pyim-entered-backward-point) (pyim-entered-backward-imelem, pyim-entered-forward-imelem) (pyim-entered-end-of-line, pyim-entered-beginning-of-line) (pyim-entered-delete-backward-char) (pyim-entered-delete-forward-char) (pyim-entered-delete-backward-imelem) (pyim-entered-delete-forward-imelem): Move from pyim-entered.el --- Development.org | 34 +++++----- pyim-entered.el | 197 ------------------------------------------------------- pyim-liberime.el | 2 +- pyim-refresh.el | 156 +++++++++++++++++++++++++++++++++++++++++++ pyim.el | 85 ++++++++++++++++++++++-- 5 files changed, 254 insertions(+), 220 deletions(-) diff --git a/Development.org b/Development.org index 5239d7b..8324dd1 100644 --- a/Development.org +++ b/Development.org @@ -3,22 +3,22 @@ * 整体架构 #+begin_example ------------------------------------------------------------------------------------------------ -| 用户命令层: Pyim 用户命令,Entered 用户命令 | | -| Cregexp 用户命令,Cstring 用户命令 | | -| Dict 管理命令,标点用户命令,Pymap 管理命令 | | --------------------------------------------------------------------| | -| PYIM流程层: Entered, Outcome | PYIM 视图层:Page, Preview | | --------------------------------------------------------------------| | -| PYIM组件层: Imobjs, Codes, Candidates, Punctuations | Scheme | -| Cregexp, Cstring, Probe, Autoselector | Assistant-scheme | -| Pinyin | Common | -|------------------------------------------------------------------| | -| 词库缓存接口层: Dcache | | --------------------------------------------------------------------| | -| 词库缓存实现层: Dregcache, Dhashcache | | --------------------------------------------------------------------| | -| 词库文件层: Dict, Pymap | | -----------------------------------------------------------------------------------------------| ++------------------+------------------------------------------------------------------+--------------------------+ +| 用户命令层: | Pyim 用户命令,Entered 用户命令 | | +| | Cregexp 用户命令,Cstring 用户命令 | | +| | Dict 管理命令,标点用户命令,Pymap 管理命令 | | ++------------------+-----------------------------------------+------------------------+ | +| PYIM 流程层: | Refresh, Outcome | PYIM 视图组件: | | ++------------------+-----------------------------------------| | | +| PYIM 组件层: | Entered, Imobjs, Codes, Candidates, | Page, Preview | Scheme | +| | Punctuations, Cregexp, Cstring, Probe, | | Assistant-scheme | +| | Autoselector, Pinyin | | Common | ++------------------+-----------------------------------------+------------------------+ | +| | 词库缓存接口层: Dcache | | +| PYIM 持久化层 |------------------------------------------------------------------+ | +| | 词库缓存实现层: Dregcache, Dhashcache | | ++------------------+------------------------------------------------------------------+ | +| 词库文件层: | Dict, Pymap | | ++------------------+------------------------------------------------------------------+--------------------------+ #+end_example diff --git a/pyim-entered.el b/pyim-entered.el index 03fc09d..4bc63ec 100644 --- a/pyim-entered.el +++ b/pyim-entered.el @@ -43,9 +43,6 @@ (defvar pyim-entered--exhibit-timer nil) -(defvar pyim-entered-refresh-timer nil - "异步处理 intered 时时,使用的 timer.") - (defvar pyim-entered-buffer " *pyim-entered-buffer*" "一个 buffer,用来处理用户已经输入的字符串: entered。 @@ -94,53 +91,6 @@ TYPE 取值为 point-after, 返回 entered buffer 中 point 之后的字符 (pyim-with-entered-buffer (erase-buffer))) -;; pyim-entered-buffer 中进行光标移动的函数 -;; point move function in `pyim-entered-buffer' -(defun pyim-entered-forward-point () - "`pyim-entered-buffer' 中光标前移" - (interactive) - (pyim-with-entered-buffer - (ignore-errors - (forward-char))) - (pyim-entered-refresh t)) - -(defun pyim-entered-backward-point () - "`pyim-entered-buffer' 中光标后移" - (interactive) - (pyim-with-entered-buffer - (ignore-errors - (backward-char))) - (pyim-entered-refresh t)) - -(defun pyim-entered-backward-imelem (&optional search-forward) - "`pyim-entered-buffer’ 中光标向后移动一个 imelem 对应的字符串 - -在全拼输入法中,就是向前移动一个拼音" - (interactive) - (let* ((position (pyim-entered-next-imelem-position 1 search-forward))) - (pyim-with-entered-buffer - (goto-char position)) - (pyim-entered-refresh t))) - -(defun pyim-entered-forward-imelem () - "`pyim-entered-buffer’ 中光标向前移动一个 imelem 对应的字符串" - (interactive) - (pyim-entered-backward-imelem t)) - -(defun pyim-entered-end-of-line () - "`pyim-entered-buffer' 中光标移至行尾" - (interactive) - (pyim-with-entered-buffer - (end-of-line)) - (pyim-entered-refresh t)) - -(defun pyim-entered-beginning-of-line () - "`pyim-entered-buffer' 中光标移至行首" - (interactive) - (pyim-with-entered-buffer - (beginning-of-line)) - (pyim-entered-refresh t)) - (defun pyim-entered-next-imelem-position (num &optional search-forward start) "从 `pyim-entered-buffer' 的当前位置,找到下一个或者下 NUM 个 imelem 对应的位置 @@ -174,153 +124,6 @@ TYPE 取值为 point-after, 返回 entered buffer 中 point 之后的字符 (cl-decf pos))))) end-position))) -(declare-function pyim-terminate-translation "pyim") - -(defun pyim-entered-refresh (&optional no-delay) - "延迟 `pyim-entered-exhibit-delay-ms' 显示备选词等待用户选择。" - (if (= (length (pyim-entered-get 'point-before)) 0) - (pyim-terminate-translation) - (when pyim-entered--exhibit-timer - (cancel-timer pyim-entered--exhibit-timer)) - (cond - ((or no-delay - (not pyim-entered-exhibit-delay-ms) - (eq pyim-entered-exhibit-delay-ms 0)) - (pyim-entered-refresh-1)) - (t (setq pyim-entered--exhibit-timer - (run-with-timer (/ pyim-entered-exhibit-delay-ms 1000.0) - nil - #'pyim-entered-refresh-1)))))) - -;; 没有这一行,native-compilation 会出现奇怪的问题,pyim-outcome-handle 会获取到 -;; 错误的 pyim-candidates 取值。原因未知。 -(defvar pyim-candidates) - -(defun pyim-entered-refresh-1 () - "查询 `pyim-entered-buffer' 光标前的拼音字符串(如果光标在行首则为光标后的), 显示备选词等待用户选择。" - (let* ((scheme-name (pyim-scheme-name)) - entered-to-translate) - (setq entered-to-translate - (pyim-entered-get 'point-before)) - (setq pyim-imobjs (pyim-imobjs-create entered-to-translate scheme-name)) - (setq pyim-candidates - (or (delete-dups (pyim-candidates-create pyim-imobjs scheme-name)) - (list entered-to-translate))) - (pyim-entered-refresh-timer-reset) - ;; 延迟1秒异步处理 entered, pyim 内置的输入法目前不使用异步获取 - ;; 词条的方式,主要用于 pyim-liberime 支持。 - (setq pyim-entered-refresh-timer - (run-with-timer - 1 nil - (lambda () - (if (functionp 'make-thread) - (make-thread #'pyim-entered-refresh-with-thread - "pyim-entered-refresh-with-thread") - (pyim-entered-refresh-with-thread))))) - ;; 自动上屏功能 - (let ((autoselector-results - (mapcar (lambda (x) - (when (functionp x) - (ignore-errors - (funcall x)))) - (cl-remove-duplicates pyim-autoselector :from-end t))) - result) - (cond - ;; 假如用户输入 "nihao", 然后按了 "m" 键, 那么当前的 entered - ;; 就是"nihaom", 如果 autoselector 返回 list: (:select last), - ;; 那么,“nihao” 对应的第一个候选词将上屏,m键下一轮继续处理。 - ;; 这是一种 "踩雷确认模式". - ((and - ;; autoselector 功能会影响手动连续选择功能,所以这里做了一些限制, - ;; 只有在输入的时候才能够触发 autoselector 机制。 - (eq this-command 'pyim-self-insert-command) - (cl-find-if (lambda (x) - (setq result x) - (equal (plist-get x :select) 'last)) - autoselector-results)) - (let* ((str (plist-get result :replace-with)) - (pyim-candidates - (if (and str (stringp str)) - (list str) - pyim-candidates-last))) - (pyim-outcome-handle 'candidate)) - ;; autoselector 机制已经触发的时候,如果发现 entered buffer 中 - ;; point 后面还有未处理的输入,就将其转到下一轮处理,这种情况 - ;; 很少出现,一般是型码输入法,entered 编辑的时候有可能触发。 - (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: - ;; (:select current), 那么就直接将 "nihao" 对应的第一个候选词 - ;; 上屏幕。 - ((and (eq this-command 'pyim-self-insert-command) - (cl-find-if (lambda (x) - (setq result x) - (equal (plist-get x :select) 'current)) - autoselector-results)) - (let* ((str (plist-get result :replace-with)) - (pyim-candidates - (if (and str (stringp str)) - (list str) - pyim-candidates))) - (pyim-outcome-handle 'candidate)) - (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) - (pyim-page-refresh)))))) - -(defun pyim-entered-refresh-with-thread () - "Function used by `pyim-entered-refresh-timer'" - (let* ((scheme-name (pyim-scheme-name)) - (words (delete-dups (pyim-candidates-create pyim-imobjs scheme-name t)))) - (when words - (setq pyim-candidates words) - (pyim-preview-refresh) - ;; NEED HELP: 目前只有 posframe 和 minibufer 可以正确处理异步刷新 page - (when (and (member pyim-page-tooltip '(posframe minibuffer)) - (not (eq (selected-window) (minibuffer-window)))) - (pyim-page-refresh))))) - -(defun pyim-entered-refresh-timer-reset () - "Reset `pyim-entered-refresh-timer'." - (when pyim-entered-refresh-timer - (cancel-timer pyim-entered-refresh-timer) - (setq pyim-entered-refresh-timer nil))) - -;; ** 与拼音输入相关的用户命令 -(defun pyim-entered-delete-backward-char (&optional n) - "在pyim-entered-buffer中向后删除1个字符" - (interactive) - (pyim-with-entered-buffer - (ignore-errors - (delete-char (- 0 (or n 1))))) - (if (> (length (pyim-entered-get 'point-before)) 0) - (pyim-entered-refresh t) - (pyim-outcome-handle "") - (pyim-terminate-translation))) - -(defun pyim-entered-delete-forward-char () - "在pyim-entered-buffer中向前删除1个字符" - (interactive) - (pyim-entered-delete-backward-char -1)) - -(defun pyim-entered-delete-backward-imelem (&optional search-forward) - "`pyim-entered-buffer’ 中向后删除一个 imelem 对应的字符串" - (interactive) - (let ((position (pyim-entered-next-imelem-position 1 search-forward))) - (pyim-with-entered-buffer - (delete-region (point) position)) - (pyim-entered-refresh t))) - -(defun pyim-entered-delete-forward-imelem () - "`pyim-entered-buffer’ 中向前删除一个 imelem 对应的字符串" - (interactive) - (pyim-entered-delete-backward-imelem t)) - ;; * Footer (provide 'pyim-entered) diff --git a/pyim-liberime.el b/pyim-liberime.el index cdefbba..9e89d20 100644 --- a/pyim-liberime.el +++ b/pyim-liberime.el @@ -156,7 +156,7 @@ (delete-region (point-min) (point)) (insert to-be-translated) (goto-char (point-max))) - (pyim-entered-refresh)) + (pyim-refresh)) ;; 在 rime 后端造词和调整瓷瓶词频 (pyim-liberime-create-word (reverse pyim-liberime-code-log) diff --git a/pyim-refresh.el b/pyim-refresh.el new file mode 100644 index 0000000..571f3a4 --- /dev/null +++ b/pyim-refresh.el @@ -0,0 +1,156 @@ +;;; pyim-refresh.el --- Refresh function of pyim. -*- lexical-binding: t; -*- + +;; * Header +;; Copyright (C) 2021 Free Software Foundation, Inc. + +;; Author: Feng Shu <tuma...@163.com> +;; Maintainer: Feng Shu <tuma...@163.com> +;; URL: https://github.com/tumashu/pyim +;; Keywords: convenience, Chinese, pinyin, input-method + +;; This file is part of GNU Emacs. + +;; 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 3 of the License, or +;; (at your option) any later version. + +;; 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. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: + +;;; Code: +;; * 代码 :code: +(require 'cl-lib) +(require 'pyim-common) + +(defvar pyim-refresh-timer nil + "异步处理 intered 时时,使用的 timer.") + +(declare-function pyim-terminate-translation "pyim") + +(defun pyim-refresh (&optional no-delay) + "延迟 `pyim-entered-exhibit-delay-ms' 显示备选词等待用户选择。" + (if (= (length (pyim-entered-get 'point-before)) 0) + (pyim-terminate-translation) + (when pyim-entered--exhibit-timer + (cancel-timer pyim-entered--exhibit-timer)) + (cond + ((or no-delay + (not pyim-entered-exhibit-delay-ms) + (eq pyim-entered-exhibit-delay-ms 0)) + (pyim-refresh-1)) + (t (setq pyim-entered--exhibit-timer + (run-with-timer (/ pyim-entered-exhibit-delay-ms 1000.0) + nil + #'pyim-refresh-1)))))) + +;; 没有这一行,native-compilation 会出现奇怪的问题,pyim-outcome-handle 会获取到 +;; 错误的 pyim-candidates 取值。原因未知。 +(defvar pyim-candidates) + +(defun pyim-refresh-1 () + "查询 `pyim-entered-buffer' 光标前的拼音字符串(如果光标在行首则为光标后的), 显示备选词等待用户选择。" + (let* ((scheme-name (pyim-scheme-name)) + entered-to-translate) + (setq entered-to-translate + (pyim-entered-get 'point-before)) + (setq pyim-imobjs (pyim-imobjs-create entered-to-translate scheme-name)) + (setq pyim-candidates + (or (delete-dups (pyim-candidates-create pyim-imobjs scheme-name)) + (list entered-to-translate))) + (pyim-refresh-timer-reset) + ;; 延迟1秒异步处理 entered, pyim 内置的输入法目前不使用异步获取 + ;; 词条的方式,主要用于 pyim-liberime 支持。 + (setq pyim-refresh-timer + (run-with-timer + 1 nil + (lambda () + (if (functionp 'make-thread) + (make-thread #'pyim-refresh-with-thread + "pyim-refresh-with-thread") + (pyim-refresh-with-thread))))) + ;; 自动上屏功能 + (let ((autoselector-results + (mapcar (lambda (x) + (when (functionp x) + (ignore-errors + (funcall x)))) + (cl-remove-duplicates pyim-autoselector :from-end t))) + result) + (cond + ;; 假如用户输入 "nihao", 然后按了 "m" 键, 那么当前的 entered + ;; 就是"nihaom", 如果 autoselector 返回 list: (:select last), + ;; 那么,“nihao” 对应的第一个候选词将上屏,m键下一轮继续处理。 + ;; 这是一种 "踩雷确认模式". + ((and + ;; autoselector 功能会影响手动连续选择功能,所以这里做了一些限制, + ;; 只有在输入的时候才能够触发 autoselector 机制。 + (eq this-command 'pyim-self-insert-command) + (cl-find-if (lambda (x) + (setq result x) + (equal (plist-get x :select) 'last)) + autoselector-results)) + (let* ((str (plist-get result :replace-with)) + (pyim-candidates + (if (and str (stringp str)) + (list str) + pyim-candidates-last))) + (pyim-outcome-handle 'candidate)) + ;; autoselector 机制已经触发的时候,如果发现 entered buffer 中 + ;; point 后面还有未处理的输入,就将其转到下一轮处理,这种情况 + ;; 很少出现,一般是型码输入法,entered 编辑的时候有可能触发。 + (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: + ;; (:select current), 那么就直接将 "nihao" 对应的第一个候选词 + ;; 上屏幕。 + ((and (eq this-command 'pyim-self-insert-command) + (cl-find-if (lambda (x) + (setq result x) + (equal (plist-get x :select) 'current)) + autoselector-results)) + (let* ((str (plist-get result :replace-with)) + (pyim-candidates + (if (and str (stringp str)) + (list str) + pyim-candidates))) + (pyim-outcome-handle 'candidate)) + (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) + (pyim-page-refresh)))))) + +(defun pyim-refresh-with-thread () + "Function used by `pyim-refresh-timer'" + (let* ((scheme-name (pyim-scheme-name)) + (words (delete-dups (pyim-candidates-create pyim-imobjs scheme-name t)))) + (when words + (setq pyim-candidates words) + (pyim-preview-refresh) + ;; NEED HELP: 目前只有 posframe 和 minibufer 可以正确处理异步刷新 page + (when (and (member pyim-page-tooltip '(posframe minibuffer)) + (not (eq (selected-window) (minibuffer-window)))) + (pyim-page-refresh))))) + +(defun pyim-refresh-timer-reset () + "Reset `pyim-refresh-timer'." + (when pyim-refresh-timer + (cancel-timer pyim-refresh-timer) + (setq pyim-refresh-timer nil))) + +;; * Footer +(provide 'pyim-refresh) + +;;; pyim-refresh.el ends here diff --git a/pyim.el b/pyim.el index b7dee79..7c3ef99 100644 --- a/pyim.el +++ b/pyim.el @@ -380,7 +380,7 @@ REFRESH-COMMON-DCACHE 已经废弃,不要再使用了。" ;; 一定要注意,point 可能不在 point-min, 或者 point-max. 因为用 ;; 户可能通过命令移动了 entered 中的 point。 (insert (char-to-string last-command-event))) - (pyim-entered-refresh)) + (pyim-refresh)) (pyim-candidates (pyim-outcome-handle 'candidate-and-last-char) (pyim-terminate-translation)) @@ -430,7 +430,7 @@ REFRESH-COMMON-DCACHE 已经废弃,不要再使用了。" (pyim-page-hide) (pyim-entered-erase-buffer) (setq pyim-cstring-to-code-criteria nil) - (pyim-entered-refresh-timer-reset) + (pyim-refresh-timer-reset) (let* ((class (pyim-scheme-get-option (pyim-scheme-name) :class)) (func (intern (format "pyim-terminate-translation:%S" class)))) (when (and class (functionp func)) @@ -656,7 +656,7 @@ FILE 的格式与 `pyim-dcache-export' 生成的文件格式相同, ;; 一轮处理时的“光标前字符串”比较长,这种方式可能比逐字选 ;; 择更加好用。 (goto-char (pyim-entered-next-imelem-position 20 t 1))) - (pyim-entered-refresh)) + (pyim-refresh)) ;; pyim 词频调整策略: ;; 1. 如果一个词条是用户在输入过程中,自己新建的词条,那么就将这个词条 ;; 添加到个人词库的后面(不放置前面是为了减少误输词条的影响)。 @@ -684,7 +684,7 @@ FILE 的格式与 `pyim-dcache-export' 生成的文件格式相同, ;; 把本次已经选择的词条对应的子 entered, 从 entered ;; 字符串里面剪掉。 (delete-region (point-min) (point))) - (pyim-entered-refresh)) + (pyim-refresh)) ;; 型码输入法,只考虑将词条保存到个人词库,用于调整词频,单字不保存。 (when (> (length (pyim-outcome-get)) 1) (if (member (pyim-outcome-get) pyim-candidates) @@ -758,7 +758,82 @@ FILE 的格式与 `pyim-dcache-export' 生成的文件格式相同, (pyim-terminate-translation)) (setq pyim-assistant-scheme-enable (not pyim-assistant-scheme-enable)) - (pyim-entered-refresh))) + (pyim-refresh))) + +;; ** 在 entered 中操作的相关命令 +(defun pyim-entered-forward-point () + "`pyim-entered-buffer' 中光标前移" + (interactive) + (pyim-with-entered-buffer + (ignore-errors + (forward-char))) + (pyim-refresh t)) + +(defun pyim-entered-backward-point () + "`pyim-entered-buffer' 中光标后移" + (interactive) + (pyim-with-entered-buffer + (ignore-errors + (backward-char))) + (pyim-refresh t)) + +(defun pyim-entered-backward-imelem (&optional search-forward) + "`pyim-entered-buffer’ 中光标向后移动一个 imelem 对应的字符串 + +在全拼输入法中,就是向前移动一个拼音" + (interactive) + (let* ((position (pyim-entered-next-imelem-position 1 search-forward))) + (pyim-with-entered-buffer + (goto-char position)) + (pyim-refresh t))) + +(defun pyim-entered-forward-imelem () + "`pyim-entered-buffer’ 中光标向前移动一个 imelem 对应的字符串" + (interactive) + (pyim-entered-backward-imelem t)) + +(defun pyim-entered-end-of-line () + "`pyim-entered-buffer' 中光标移至行尾" + (interactive) + (pyim-with-entered-buffer + (end-of-line)) + (pyim-refresh t)) + +(defun pyim-entered-beginning-of-line () + "`pyim-entered-buffer' 中光标移至行首" + (interactive) + (pyim-with-entered-buffer + (beginning-of-line)) + (pyim-refresh t)) + +(defun pyim-entered-delete-backward-char (&optional n) + "在pyim-entered-buffer中向后删除1个字符" + (interactive) + (pyim-with-entered-buffer + (ignore-errors + (delete-char (- 0 (or n 1))))) + (if (> (length (pyim-entered-get 'point-before)) 0) + (pyim-refresh t) + (pyim-outcome-handle "") + (pyim-terminate-translation))) + +(defun pyim-entered-delete-forward-char () + "在pyim-entered-buffer中向前删除1个字符" + (interactive) + (pyim-entered-delete-backward-char -1)) + +(defun pyim-entered-delete-backward-imelem (&optional search-forward) + "`pyim-entered-buffer’ 中向后删除一个 imelem 对应的字符串" + (interactive) + (let ((position (pyim-entered-next-imelem-position 1 search-forward))) + (pyim-with-entered-buffer + (delete-region (point) position)) + (pyim-refresh t))) + +(defun pyim-entered-delete-forward-imelem () + "`pyim-entered-buffer’ 中向前删除一个 imelem 对应的字符串" + (interactive) + (pyim-entered-delete-backward-imelem t)) ;; ** 金手指功能 ;;;###autoload