;ELC ;;; Compiled ;;; in Emacs version 26.3 ;;; with all optimizations. ;;; This file contains utf-8 non-ASCII characters, ;;; and so cannot be loaded into Emacs 22 or earlier. (and (boundp 'emacs-version) (< (aref emacs-version (1- (length emacs-version))) ?A) (string-lessp emacs-version "23") (error "`%s' was compiled for Emacs 23 or later" #$)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (byte-code "\300\301!\210\300\302\303\304#\210\300\305\303\304#\210\300\306!\210\307\310\303\311\312\313%\210\314\315\316\317\320DD\321\322\323%\210\314\324\316\317\325DD\326\322\327%\210\314\330\316\317\331DD\332\322\327%\210\333\334\335\303#\210\336\211\203h\211@\334N\203a\335N\204a\337\335\334N#\210A\266\202\202G\210\340\334\335\341#\210\314\335\316\317\342DD\343\322\344%\210\333\345\346\303#\210\336\211\203\243\211@\345N\203\234\346N\204\234\337\346\345N#\210A\266\202\202\202\210\340\345\346\341#\210\314\346\316\317\347DD\350\322\344%\210\351\310\352\353#\210\351\354\355\356#\210\351\357\360\361#\207" [require cl-lib posframe nil t popup pyim-common custom-declare-group pyim-page "Page tools for pyim." :group pyim custom-declare-variable pyim-page-length funcall function #[0 "\300\207" [5] 1] "每页显示的词条数目.\n\n细节信息请参考 `pyim-page-refresh' 的 docstring." :type number pyim-page-tooltip #[0 "\300\207" [posframe] 1] "如何绘制 pyim 选词框.\n\n1. 当这个变量取值为 posframe 时,使用 posframe 包来绘制选词框,\n 如果使用 emacs26 图形版的用户推荐使用这个选项。\n2. 当这个变量取值为 popup 时,使用 popup-el 包来绘制选词框,\n 这个选项可以在 emacs 图形版和终端版使用,速度没有 posframe 快,\n 有时会遇到选词框错位的问题;\n3. 当这个变量取值为 minibuffer 时,使用 minibuffer 做为选词框,\n 这个选项也作为其他选项不可用时的 fallback." symbol pyim-page-style #[0 "\300\207" [two-lines] 1] "这个变量用来控制选词框的格式.\n\npyim 内建的有三种选词框格式:\n\n1. one-line 单行选词框\n2. two-lines 双行选词框\n3. vertical 垂直选词框" defvaralias pyim-posframe-border-width pyim-page-posframe-border-width (saved-value saved-variable-comment) put make-obsolete-variable "4.0" #[0 "\300\207" [0] 1] "posframe的内间距。\n只有当用户使用 posframe 来显示候选词时才有效。" integer pyim-posframe-min-width pyim-page-posframe-min-width #[0 "\301_\207" [pyim-page-length 7] 2] "使用 posframe 做为选词框时,设置选词框的最小宽度." custom-declare-face ((t (:inherit default :background "#333333" :foreground "#dcdccc"))) "Face used for the pyim page." pyim-page-border ((t (:inherit pyim-page))) "Face used for the pyim page border.\nOnly useful when use posframe." pyim-page-selection ((t (:background "gray44"))) "选词框中已选词条的 face\n\n注意:当使用 minibuffer 为选词框时,这个选项才有用处。"] 7) #@70 这个变量用来保存做为 page tooltip 的 posframe 的 buffer. (defvar pyim-page-tooltip-posframe-buffer " *pyim-page-tooltip-posframe-buffer*" (#$ . 3005)) #@103 计算当前选择的词条在第几页面. 细节信息请参考 `pyim-page-refresh' 的 docstring. (defalias 'pyim-page-current-page #[0 "S \245T\207" [pyim-candidate-position pyim-page-length] 2 (#$ . 3175)]) #@91 计算 page 总共有多少页. 细节信息请参考 `pyim-page-refresh' 的 docstring. (defalias 'pyim-page-total-page #[0 "GS \245T\207" [pyim-candidates pyim-page-length] 2 (#$ . 3395)]) #@109 计算当前所在页的第一个词条的位置. 细节信息请参考 `pyim-page-refresh' 的 docstring. (defalias 'pyim-page-start #[0 "G ^\211S\n\245\n_T\207" [pyim-candidates pyim-candidate-position pyim-page-length] 3 (#$ . 3595)]) #@257 计算当前所在页的最后一个词条的位置, 如果 pyim-candidates 用完,则检查是否有补全。如果 FINISH 为 non-nil,说明,补全已经用完了. 细节信息请参考 `pyim-page-refresh' 的 docstring. (fn &optional FINISH) (defalias 'pyim-page-end #[256 "G \n\211S\\\245_\211W\203\211\202!\203\202!\303\304!\207" [pyim-candidates pyim-page-length pyim-candidate-position pyim-page-end t] 7 (#$ . 3842)]) #@2056 刷新 page 页面的函数. 这个函数主要用来处理选词框选词后,刷新显示问题,pyim 使用 `pyim-candidates' 来保存 *待选词列表* ,"nihao" 对应的 `pyim-candidates' 的值类似: ("你好" "倪皓" "泥" "你" ... "慝") *待选词列表* 一般都很长,不可能在一页中完全显示,所以 pyim 使用了 page 的概念,比如,上面的 “nihao” 的 *待选词列表* 就可以逻辑的 分成5页: 第1页 你好 倪皓 泥 你 呢 拟 逆 腻 妮 第2页 怩 溺 尼 禰 齯 麑 鲵 蜺 衵 第3页 薿 旎 睨 铌 昵 匿 倪 霓 暱 第4页 柅 猊 郳 輗 坭 惄 堄 儗 伲 第5页 祢 慝 `pyim-candidate-position' 的取值以及 `pyim-page-length' 的设定值 (默认设置为9),共同决定了 pyim 需要显示哪一页,比如: 第1页 你好 倪皓 泥 你 呢 拟 逆 腻 妮 第2页 怩 溺 尼 禰 齯 麑 鲵 蜺 衵 第3页 薿[B] 旎 睨[A] 铌 昵 匿 倪 霓 暱[E] 第4页 柅 猊 郳 輗 坭 惄 堄 儗 伲 第5页 祢 慝 假设当前选择的词条为 "睨", 那么 `pyim-candidate-position' 的取 值为 A 所在的位置。那么: 1. 函数 `pyim-page-current-page' 返回值为3, 说明当前 page 为第3页。 2. 函数 `pyim-page-total-page' 返回值为5,说明 page 共有5页。 3. 函数 `pyim-page-start' 返回 B 所在的位置。 4. 函数 `pyim-page-end' 返回 E 所在的位置。 5. 函数 `pyim-page-refresh' 会从 `pyim-candidates' 中提取一个 sublist: ("薿" "旎" "睨" "铌" "昵" "匿" "倪" "霓" "暱") 这个 sublist 的起点为 `pyim-page-start' 的返回值,终点为 `pyim-page-end' 的返回值。并保存到一个 hashtable 的 :candidates 关键字对应的位置,这个 hastable 最终会做为参数传递 给 `pyim-page-style' 相关的函数,用于生成用于在选词框中显示的 字符串。 (fn &optional HIGHTLIGHT-CURRENT) (defalias 'pyim-page-refresh #[256 "\306 \307 S\310\311\312#\" G^Z\313 \314\315\316 #\210\314\317\320 #\210\314\321#\210\314\322#\210\314\323#\210\n?\205\216 ?\205\216\324 \325 =\203T\326\327\330!P!\202\216\331\332 \203c\333\334!!\202\215 \203\210\335\336\337\340$\"!\341!\203{\211!\202~\342!\262\343%!\"\202\215\333\330!!)\207" [pyim-candidates pyim-candidate-position unread-command-events unread-post-input-method-events message-log-max pyim-page-tooltip pyim-page-end pyim-page-start mapcar #[257 "\300\301\302#\211\203P\202\207" [get-text-property 0 :comment] 5 "\n\n(fn X)"] cl-subseq make-hash-table puthash :current-page pyim-page-current-page :total-page pyim-page-total-page :candidates :position :hightlight-current selected-window minibuffer-window pyim-page-minibuffer-message "\n" pyim-page-style:minibuffer nil pyim-exwm-enable-p message pyim-page-style:exwm pyim-page-tooltip-show intern format "pyim-page-style:%S" functionp pyim-page-style:two-lines overlay-start pyim-page-style pyim-preview-overlay] 12 (#$ . 4300)]) #@514 Pyim page 翻页命令. 原理是:改变 `pyim-candidate-position' 的取值,假设一次只翻一页, 那么这个函数所做的工作就是: 1. 首先将 `pyim-candidate-position' 增加 `pyim-page-length' ,确 保其指定的位置在下一页。 2. 然后将 `pyim-candidate-position' 的值设定为 `pyim-page-start' 的返回值,确保 `pyim-candidate-position' 的取值为下一页第一个 词条的位置。 3. 最后调用 `pyim-page-refresh' 来重新刷新页面。 (fn ARG) (defalias 'pyim-page-next-page #[257 "\303\304!G\305U\203\306\307!\210\310 \207\311 _\312#\313\nGT\262\305V\2031V\203-\312\2022\2022\211\314 \315 \210\316 \207" [pyim-candidate-position pyim-page-length pyim-candidates pyim-entered-get point-before 0 pyim-process-outcome-handle last-char pyim-process-terminate + 1 nil pyim-page-start pyim-preview-refresh pyim-page-refresh] 5 (#$ . 7443) "p"]) #@12 (fn ARG) (defalias 'pyim-page-previous-page #[257 "\300[!\207" [pyim-page-next-page] 3 (#$ . 8373) "p"]) #@12 (fn ARG) (defalias 'pyim-page-next-word #[257 "\302\303!G\304U\203\305\306!\210\307 \207\\\310 G\262\211Y\203,\304V\203(\202-\211\202-\311\312 \210\313\314!\207" [pyim-candidate-position pyim-candidates pyim-entered-get point-before 0 pyim-process-outcome-handle last-char pyim-process-terminate nil 1 pyim-preview-refresh pyim-page-refresh t] 5 (#$ . 8487) "p"]) #@12 (fn ARG) (defalias 'pyim-page-previous-word #[257 "\300[!\207" [pyim-page-next-word] 3 (#$ . 8872) "p"]) #@225 这个函数用于创建在 page 中显示的预览字符串。 这个预览是在 page 中显示,而 `pyim-preview-refresh' 对应的预览 是在 buffer 光标处显示,两者要做区别。 (fn &optional SEPARATOR) (defalias 'pyim-page-preview-create #[256 "\300 \301\302\"\211\205\303\304\305\"!!\207" [pyim-scheme-name pyim-scheme-get-option :class intern format "pyim-page-preview-create:%S"] 7 (#$ . 8987)]) #@28 (fn &optional SEPARATOR) (defalias 'pyim-page-preview-create:quanpin #[256 "\211\206\306\307\310\311\312@\"#r\313 !q\210`\314\232\203 \315P\202-\316\317P\317#\320\321`d\"Q)\n\322=\205V \323=\205V\324\325\fS 8!\326\327!\"\211G\330V\203S\331\332\"\202T\333\262P\207" [pyim-imobjs pyim-entered-buffer pyim-assistant-scheme pyim-assistant-scheme-enable pyim-candidate-position pyim-candidates " " mapconcat identity mapcar #[257 "\211@A@P\207" [] 3 "\n\n(fn W)"] get-buffer-create 1 "|" replace-regexp-in-string "'" " |" buffer-substring-no-properties quanpin t pyim-cstring-to-xingma pyim-candidate-parse pyim-scheme-name default 0 format " [%s](辅)" " (辅)"] 8 (#$ . 9419)]) #@28 (fn &optional SEPARATOR) (defalias 'pyim-page-preview-create:shuangpin #[256 "\301\302 \303\"\304@\211\203W\211@\211@A@\305\232\203'\306C\"@B\262\202N\307\310\311\312\313\314!\315\"\316\317%\"\307\310\311\320\313\314!\321\"\322\317%\"PB\262\266A\266\202\202\210\323\324\325!\206b\326#\207" [pyim-imobjs pyim-scheme-get-option pyim-scheme-name :keymaps nil "" rassoc cl-some make-byte-code 257 "\300A@\232\205\n\211@\207" vconcat vector [] 3 "\n\n(fn X)" "\300\3018\232\204\300\3028\232\205\211@\207" [2 3] 4 mapconcat identity reverse " "] 15 (#$ . 10118)]) #@28 (fn &optional SEPARATOR) (defalias 'pyim-page-preview-create:xingma #[256 "\301 \302\303\304\305\306\"\307\"\310\311%\312r\313!q\210`d\232\203(\211\314ed\"\"\2028\211\314e`\"\"\315\314`d\"\"Q)\262\262\207" [pyim-entered-buffer pyim-scheme-name make-byte-code 257 "\302\303\304\301\"@\300\206\f\305#\207" vconcat vector [mapconcat identity pyim-imobjs-create " "] 6 "\n\n(fn X)" #[514 "\300\301\302\"\302#\207" [mapconcat split-string "'"] 7 "\n\n(fn --CL-SEGMENT-- X)"] get-buffer-create buffer-substring-no-properties "| "] 11 (#$ . 10720)]) #@133 这个函数用于创建在 page 中显示的备选词条菜单。 (fn CANDIDATES POSITION &optional SEPARATOR HIGHTLIGHT-CURRENT) (defalias 'pyim-page-menu-create #[1026 "\300\301\211\203I\211@\211:\203\211@AP\202\211T\262\2037U\2037\302\303\304\302\305\"\306\307##\202=\302\310#B\262\210A\266\202\202\210\311\312\237\206T\313#\207" [0 nil format "%d%s" propertize "[%s]" face pyim-page-selection "%d.%s " mapconcat identity ""] 16 (#$ . 11289)]) #@221 将 PAGE-INFO 格式化为选词框中显示的字符串. 样式类似: +----------------------------+ | ni hao [1/9] | | 1.你好 2.你号 ... | +----------------------------+ (fn PAGE-INFO) (defalias 'pyim-page-style:two-lines #[257 "\300\301\302 \303\304\"\303\305\"\306\303\307\"\303\310 \"\311\303\312 \"$%\207" [format "=> %s [%s/%s]: \n%s" pyim-page-preview-create gethash :current-page :total-page pyim-page-menu-create :candidates :position nil :hightlight-current] 13 (#$ . 11777)]) #@211 将 PAGE-INFO 格式化为选词框中显示的字符串. 样式类似: +-----------------------------------+ | [ni hao]: 1.你好 2.你号 ... (1/9) | +-----------------------------------+ (fn PAGE-INFO) (defalias 'pyim-page-style:one-line #[257 "\300\301\302\303!\304\305\306\"\305\307\"\310\305\311 \"$\305\312\"\305\313\"%\207" [format "[%s]: %s(%s/%s)" pyim-page-preview-create " " pyim-page-menu-create gethash :candidates :position nil :hightlight-current :current-page :total-page] 11 (#$ . 12312)]) #@182 将 PAGE-INFO 格式化为选词框中显示的字符串. 样式类似: +--------------+ | ni hao [1/9] | | 1.你好 | | 2.你号 ... | +--------------+ (fn PAGE-INFO) (defalias 'pyim-page-style:vertical #[257 "\300\301\302 \303\304\"\303\305\"\306\303\307\"\303\310 \"\311\303\312 \"$%\207" [format "=> %s [%s/%s]: \n%s" pyim-page-preview-create gethash :current-page :total-page pyim-page-menu-create :candidates :position "\n" :hightlight-current] 13 (#$ . 12841)]) #@214 将 PAGE-INFO 格式化为选词框中显示的字符串. 样式类似: +------------------------------------+ | [ni hao]: 1.你好 2.你号 ... (1/9) | +------------------------------------+ (fn PAGE-INFO) (defalias 'pyim-page-style:minibuffer #[257 "\300\301\302 \303\304\305\"\304\306\"\307\304\310 \"$\304\311\"\304\312\"%\207" [format "[%s]: %s(%s/%s)" pyim-page-preview-create pyim-page-menu-create gethash :candidates :position nil :hightlight-current :current-page :total-page] 11 (#$ . 13337)]) #@57 专门用于 exwm 环境的 page style. (fn PAGE-INFO) (defalias 'pyim-page-style:exwm #[257 "\300\301\302 \303\304\305\"\304\306\"\307\304\310 \"$\304\311\"\304\312\"%\207" [format "[%s]: %s(%s/%s)" pyim-page-preview-create pyim-page-menu-create gethash :candidates :position nil :hightlight-current :current-page :total-page] 11 (#$ . 13862)]) (defvar pyim-pyim-posframe-warn nil) #@34 Test posframe's workable status. (defalias 'pyim-page-posframe-workable-p #[0 "\301\302!\203 \302 \203 \303\207\204\304\305!\306\207" [pyim-pyim-posframe-warn functionp posframe-workable-p t message "PYIM: posframe 没有正确安装或者当前 Emacs 版本不支持 posframe。" nil] 2 (#$ . 14261)]) #@98 在 POSITION 位置,使用 posframe 或者 popup 显示字符串 STRING. (fn STRING POSITION) (defalias 'pyim-page-tooltip-show #[514 "\211\306=\203+\307 \203+\310 \311\312\313\n\314\315\316\317\"\320\315\316\321\"\322 \323\315\324\317\"&\202I\211\325=\203A\326\327!\203A\327\330\331\332%\202I\f\333\\\334!)\207" [pyim-page-tooltip pyim-page-tooltip-posframe-buffer pyim-page-posframe-min-width pyim-page-posframe-border-width pyim-page-length max-mini-window-height posframe pyim-page-posframe-workable-p posframe-show :string :position :min-width :background-color face-attribute pyim-page :background :foreground-color :foreground :border-width :border-color pyim-page-border popup functionp popup-tip :point :margin 1 2 message] 21 (#$ . 14576)]) #@184 当在 minibuffer 中使用 pyim 输入中文时,需要将 minibuffer 原来显示的信息和 pyim 选词框整合在一起显示 这个函数就是作这个工作。 (fn STRING) (defalias 'pyim-page-minibuffer-message #[257 "\302\303!\210\304\303\212c\210`\262)\305\306!\210`|\210 \205\"\303\307\310\304\")\207" [inhibit-quit quit-flag message nil t sit-for 1000000 pyim-add-unread-command-events 7] 6 (#$ . 15352)]) #@17 Hide pyim page. (defalias 'pyim-page-hide #[0 "\302=\205\303 \205\304 !\207" [pyim-page-tooltip pyim-page-tooltip-posframe-buffer posframe pyim-page-posframe-workable-p posframe-hide] 2 (#$ . 15787)]) (provide 'pyim-page)