emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/pyim 92d24bca08 1/4: 支持动态选择可用的 tooltip.


From: ELPA Syncer
Subject: [elpa] externals/pyim 92d24bca08 1/4: 支持动态选择可用的 tooltip.
Date: Thu, 30 Dec 2021 04:57:49 -0500 (EST)

branch: externals/pyim
commit 92d24bca089f740c33861318eba5d90cfb07bb8d
Author: Feng Shu <tumashu@163.com>
Commit: Feng Shu <tumashu@163.com>

    支持动态选择可用的 tooltip.
    
            * pyim-page.el (pyim-page-tooltip): 支持 tooltip 列表。
            (pyim-page-tooltip-get-valid-tooltip): New function.
            (pyim-page-tooltip-show, pyim-page-hide): Use 
pyim-page-tooltip-get-valid-tooltip.
        (pyim-page-info-format): New function.
        (pyim-page-tooltip-minibuffer-show): New function.
        (pyim-page-minibuffer-message): removed.
    
            * pyim-probe.el (pyim-probe-exwm-environment): Use 
pyim-exwm-xim-environment-p.
    
            * pyim-common.el (pyim-exwm-xim-environment-p): New function.
    
            * README.org (配置实例): improve about pyim-page-tooltip.
            (让选词框跟随光标): Add new example about pyim-page-tooltip.
---
 README.org      |   9 ++-
 pyim-common.el  |   5 ++
 pyim-page.el    | 177 +++++++++++++++++++++++++++++++-------------------------
 pyim-preview.el |   3 +
 pyim-probe.el   |   3 +-
 5 files changed, 112 insertions(+), 85 deletions(-)

diff --git a/README.org b/README.org
index 3228f5c610..f5fce17633 100644
--- a/README.org
+++ b/README.org
@@ -122,11 +122,6 @@ pyim 的目标是: *尽最大的努力成为一个好用的 Emacs 中文输入
 ;; 开启代码搜索中文功能(比如拼音,五笔码等)
 (pyim-isearch-mode 1)
 
-;; 设置选词框的绘制方式
-(if (posframe-workable-p)
-    (setq pyim-page-tooltip 'posframe)
-  (setq pyim-page-tooltip 'popup))
-
 ;; 显示5个候选词。
 (setq pyim-page-length 5)
 
@@ -202,6 +197,10 @@ pyim 支持双拼输入模式,用户可以通过变量 `pyim-default-scheme' 
    (setq pyim-page-tooltip 'posframe)
    #+end_example
    注意:pyim 不会自动安装 posframe, 用户需要手动安装这个包,
+3. 按照优先顺序自动选择一个可用的 tooltip
+   #+begin_example
+   (setq pyim-page-tooltip '(posframe popup exwm minibuffer))
+   #+end_example
 
 ** 调整 tooltip 选词框的显示样式
 pyim 的选词框默认使用 *双行显示* 的样式,在一些特殊的情况下(比如:popup 显示的
diff --git a/pyim-common.el b/pyim-common.el
index 25b386e732..ae171e3dd0 100644
--- a/pyim-common.el
+++ b/pyim-common.el
@@ -191,6 +191,11 @@ When CARE-FIRST-ONE is no-nil, ((a b c) (d e)) => (a d)."
                 (> (float-time (time-since ,start)) ,limit)
                 (throw 'done 'pyim-time-out)))))))
 
+(defvar exwm-xim-buffer-p)
+(defun pyim-exwm-xim-environment-p ()
+  "判断当前环境是否是 exwm-xim 环境。"
+  (bound-and-true-p exwm-xim-buffer-p))
+
 ;; * Footer
 (provide 'pyim-common)
 
diff --git a/pyim-page.el b/pyim-page.el
index 3157618a85..8ae5d003e4 100644
--- a/pyim-page.el
+++ b/pyim-page.el
@@ -31,6 +31,7 @@
 (require 'posframe nil t)
 (require 'popup nil t)
 (require 'pyim-common)
+(require 'pyim-preview)
 
 (eval-when-compile
   (require 'pyim-entered))
@@ -45,7 +46,7 @@
 细节信息请参考 `pyim-page-refresh' 的 docstring."
   :type 'number)
 
-(defcustom pyim-page-tooltip 'posframe
+(defcustom pyim-page-tooltip '(posframe popup exwm minibuffer)
   "如何绘制 pyim 选词框.
 
 1. 当这个变量取值为 posframe 时,使用 posframe 包来绘制选词框,
@@ -54,8 +55,16 @@
    这个选项可以在 emacs 图形版和终端版使用,速度没有 posframe 快,
    有时会遇到选词框错位的问题;
 3. 当这个变量取值为 minibuffer 时,使用 minibuffer 做为选词框,
-   这个选项也作为其他选项不可用时的 fallback."
-  :type 'symbol)
+   这个选项也作为其他选项不可用时的 fallback.
+
+当这个变量的取值是为一个 list 时,pyim 将按照优先顺序动态选择一个
+可用的 tooltip."
+  :type '(choice (repeat (choice (const posframe)
+                                 (const popup)
+                                 (const message)))
+                 (const posframe)
+                 (const popup)
+                 (const message)))
 
 (defcustom pyim-page-style 'two-lines
   "这个变量用来控制选词框的格式.
@@ -103,8 +112,8 @@ Only useful when use posframe.")
 (defvar pyim-page-tooltip-popup nil
   "这个变量用来保存做为 page tooltip 的 popup.")
 
-(defvar pyim-page-minibuffer-last-message nil
-  "函数 `pyim-page-minibuffer-message' 上一次处理的消息字符串。")
+(defvar pyim-page-tooltip-minibuffer-last-string nil
+  "函数 `pyim-page-tooltip-minibuffer-show' 上一次处理的消息字符串。")
 
 (defun pyim-page-current-page ()
   "计算当前选择的词条在第几页面.
@@ -201,7 +210,8 @@ page 的概念,比如,上面的 “nihao” 的 *待选词列表* 就可以
                         x)))
                   (cl-subseq candidates start end)))
          (pos (- (min pyim-candidate-position (length candidates)) start))
-         (page-info (make-hash-table)))
+         (page-info (make-hash-table))
+         (tooltip (pyim-page-tooltip-get-valid-tooltip)))
     (puthash :current-page (pyim-page-current-page) page-info)
     (puthash :total-page (pyim-page-total-page) page-info)
     (puthash :candidates candidate-showed page-info)
@@ -210,25 +220,10 @@ page 的概念,比如,上面的 “nihao” 的 *待选词列表* 就可以
     ;; Show page.
     (when (and (null unread-command-events)
                (null unread-post-input-method-events))
-      (cond
-       ;; 在 minibuffer 中输入中文时,默认使用当前输入行来显示候选词。以前在
-       ;; minibuffer 中试用过 posframe, 在 linux 环境下,运行还不错,但在
-       ;; windows 环境下,似乎有很严重的性能问题,原因未知。
-       ((eq (selected-window) (minibuffer-window))
-        (pyim-page-minibuffer-message
-         (pyim-page-style:minibuffer page-info)))
-       ;; 在 exwm 环境下使用 exwm-xim 输入中文时,使用 minibuffer 来显示 page。
-       ((pyim-probe-exwm-environment)
-        (message (pyim-page-style:exwm page-info)))
-       ;; 普通 buffer 中,使用 `pyim-page-tooltip' 指定的方式显示候选词。
-       (pyim-page-tooltip
-        (pyim-page-tooltip-show
-         (let ((func (intern (format "pyim-page-style:%S" pyim-page-style))))
-           (if (functionp func)
-               (funcall func page-info)
-             (pyim-page-style:two-lines page-info)))
-         (overlay-start pyim-preview-overlay)))
-       (t (message (pyim-page-style:minibuffer page-info)))))))
+      (pyim-page-tooltip-show
+       (pyim-page-info-format page-info tooltip)
+       (pyim-preview-start-point)
+       tooltip))))
 
 (declare-function pyim-process-terminate "pyim-process")
 
@@ -384,6 +379,16 @@ page 的概念,比如,上面的 “nihao” 的 *待选词列表* 就可以
          result)))
     (string-join (nreverse result) (or separator ""))))
 
+(defun pyim-page-info-format (page-info tooltip)
+  "将 PAGE-INFO 按照 `pyim-page-style' 格式化为选词框中显示的字符串。"
+  (let* ((style (cond ((eq tooltip 'exwm) 'exwm)
+                      ((eq tooltip 'minibuffer) 'minibuffer)
+                      (t pyim-page-style))))
+    (let ((func (intern (format "pyim-page-style:%S" style))))
+      (if (functionp func)
+          (funcall func page-info)
+        (pyim-page-style:two-lines page-info)))))
+
 (defun pyim-page-style:two-lines (page-info)
   "将 PAGE-INFO 格式化为选词框中显示的字符串.
 
@@ -471,51 +476,69 @@ page 的概念,比如,上面的 “nihao” 的 *待选词列表* 就可以
           (gethash :current-page page-info)
           (gethash :total-page page-info)))
 
-(defun pyim-page-tooltip-show (string position)
+(defun pyim-page-tooltip-get-valid-tooltip ()
+  "获取一个可用的 tooltip."
+  (cond
+   ;; 在 minibuffer 中输入中文时,默认使用当前输入行来显示候选词。以前在
+   ;; minibuffer 中试用过 posframe, 在 linux 环境下,运行还不错,但在 windows 环
+   ;; 境下,似乎有很严重的性能问题,原因未知。
+   ((eq (selected-window) (minibuffer-window)) 'minibuffer)
+   ;; 在 exwm 环境下使用 exwm-xim 输入中文。
+   ((pyim-exwm-xim-environment-p) 'exwm)
+   (t (or (cl-find-if (lambda (tp)
+                        (or (and (eq tp 'posframe)
+                                 (functionp 'posframe-workable-p)
+                                 (posframe-workable-p))
+                            (and (eq tp 'popup)
+                                 (featurep 'popup))
+                            (eq tp 'minibuffer)))
+                      (if (listp pyim-page-tooltip)
+                          pyim-page-tooltip
+                        (list pyim-page-tooltip)))
+          'minibuffer))))
+
+(defun pyim-page-tooltip-show (string position tooltip)
   "在 POSITION 位置,使用 posframe 或者 popup 显示字符串 STRING."
-  (let ((tooltip pyim-page-tooltip))
-    (cond ((and (eq tooltip 'posframe)
-                (functionp 'posframe-workable-p)
-                (posframe-workable-p))
-           (posframe-show pyim-page-tooltip-posframe-buffer
-                          :string string
-                          :position position
-                          :min-width pyim-page-posframe-min-width
-                          :background-color (face-attribute 'pyim-page 
:background)
-                          :foreground-color (face-attribute 'pyim-page 
:foreground)
-                          :border-width pyim-page-posframe-border-width
-                          :border-color (face-attribute 'pyim-page-border 
:background)))
-          ((and (eq tooltip 'popup) (featurep 'popup))
-           (pyim-page-tooltip-popup-show :string string
-                                         :position position))
-          (t (let ((max-mini-window-height (+ pyim-page-length 2)))
-               (message string))))))
-
-(defun pyim-page-minibuffer-message (string)
-  "当在 minibuffer 中使用 pyim 输入中文时,需要将
-minibuffer 原来显示的信息和 pyim 选词框整合在一起显示
-这个函数就是作这个工作。"
-  (message nil)
-  (let* ((inhibit-quit t)
-         (begin (point))
-         (length (length pyim-page-minibuffer-last-message))
-         (end (min (+ begin length) (point-max))))
-    (delete-region begin end)
-    (save-excursion
-      (insert
-       (setq pyim-page-minibuffer-last-message
-             (concat
-              (or pyim-page-minibuffer-separator
-                  (let* ((width (string-width (buffer-string)))
-                         (n (- (* 20 (+ 1 (/ width 20))) width)))
-                    (make-string n ?\ )))
-              string)))
-      (setq end (point)))
-    (sit-for 1000000)
-    (delete-region (point) (min end (point-max)))
-    (when quit-flag
-      (setq quit-flag nil)
-      (pyim-add-unread-command-events 7 t))))
+  (cond ((eq tooltip 'posframe)
+         (posframe-show pyim-page-tooltip-posframe-buffer
+                        :string string
+                        :position position
+                        :min-width pyim-page-posframe-min-width
+                        :background-color (face-attribute 'pyim-page 
:background)
+                        :foreground-color (face-attribute 'pyim-page 
:foreground)
+                        :border-width pyim-page-posframe-border-width
+                        :border-color (face-attribute 'pyim-page-border 
:background)))
+        ((eq tooltip 'popup)
+         (pyim-page-tooltip-popup-show :string string
+                                       :position position))
+        (t (pyim-page-tooltip-minibuffer-show string))))
+
+(defun pyim-page-tooltip-minibuffer-show (string)
+  "使用 minibuffer 来显示 string。"
+  (if (not (eq (selected-window) (minibuffer-window)))
+      (message string)
+    (let ((max-mini-window-height (+ pyim-page-length 2)))
+      (message nil)
+      (let* ((inhibit-quit t)
+             (begin (point))
+             (length (length pyim-page-tooltip-minibuffer-last-string))
+             (end (min (+ begin length) (point-max))))
+        (delete-region begin end)
+        (save-excursion
+          (insert
+           (setq pyim-page-tooltip-minibuffer-last-string
+                 (concat
+                  (or pyim-page-minibuffer-separator
+                      (let* ((width (string-width (buffer-string)))
+                             (n (- (* 20 (+ 1 (/ width 20))) width)))
+                        (make-string n ?\ )))
+                  string)))
+          (setq end (point)))
+        (sit-for 1000000)
+        (delete-region (point) (min end (point-max)))
+        (when quit-flag
+          (setq quit-flag nil)
+          (pyim-add-unread-command-events 7 t))))))
 
 (declare-function 'popup-tip "popup")
 (declare-function 'popup-delete "popup")
@@ -539,15 +562,13 @@ minibuffer 原来显示的信息和 pyim 选词框整合在一起显示
 
 (defun pyim-page-hide ()
   "Hide pyim page."
-  (setq pyim-page-minibuffer-last-message nil)
-  (cond
-   ((and (eq pyim-page-tooltip 'popup)
-         (functionp 'popup-delete))
-    (popup-delete pyim-page-tooltip-popup))
-   ((and (eq pyim-page-tooltip 'posframe)
-         (functionp 'posframe-hide))
-    (posframe-hide pyim-page-tooltip-posframe-buffer))
-   (t nil)))
+  (let ((tooltip (pyim-page-tooltip-get-valid-tooltip)))
+    (cond
+     ((eq tooltip 'popup)
+      (popup-delete pyim-page-tooltip-popup))
+     ((eq tooltip 'posframe)
+      (posframe-hide pyim-page-tooltip-posframe-buffer))
+     (t (setq pyim-page-tooltip-minibuffer-last-string nil)))))
 
 ;; * Footer
 (provide 'pyim-page)
diff --git a/pyim-preview.el b/pyim-preview.el
index e4873e503b..a702fe9f25 100644
--- a/pyim-preview.el
+++ b/pyim-preview.el
@@ -101,6 +101,9 @@ pyim 会使用 Emacs overlay 机制在 *待输入buffer* 光标处高亮显示
     (delete-region (overlay-start pyim-preview-overlay)
                    (overlay-end pyim-preview-overlay))))
 
+(defun pyim-preview-start-point ()
+  "Preview 字符串的开始位置。"
+  (overlay-start pyim-preview-overlay))
 
 ;; * Footer
 (provide 'pyim-preview)
diff --git a/pyim-probe.el b/pyim-probe.el
index 4865462eaa..36b64cd9ad 100644
--- a/pyim-probe.el
+++ b/pyim-probe.el
@@ -188,12 +188,11 @@
     (or (not (eq (org-inside-LaTeX-fragment-p) nil))
         (not (eq (org-inside-latex-macro-p) nil)))))
 
-(defvar exwm-xim-buffer-p)
 (defun pyim-probe-exwm-environment ()
   "测试当前是否是 exwm 输入法环境。
 
 这个探针主要用于: `pyim-force-input-chinese-functions'"
-  (bound-and-true-p exwm-xim-buffer-p))
+  (pyim-exwm-xim-environment-p))
 
 (defvar xwidget-webkit-isearch--read-string-buffer)
 (defun pyim-probe-xwidget-webkit-environment ()



reply via email to

[Prev in Thread] Current Thread [Next in Thread]