[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/pyim fb287f2: Split rime support to pyim-liberime.el
From: |
Feng Shu |
Subject: |
[elpa] externals/pyim fb287f2: Split rime support to pyim-liberime.el |
Date: |
Fri, 26 Feb 2021 01:10:09 -0500 (EST) |
branch: externals/pyim
commit fb287f26ad6c2eaee490bf1669ac4cfc353428be
Author: Feng Shu <tumashu@163.com>
Commit: Feng Shu <tumashu@163.com>
Split rime support to pyim-liberime.el
---
README.md | 192 +++++++++++++++++-------------------
pyim-liberime.el | 296 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
pyim.el | 270 +++-----------------------------------------------
3 files changed, 402 insertions(+), 356 deletions(-)
diff --git a/README.md b/README.md
index 85e2482..8419512 100644
--- a/README.md
+++ b/README.md
@@ -3,62 +3,62 @@ Note: this file is auto converted from pyim.el by
[el2org](https://github.com/tu
# 目录
-1. [pyim 使用说明](#org0575cb8)
- 1. [截图](#org060b651)
- 2. [简介](#org5e1d315)
- 3. [背景](#org7f4b998)
- 4. [目标](#orgc345ff2)
- 5. [特点](#orgf3197bc)
- 6. [安装](#orgbd895cc)
- 7. [配置](#orga713125)
- 1. [配置实例](#org4b46949)
- 2. [添加词库文件](#org929d1e4)
- 3. [激活 pyim](#org07774f2)
- 8. [使用](#org35f9007)
- 1. [常用快捷键](#org8677252)
- 2. [使用双拼模式](#org300b615)
- 3. [通过 pyim 来支持 rime 所有输入法](#org30c4f8f)
- 4. [使用五笔输入](#org55dc6ab)
- 5. [使用仓颉输入法](#org4a6c079)
- 6. [让选词框跟随光标](#org7368772)
- 7. [调整 tooltip 选词框的显示样式](#orgbd022ba)
- 8. [设置模糊音](#org3b72885)
- 9. [使用魔术转换器](#org2f6c191)
- 10. [切换全角标点与半角标点](#org56fe195)
- 11. [手动加词和删词](#org177eda0)
- 12. [pyim 高级功能](#org45a5b8e)
- 9. [捐赠](#org2482eb9)
- 10. [Tips](#orgcfe03bf)
- 1. [关闭输入联想词功能 (默认开启)](#org1719542)
- 2. [如何将个人词条相关信息导入和导出?](#org1258502)
- 3. [pyim 出现错误时,如何开启 debug 模式](#org57aa8af)
- 4. [如何查看 pyim 文档。](#org4498681)
- 5. [将光标处的拼音或者五笔字符串转换为中文 (与 vimim 的 “点石成金” 功能类似)](#org45b805f)
- 6. [如何使用其它字符翻页](#org458f055)
- 7. [如何用 ";" 来选择第二个候选词](#org6119ede)
- 8. [如何添加自定义拼音词库](#org1b350d2)
- 9. [如何手动安装和管理词库](#orgb999ecf)
- 10. [Emacs 启动时加载 pyim 词库](#orgeeaedec)
- 11. [将汉字字符串转换为拼音字符串](#org34b8215)
- 12. [中文分词](#org489e173)
- 13. [获取光标处的中文词条](#org0f535fb)
- 14. [让 \`forward-word' 和 \`back-backward’ 在中文环境下正常工作](#org421207e)
- 15. [为 isearch 相关命令添加拼音搜索支持](#orgfbb740c)
-
-
-<a id="org0575cb8"></a>
+1. [pyim 使用说明](#org1a50b51)
+ 1. [截图](#org25ff3a4)
+ 2. [简介](#org780a8c5)
+ 3. [背景](#org28f85b7)
+ 4. [目标](#org1056777)
+ 5. [特点](#org5351807)
+ 6. [安装](#org3f99a8d)
+ 7. [配置](#org0abf75c)
+ 1. [配置实例](#org14b4c60)
+ 2. [添加词库文件](#org7712405)
+ 3. [激活 pyim](#orgfe2d0df)
+ 8. [使用](#orgb834c8b)
+ 1. [常用快捷键](#orgbb28e52)
+ 2. [使用双拼模式](#org144333f)
+ 3. [使用 rime 输入法](#orgd5380d2)
+ 4. [使用五笔输入](#orgca2e51d)
+ 5. [使用仓颉输入法](#org746da00)
+ 6. [让选词框跟随光标](#org599f6a5)
+ 7. [调整 tooltip 选词框的显示样式](#org79091b2)
+ 8. [设置模糊音](#orgec7070f)
+ 9. [使用魔术转换器](#org63a6a1d)
+ 10. [切换全角标点与半角标点](#orgd10a20b)
+ 11. [手动加词和删词](#org960fae7)
+ 12. [pyim 高级功能](#org0d40aef)
+ 9. [捐赠](#org778c2ee)
+ 10. [Tips](#org2109336)
+ 1. [关闭输入联想词功能 (默认开启)](#orgb0a391b)
+ 2. [如何将个人词条相关信息导入和导出?](#org7109c22)
+ 3. [pyim 出现错误时,如何开启 debug 模式](#org11a4c5d)
+ 4. [如何查看 pyim 文档。](#orgea0afea)
+ 5. [将光标处的拼音或者五笔字符串转换为中文 (与 vimim 的 “点石成金” 功能类似)](#orgd80df71)
+ 6. [如何使用其它字符翻页](#org9b083fa)
+ 7. [如何用 ";" 来选择第二个候选词](#org709d8a6)
+ 8. [如何添加自定义拼音词库](#org96ab21d)
+ 9. [如何手动安装和管理词库](#orgc1e986a)
+ 10. [Emacs 启动时加载 pyim 词库](#org00bc777)
+ 11. [将汉字字符串转换为拼音字符串](#org4401c59)
+ 12. [中文分词](#org345a5a0)
+ 13. [获取光标处的中文词条](#orgd5c17b2)
+ 14. [让 \`forward-word' 和 \`back-backward’ 在中文环境下正常工作](#org4360c5c)
+ 15. [为 isearch 相关命令添加拼音搜索支持](#org1ec670b)
+
+
+<a id="org1a50b51"></a>
# pyim 使用说明
-<a id="org060b651"></a>
+<a id="org25ff3a4"></a>
## 截图
![img](./snapshots/pyim-linux-x-with-toolkit.png)
-<a id="org5e1d315"></a>
+<a id="org780a8c5"></a>
## 简介
@@ -66,7 +66,7 @@ pyim 是 Emacs 环境下的一个中文输入法,最初它只支持全拼输
"pyim" 代表 "Chinese Pinyin Input Method" 的意思,后来根据同学的提议,添加了五笔的支持,再叫 “拼音输入法”
就不太合适了,所以你现在可以将它理解为 “PengYou input method”: 平时像朋友一样帮助你,偶尔也像朋友一样犯二 。。。
-<a id="org7f4b998"></a>
+<a id="org28f85b7"></a>
## 背景
@@ -83,7 +83,7 @@ emacs-eim 是 Emacs 环境下的一个中文输入法框架, 支持拼音,
于是我 fork 了 emacs-eim 输入法的部分代码, 创建了一个项目:pyim。
-<a id="orgc345ff2"></a>
+<a id="org1056777"></a>
## 目标
@@ -95,7 +95,7 @@ pyim 的目标是: **尽最大的努力成为一个好用的 Emacs 中文输
3. Exchange: 尽最大可能简化 pyim 使用其他优秀输入法的词库的难度和复杂度。
-<a id="orgf3197bc"></a>
+<a id="org5351807"></a>
## 特点
@@ -104,7 +104,7 @@ pyim 的目标是: **尽最大的努力成为一个好用的 Emacs 中文输
3. pyim 使用文本词库格式,方便处理。
-<a id="orgbd895cc"></a>
+<a id="org3f99a8d"></a>
## 安装
@@ -118,12 +118,12 @@ pyim 的目标是: **尽最大的努力成为一个好用的 Emacs 中文输
(setq default-input-method "pyim")
-<a id="orga713125"></a>
+<a id="org0abf75c"></a>
## 配置
-<a id="org4b46949"></a>
+<a id="org14b4c60"></a>
### 配置实例
@@ -161,11 +161,11 @@ pyim 的目标是: **尽最大的努力成为一个好用的 Emacs 中文输
;; 开启拼音搜索功能
(pyim-isearch-mode 1)
- ;; 使用 popup-el 来绘制选词框, 如果用 emacs26, 建议设置
- ;; 为 'posframe, 速度很快并且菜单不会变形,不过需要用户
- ;; 手动安装 posframe 包。
+ ;; 使用 posframe 绘制 page, (需要用户手动安装 posframe 包)。
;; (setq pyim-page-tooltip 'posframe)
- (setq pyim-page-tooltip 'popup)
+
+ ;; 如果 posframe 不可用,可以试着安装 popup 包,然后设置:
+ ;; ;; (setq pyim-page-tooltip 'popup)
;; 选词框显示5个候选词
(setq pyim-page-length 5)
@@ -175,7 +175,7 @@ pyim 的目标是: **尽最大的努力成为一个好用的 Emacs 中文输
("C-;" . pyim-delete-word-from-personal-buffer)))
-<a id="org929d1e4"></a>
+<a id="org7712405"></a>
### 添加词库文件
@@ -185,10 +185,10 @@ pyim 当前的默认的拼音词库是 pyim-basedict, 这个词库的词条量
1. libpinyin 项目的内置词库
2. pyim 用户贡献的个人词库
-如果 pyim-basedict 不能满足需求,用户可以使用其他方式为 pyim 添加拼音词库,具体方式请参考 [1.10.8](#org1b350d2)
小结。
+如果 pyim-basedict 不能满足需求,用户可以使用其他方式为 pyim 添加拼音词库,具体方式请参考 [1.10.8](#org96ab21d)
小结。
-<a id="org07774f2"></a>
+<a id="orgfe2d0df"></a>
### 激活 pyim
@@ -196,12 +196,12 @@ pyim 当前的默认的拼音词库是 pyim-basedict, 这个词库的词条量
(global-set-key (kbd "C-\\") 'toggle-input-method)
-<a id="org35f9007"></a>
+<a id="orgb834c8b"></a>
## 使用
-<a id="org8677252"></a>
+<a id="orgbb28e52"></a>
### 常用快捷键
@@ -295,7 +295,7 @@ pyim 当前的默认的拼音词库是 pyim-basedict, 这个词库的词条量
</table>
-<a id="org300b615"></a>
+<a id="org144333f"></a>
### 使用双拼模式
@@ -310,24 +310,14 @@ pyim 支持双拼输入模式,用户可以通过变量 \`pyim-default-scheme'
3. 用户可能需要重新设置 \`pyim-translate-trigger-char'。
-<a id="org30c4f8f"></a>
+<a id="orgd5380d2"></a>
-### 通过 pyim 来支持 rime 所有输入法
+### 使用 rime 输入法
-1. 安裝配置 liberime 和 pyim,
方式见:[liberime](https://github.com/merrickluo/liberime).
-2. 使用 rime 全拼输入法的用户,也可以使用 rime-quanpin scheme,
- 这个 scheme 是专门针对 rime 全拼输入法定制的,支持全拼v快捷键。
-
- (setq pyim-default-scheme 'rime-quanpin)
-3. 如果通过 rime 使用微软双拼,可以用以下设置:
-
- (liberime-select-schema "double_pinyin_mspy")
- (setq pyim-default-scheme 'rime-microsoft-shuangpin)
-
- 默认是用繁体中文,想要改成简体中文的话,可以参考 [rime
wiki](https://github.com/rime/home/wiki/CustomizationGuide#%E4%B8%80%E4%BE%8B%E5%AE%9A%E8%A3%BD%E7%B0%A1%E5%8C%96%E5%AD%97%E8%BC%B8%E5%87%BA),或者[这篇博客](http://wenshanren.org/?p=1070#orgc7dbd8e)
+具体安装和使用方式请查看 pyim-liberime 包的 Commentary 部分。
-<a id="org55dc6ab"></a>
+<a id="orgca2e51d"></a>
### 使用五笔输入
@@ -359,7 +349,7 @@ pyim 支持五笔输入模式,用户可以通过变量 \`pyim-default-scheme'
键临时切换到辅助输入法来输入,选词完成之后自动退出。辅助输入法可以通过 \`pyim-assistant-scheme' 来设置。
-<a id="org4a6c079"></a>
+<a id="org746da00"></a>
### 使用仓颉输入法
@@ -384,7 +374,7 @@ pyim 支持其它版本的仓颉,但需要用户自己创建词库文件。
用户可以使用命令:\`pyim-search-word-code' 来查询当前选择词条的仓颉编码
-<a id="org7368772"></a>
+<a id="org599f6a5"></a>
### 让选词框跟随光标
@@ -400,7 +390,7 @@ pyim 支持其它版本的仓颉,但需要用户自己创建词库文件。
注意:pyim 不会自动安装 posframe, 用户需要手动安装这个包,
-<a id="orgbd022ba"></a>
+<a id="org79091b2"></a>
### 调整 tooltip 选词框的显示样式
@@ -412,14 +402,14 @@ pyim 的 tooltip 选词框默认使用 **双行显示** 的样式,在一些特
注:用户可以添加函数 pyim-page-style:STYLENAME 来定义自己的选词框格式。
-<a id="org3b72885"></a>
+<a id="orgec7070f"></a>
### 设置模糊音
可以通过设置 \`pyim-fuzzy-pinyin-alist' 变量来自定义模糊音。
-<a id="org2f6c191"></a>
+<a id="org63a6a1d"></a>
### 使用魔术转换器
@@ -434,7 +424,7 @@ pyim 的 tooltip 选词框默认使用 **双行显示** 的样式,在一些特
(setq pyim-magic-converter #'my-converter)
-<a id="org56fe195"></a>
+<a id="orgd10a20b"></a>
### 切换全角标点与半角标点
@@ -447,7 +437,7 @@ pyim 的 tooltip 选词框默认使用 **双行显示** 的样式,在一些特
3. 第三种方法:设置变量 \`pyim-translate-trigger-char' ,输入变量设定的字符会切换光标处标点的样式。
-<a id="org177eda0"></a>
+<a id="org960fae7"></a>
### 手动加词和删词
@@ -457,7 +447,7 @@ pyim 的 tooltip 选词框默认使用 **双行显示** 的样式,在一些特
4. \`pyim-delete-word' 从个人词库中删除当前高亮选择的词条。
-<a id="org45a5b8e"></a>
+<a id="org0d40aef"></a>
### pyim 高级功能
@@ -587,7 +577,7 @@ pyim 的 tooltip 选词框默认使用 **双行显示** 的样式,在一些特
注:上述函数列表中,任意一个函数的返回值为 t 时,pyim 切换到半角标点输入模式。
-<a id="org2482eb9"></a>
+<a id="org778c2ee"></a>
## 捐赠
@@ -599,19 +589,19 @@ pyim 的 tooltip 选词框默认使用 **双行显示** 的样式,在一些特
![img](snapshots/QR-code-for-author.jpg)
-<a id="orgcfe03bf"></a>
+<a id="org2109336"></a>
## Tips
-<a id="org1719542"></a>
+<a id="orgb0a391b"></a>
### 关闭输入联想词功能 (默认开启)
(setq pyim-enable-shortcode nil)
-<a id="org1258502"></a>
+<a id="org7109c22"></a>
### 如何将个人词条相关信息导入和导出?
@@ -619,14 +609,14 @@ pyim 的 tooltip 选词框默认使用 **双行显示** 的样式,在一些特
2. 导出使用命令: pyim-export
-<a id="org57aa8af"></a>
+<a id="org11a4c5d"></a>
### pyim 出现错误时,如何开启 debug 模式
(setq debug-on-error t)
-<a id="org4498681"></a>
+<a id="orgea0afea"></a>
### 如何查看 pyim 文档。
@@ -635,14 +625,14 @@ pyim 的文档隐藏在 comment 中,如果用户喜欢阅读 html 格式的文
<http://tumashu.github.io/pyim/>
-<a id="org45b805f"></a>
+<a id="orgd80df71"></a>
### 将光标处的拼音或者五笔字符串转换为中文 (与 vimim 的 “点石成金” 功能类似)
(global-set-key (kbd "M-i") 'pyim-convert-string-at-point)
-<a id="org458f055"></a>
+<a id="org9b083fa"></a>
### 如何使用其它字符翻页
@@ -650,7 +640,7 @@ pyim 的文档隐藏在 comment 中,如果用户喜欢阅读 html 格式的文
(define-key pyim-mode-map "," 'pyim-page-previous-page)
-<a id="org6119ede"></a>
+<a id="org709d8a6"></a>
### 如何用 ";" 来选择第二个候选词
@@ -660,7 +650,7 @@ pyim 的文档隐藏在 comment 中,如果用户喜欢阅读 html 格式的文
(pyim-page-select-word-by-number 2)))
-<a id="org1b350d2"></a>
+<a id="org96ab21d"></a>
### 如何添加自定义拼音词库
@@ -705,7 +695,7 @@ pyim 默认没有携带任何拼音词库,用户可以使用下面几种方式
3. 编写语言: C语言
-<a id="orgb999ecf"></a>
+<a id="orgc1e986a"></a>
### 如何手动安装和管理词库
@@ -727,7 +717,7 @@ pyim 默认没有携带任何拼音词库,用户可以使用下面几种方式
3. 词库文件的编码必须为 utf-8-unix,否则会出现乱码。
-<a id="orgeeaedec"></a>
+<a id="org00bc777"></a>
### Emacs 启动时加载 pyim 词库
@@ -735,7 +725,7 @@ pyim 默认没有携带任何拼音词库,用户可以使用下面几种方式
#'(lambda () (pyim-restart-1 t)))
-<a id="org34b8215"></a>
+<a id="org4401c59"></a>
### 将汉字字符串转换为拼音字符串
@@ -746,7 +736,7 @@ pyim 默认没有携带任何拼音词库,用户可以使用下面几种方式
2. \`pyim-hanzi2pinyin-simple' (不考虑多音字)
-<a id="org489e173"></a>
+<a id="org345a5a0"></a>
### 中文分词
@@ -765,7 +755,7 @@ pyim 包含了一个简单的分词函数:\`pyim-cstring-split-to-list', 可
词库中不存在的中文词条。
-<a id="org0f535fb"></a>
+<a id="orgd5c17b2"></a>
### 获取光标处的中文词条
@@ -773,7 +763,7 @@ pyim 包含了一个简单的命令:\`pyim-cwords-at-point', 这个命令可
\`pyim-cstring-split-to-list'。
-<a id="org421207e"></a>
+<a id="org4360c5c"></a>
### 让 \`forward-word' 和 \`back-backward’ 在中文环境下正常工作
@@ -790,7 +780,7 @@ pyim 包含了一个简单的命令:\`pyim-cwords-at-point', 这个命令可
(global-set-key (kbd "M-b") 'pyim-backward-word)
-<a id="orgfbb740c"></a>
+<a id="org1ec670b"></a>
### 为 isearch 相关命令添加拼音搜索支持
diff --git a/pyim-liberime.el b/pyim-liberime.el
new file mode 100644
index 0000000..f84504e
--- /dev/null
+++ b/pyim-liberime.el
@@ -0,0 +1,296 @@
+;;; pyim-liberime.el --- Rime support for pyim. -*- lexical-binding: t;
-*-
+
+;; * Header
+;; Copyright (C) 2021 Free Software Foundation, Inc.
+
+;; Author: Feng Shu <tumashu@163.com>
+;; Maintainer: Feng Shu <tumashu@163.com>
+;; URL: https://github.com/tumashu/pyim
+;; Version: 3.2
+;; Keywords: convenience, Chinese, pinyin, input-method
+;; Package-Requires: ((emacs "24.4") (async "1.6") (xr "1.13"))
+
+;; 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:
+
+;; * pyim-liberime 使用说明 :README:doc:
+;; 1. 安裝配置 liberime 和 pyim,
方式见:[[https://github.com/merrickluo/liberime][liberime]].
+;; 2. 使用 rime 全拼输入法的用户,也可以使用 rime-quanpin scheme,
+;; 这个 scheme 是专门针对 rime 全拼输入法定制的,支持全拼v快捷键。
+;; #+BEGIN_EXAMPLE
+;; (require 'pyim-liberime)
+;; (setq pyim-default-scheme 'rime-quanpin)
+;; #+END_EXAMPLE
+;; 3. 如果通过 rime 使用微软双拼,可以用以下设置:
+;; #+BEGIN_EXAMPLE
+;; (liberime-select-schema "double_pinyin_mspy")
+;; (setq pyim-default-scheme 'rime-microsoft-shuangpin)
+;; #+END_EXAMPLE
+;; 默认是用繁体中文,想要改成简体中文的话,可以参考
[[https://github.com/rime/home/wiki/CustomizationGuide#%E4%B8%80%E4%BE%8B%E5%AE%9A%E8%A3%BD%E7%B0%A1%E5%8C%96%E5%AD%97%E8%BC%B8%E5%87%BA][rime
wiki]],或者[[http://wenshanren.org/?p=1070#orgc7dbd8e][这篇博客]]
+
+;;; Code:
+;; * 代码 :code:
+(require 'pyim)
+(require 'liberime nil t)
+
+(pyim-scheme-add
+ '(rime
+ :document
+ "rime 输入法。
+
+这个 scheme 适用于 librime 支持的所有输入法,通用性较好,但无法支
+持 trigger-chars, 所以类似 pyim 全拼支持的v快捷键将无法使用。"
+ :class rime
+ :code-prefix "&"
+ :first-chars "abcdefghijklmnopqrstuvwxyz"
+ :rest-chars "abcdefghijklmnopqrstuvwxyz'-a"
+ :prefer-trigger-chars nil))
+
+(pyim-scheme-add
+ '(rime-quanpin
+ :document
+ "rime 全拼输入法。
+
+这个 scheme 专门用于 librime 全拼输入法,同时支持 trigger-chars,
+也就是v快捷键,使用 rime 全拼的朋友建议使用这个 scheme。"
+ :class rime
+ :code-prefix "&"
+ :first-chars "abcdefghjklmnopqrstwxyz"
+ :rest-chars "vmpfwckzyjqdltxuognbhsrei'-a"
+ :prefer-trigger-chars "v"))
+
+(pyim-scheme-add
+ '(rime-microsoft-shuangpin
+ :document "rime 微软双拼输入法。"
+ :class rime
+ :code-prefix "&"
+ :first-chars "abcdefghijklmnopqrstuvwxyz"
+ :rest-chars "abcdefghijklmnopqrstuvwxyz;"
+ :prefer-trigger-chars nil))
+
+(declare-function liberime-get-commit "liberime")
+(declare-function liberime-get-context "liberime")
+(declare-function liberime-clear-commit "liberime")
+(declare-function liberime-clear-composition "liberime")
+(declare-function liberime-search "liberime" (string limit))
+(declare-function liberime-get-preedit "liberime")
+(declare-function liberime-get-status "liberime")
+(declare-function liberime-process-key "liberime" (keycode &optional mask))
+(declare-function liberime-select-candidate "liberime" (num))
+
+(defun pyim-liberime-scheme-name (orig_func &optional default)
+ "Advice function of `pyim-scheme-name'."
+ (let* ((scheme-name (funcall orig_func default))
+ (class (pyim-scheme-get-option scheme-name :class)))
+ (if (eq class 'rime)
+ (if (featurep 'liberime-core)
+ scheme-name
+ 'quanpin)
+ scheme-name)))
+
+(advice-add 'pyim-scheme-name :around #'pyim-liberime-scheme-name)
+
+(defun pyim-imobjs-create:rime (entered &optional _)
+ (list (list entered)))
+
+(defun pyim-codes-create:rime (imobj scheme-name &optional first-n)
+ (pyim-codes-create:xingma imobj scheme-name first-n))
+
+(defun pyim-candidates-create:rime (imobjs scheme-name &optional async)
+ "`pyim-candidates-create' 处理 rime 输入法的函数."
+ (let* ((code (car (pyim-codes-create (car imobjs) scheme-name)))
+ (code-prefix (pyim-scheme-get-option scheme-name :code-prefix))
+ (s (replace-regexp-in-string "-" "" code))
+ ;; `liberime-search' 搜索的时候不需要 code-prefix, 去除。
+ (s (if code-prefix (substring s 1) s))
+ (words (liberime-search s (if async
+ nil
+ (* pyim-page-length 2)))))
+ words))
+
+(defun pyim-page-preview-create:rime (&optional separator)
+ (let* ((preedit (or (liberime-get-preedit)
+ (pyim-entered-get 'point-before))))
+ (pyim-with-entered-buffer
+ (if (equal 1 (point))
+ (concat "|" preedit)
+ (concat (replace-regexp-in-string (concat separator "'") "'" preedit)
+ " |" (buffer-substring-no-properties (point) (point-max)))))))
+
+(defvar pyim-liberime-code-log nil)
+(defvar pyim-liberime-word-log nil)
+(defun pyim-page-select-word:rime ()
+ "从选词框中选择当前词条,然后删除该词条对应拼音。"
+ (interactive)
+ (pyim-outcome-handle 'candidate)
+ (let* ((entered (pyim-entered-get 'point-before))
+ (word (string-remove-prefix
+ (or (pyim-outcome-get 1) "") (pyim-outcome-get)))
+ (code (pyim-liberime-get-code word entered))
+ (to-be-translated
+ (string-remove-prefix code entered)))
+ (push code pyim-liberime-code-log)
+ (push word pyim-liberime-word-log)
+ (if (or (> (length to-be-translated) 0) ;是否有光标前未转换的字符串
+ (> (length (pyim-entered-get 'point-after)) 0)) ;是否有光标后字符串
+ (progn
+ (pyim-with-entered-buffer
+ (delete-region (point-min) (point))
+ (insert to-be-translated)
+ (goto-char (point-max)))
+ (pyim-entered-refresh))
+ ;; 在 rime 后端造词和调整瓷瓶词频
+ (pyim-liberime-create-word
+ (reverse pyim-liberime-code-log)
+ (reverse pyim-liberime-word-log))
+ ;; 使用 rime 的同时,也附带的优化 quanpin 的词库。
+ (let ((pyim-default-scheme 'quanpin))
+ (if (member (pyim-outcome-get) pyim-candidates)
+ (pyim-create-pyim-word (pyim-outcome-get) t)
+ (pyim-create-pyim-word (pyim-outcome-get))))
+ (setq pyim-liberime-code-log nil)
+ (setq pyim-liberime-word-log nil)
+ (pyim-terminate-translation)
+ ;; pyim 使用这个 hook 来处理联想词。
+ (run-hooks 'pyim-page-select-finish-hook))))
+
+(defun pyim-autoselector-rime (&rest _args)
+ "适用于RIME的自动上屏器."
+ (let* ((scheme-name (pyim-scheme-name))
+ (class (pyim-scheme-get-option scheme-name :class)))
+ (when (eq class 'rime)
+ (let* ((commit (liberime-get-commit))
+ (context (liberime-get-context))
+ (composition (alist-get 'composition context))
+ (length (alist-get 'length composition)))
+ (cond
+ ;; 有新输入的顶屏模式
+ ((and commit (eq length 1))
+ `(:select last :replace-with ,commit))
+ ;; 无新输入的顶屏模式
+ (commit
+ `(:select current :replace-with ,commit))
+ (t nil))))))
+
+(add-to-list 'pyim-autoselector 'pyim-autoselector-rime)
+
+(defun pyim-liberime-create-word (codes words)
+ "通过 CODES 和 WORDS 的信息,在 rime 后端重新造词和调整词频。
+比如:
+
+1. CODES -> (\"nihao\" \"ma\")
+2. WORDS -> (\"你好\" \"吗\")
+
+在 rime 后端将生成 “你好吗” 这个词条。"
+ (when (and (listp codes)
+ (listp words)
+ (not (cl-find-if-not #'stringp codes))
+ (not (cl-find-if-not #'stringp words)))
+ (liberime-clear-composition)
+ (dolist (key (string-to-list (mapconcat #'identity codes "")))
+ (liberime-process-key key))
+ (let (word)
+ (while (setq word (pop words))
+ (let ((status t))
+ (while status
+ (let* ((context (liberime-get-context))
+ (menu (alist-get 'menu context))
+ (last-page-p (alist-get 'last-page-p menu))
+ (candidates (alist-get 'candidates menu))
+ (pos (cl-position word candidates :test #'equal)))
+ (cond
+ (pos (liberime-select-candidate pos)
+ (setq status nil))
+ ((or last-page-p
+ (not menu))
+ (setq status nil)
+ (setq words nil))
+ (t (liberime-process-key 65366))))))))))
+
+(defun pyim-create-rime-word (word &optional _prepend _wordcount-handler)
+ "Create WORD at current rime backend.
+ONlY works with quanpin."
+ ;; 判断当前 rime 环境是否支持全拼,如果支持,就添加词条。
+ (ignore-errors
+ (let ((codes (pyim-hanzi2pinyin word nil "-" t nil t)))
+ (when (member "你好" (liberime-search "nihao" 10))
+ (dolist (code codes)
+ (unless (pyim-string-match-p "[^ a-z-]" code)
+ (pyim-liberime-create-word
+ (split-string code "-")
+ (remove "" (split-string word "")))
+ (pyim-terminate-translation:rime)))))))
+
+(advice-add 'pyim-create-word :after #'pyim-create-rime-word)
+
+(defun pyim-liberime-get-code (word input &optional _limit)
+ "Get the code of WORD from the beginning of INPUT.
+`liberime-search' with LIMIT argument is used internal.
+
+NOTE: This is a hacky approach, the better way is let librime
+provide an API.
+
+Please see: https://github.com/rime/librime/issues/349"
+ (cond
+ ;; 处理基于语音的输入法,比如:拼音,这类输入法 preedit 一般用空格
+ ;; 分隔,与汉字一一对应。
+ ((string-match-p
+ (mapconcat #'identity
+ '("pinyin" "luna" "terra" "bopomofo" "stenotype"
+ "jyut6ping3" "wugniu" "soutzoe" "zyenpheng"
+ "sampheng" "clover")
+ "\\|")
+ (alist-get 'schema_id (liberime-get-status)))
+ (unless (liberime-get-preedit)
+ (liberime-search input 1))
+ (let* ((n (length word))
+ (preedit (split-string (liberime-get-preedit) "[ ']+"))
+ (preedit-list (cl-subseq preedit 0 (min n (length preedit))))
+ (i (min (length input) (* n 5)))
+ str)
+ (while (> i 0)
+ (setq str (substring input 0 i))
+ (liberime-search str 1)
+ (if (equal preedit-list (split-string (liberime-get-preedit) "[ ']+"))
+ (setq i 0)
+ (setq i (- i 1))))
+ str))
+ ((string-match-p
+ (mapconcat #'identity
+ '("wubi86" "wubi98")
+ "\\|")
+ (alist-get 'schema_id (liberime-get-status)))
+ (let ((lst (split-string (liberime-get-preedit) "[ ']+"))
+ (str "")
+ words)
+ (while lst
+ (setq str (concat str (pop lst)))
+ (setq words (liberime-search str 20))
+ (when (member word words)
+ (setq lst nil)))
+ (or str input)))
+ ;; 找不到通用的处理方式的话就不做截取处理。
+ (t input)))
+
+(defun pyim-terminate-translation:rime ()
+ (liberime-clear-commit)
+ (liberime-clear-composition))
+
+;; * Footer
+(provide 'pyim-liberime)
+
+;;; pyim.el ends here
diff --git a/pyim.el b/pyim.el
index 1384213..8983e41 100644
--- a/pyim.el
+++ b/pyim.el
@@ -177,20 +177,9 @@
;; 2. 用户可以使用函数 `pyim-scheme-add' 添加自定义双拼方案。
;; 3. 用户可能需要重新设置 `pyim-translate-trigger-char'。
-;; *** 通过 pyim 来支持 rime 所有输入法
+;; *** 使用 rime 输入法
+;; 具体安装和使用方式请查看 pyim-liberime 包的 Commentary 部分。
-;; 1. 安裝配置 liberime 和 pyim,
方式见:[[https://github.com/merrickluo/liberime][liberime]].
-;; 2. 使用 rime 全拼输入法的用户,也可以使用 rime-quanpin scheme,
-;; 这个 scheme 是专门针对 rime 全拼输入法定制的,支持全拼v快捷键。
-;; #+BEGIN_EXAMPLE
-;; (setq pyim-default-scheme 'rime-quanpin)
-;; #+END_EXAMPLE
-;; 3. 如果通过 rime 使用微软双拼,可以用以下设置:
-;; #+BEGIN_EXAMPLE
-;; (liberime-select-schema "double_pinyin_mspy")
-;; (setq pyim-default-scheme 'rime-microsoft-shuangpin)
-;; #+END_EXAMPLE
-;; 默认是用繁体中文,想要改成简体中文的话,可以参考
[[https://github.com/rime/home/wiki/CustomizationGuide#%E4%B8%80%E4%BE%8B%E5%AE%9A%E8%A3%BD%E7%B0%A1%E5%8C%96%E5%AD%97%E8%BC%B8%E5%87%BA][rime
wiki]],或者[[http://wenshanren.org/?p=1070#orgc7dbd8e][这篇博客]]
;; *** 使用五笔输入
;; pyim 支持五笔输入模式,用户可以通过变量 `pyim-default-scheme' 来设定:
@@ -809,7 +798,7 @@ pyim 内建的有三种选词框格式:
:group 'pyim
:type 'integer)
-(defcustom pyim-autoselector '(pyim-autoselector-xingma pyim-autoselector-rime)
+(defcustom pyim-autoselector '(pyim-autoselector-xingma)
"已经启用的自动上屏器.
自动上屏器是一个函数。假设用户已经输入 \"nihao\", 并按下 \"m\" 键,
@@ -1054,16 +1043,6 @@ dcache 文件的方法让 pyim 正常工作。")
但同时产生了无效拼音 king . 用户手动输入的无效拼音无需考虑.
因为用户有即时界面反馈,不可能连续输入无效拼音.")
-(declare-function liberime-get-commit "liberime")
-(declare-function liberime-get-context "liberime")
-(declare-function liberime-clear-commit "liberime")
-(declare-function liberime-clear-composition "liberime")
-(declare-function liberime-search "liberime" (string limit))
-(declare-function liberime-get-preedit "liberime")
-(declare-function liberime-get-status "liberime")
-(declare-function liberime-process-key "liberime" (keycode &optional mask))
-(declare-function liberime-select-candidate "liberime" (num))
-
(defvar pyim-mode-map
(let ((map (make-sparse-keymap))
(i ?\ ))
@@ -1522,8 +1501,7 @@ code 对应的中文词条了."
(pyim-dcache-call-api 'insert-word-into-icode2word word pinyin prepend))
(defun pyim-create-word (word &optional prepend wordcount-handler)
- (pyim-create-pyim-word word prepend wordcount-handler)
- (pyim-create-rime-word word))
+ (pyim-create-pyim-word word prepend wordcount-handler))
(defun pyim-create-pyim-word (word &optional prepend wordcount-handler)
"将中文词条 WORD 添加编码后,保存到用户选择过的词生成的缓存中。
@@ -1568,20 +1546,6 @@ BUG:拼音无法有效地处理多音字。"
;; TODO, 排序个人词库?
)))
-(defun pyim-create-rime-word (word)
- "Create WORD at current rime backend.
-ONlY works with quanpin."
- ;; 判断当前 rime 环境是否支持全拼,如果支持,就添加词条。
- (ignore-errors
- (let ((codes (pyim-hanzi2pinyin word nil "-" t nil t)))
- (when (member "你好" (liberime-search "nihao" 10))
- (dolist (code codes)
- (unless (pyim-string-match-p "[^ a-z-]" code)
- (pyim-liberime-create-word
- (split-string code "-")
- (remove "" (split-string word "")))
- (pyim-terminate-translation:rime)))))))
-
(defun pyim-hanzi2xingma (string scheme-name &optional return-list)
"返回汉字 STRING 对应形码方案 SCHEME-NAME 的 code (不包括
code-prefix)。当RETURN-LIST 设置为 t 时,返回一个 code list。"
@@ -1906,24 +1870,6 @@ Return the input string.
'(:select last))
(t nil)))))
-(defun pyim-autoselector-rime (&rest _args)
- "适用于RIME的自动上屏器."
- (let* ((scheme-name (pyim-scheme-name))
- (class (pyim-scheme-get-option scheme-name :class)))
- (when (eq class 'rime)
- (let* ((commit (liberime-get-commit))
- (context (liberime-get-context))
- (composition (alist-get 'composition context))
- (length (alist-get 'length composition)))
- (cond
- ;; 有新输入的顶屏模式
- ((and commit (eq length 1))
- `(:select last :replace-with ,commit))
- ;; 无新输入的顶屏模式
- (commit
- `(:select current :replace-with ,commit))
- (t nil))))))
-
(defun pyim-self-insert-command ()
"Pyim 版本的 self-insert-command."
(interactive "*")
@@ -1967,7 +1913,7 @@ Return the input string.
(when pyim-candidates-create-timer
(cancel-timer pyim-candidates-create-timer))
;; 延迟1秒异步获取 candidates, pyim 内置的输入法目前不使用异步获取
- ;; 词条的方式,主要用于 rime 支持。
+ ;; 词条的方式,主要用于 pyim-liberime 支持。
(setq pyim-candidates-create-timer
(run-with-timer
1 nil
@@ -2065,12 +2011,10 @@ Return the input string.
(pyim-posframe-valid-p))
(posframe-hide pyim-page-tooltip-posframe-buffer))
(pyim-entered-erase-buffer)
- (when (eq (pyim-scheme-get-option (pyim-scheme-name) :class) 'rime)
- (pyim-terminate-translation:rime)))
-
-(defun pyim-terminate-translation:rime ()
- (liberime-clear-commit)
- (liberime-clear-composition))
+ (let* ((class (pyim-scheme-get-option (pyim-scheme-name) :class))
+ (func (intern (format "pyim-terminate-translation:%S" class))))
+ (when (and class (functionp func))
+ (funcall func))))
;; 分解拼音的相关函数
(defun pyim-pinyin-get-shenmu (pinyin)
@@ -2173,41 +2117,6 @@ Return the input string.
:prefer-trigger-chars "v"))
(pyim-scheme-add
- '(rime
- :document
- "rime 输入法。
-
-这个 scheme 适用于 librime 支持的所有输入法,通用性较好,但无法支
-持 trigger-chars, 所以类似 pyim 全拼支持的v快捷键将无法使用。"
- :class rime
- :code-prefix "&"
- :first-chars "abcdefghijklmnopqrstuvwxyz"
- :rest-chars "abcdefghijklmnopqrstuvwxyz'-a"
- :prefer-trigger-chars nil))
-
-(pyim-scheme-add
- '(rime-quanpin
- :document
- "rime 全拼输入法。
-
-这个 scheme 专门用于 librime 全拼输入法,同时支持 trigger-chars,
-也就是v快捷键,使用 rime 全拼的朋友建议使用这个 scheme。"
- :class rime
- :code-prefix "&"
- :first-chars "abcdefghjklmnopqrstwxyz"
- :rest-chars "vmpfwckzyjqdltxuognbhsrei'-a"
- :prefer-trigger-chars "v"))
-
-(pyim-scheme-add
- '(rime-microsoft-shuangpin
- :document "rime 微软双拼输入法。"
- :class rime
- :code-prefix "&"
- :first-chars "abcdefghijklmnopqrstuvwxyz"
- :rest-chars "abcdefghijklmnopqrstuvwxyz;"
- :prefer-trigger-chars nil))
-
-(pyim-scheme-add
'(wubi
:document "五笔输入法。"
:class xingma
@@ -2435,12 +2344,7 @@ Return the input string.
pyim-default-scheme))
(setq scheme-name pyim-default-scheme))
(if (assq scheme-name pyim-schemes)
- (let ((class (pyim-scheme-get-option scheme-name :class)))
- (if (eq class 'rime)
- (if (featurep 'liberime-core)
- scheme-name
- 'quanpin)
- scheme-name))
+ scheme-name
'quanpin)))
(defun pyim-toggle-assistant-scheme ()
@@ -2565,9 +2469,6 @@ Return the input string.
(split-string entered "'"))
(list (nreverse output)))))
-(defun pyim-imobjs-create:rime (entered &optional _)
- (list (list entered)))
-
(defun pyim-imobjs-find-fuzzy:quanpin (imobjs)
"用于处理模糊音的函数。"
(let (fuzzy-imobjs result1 result2)
@@ -2675,9 +2576,6 @@ Return the input string.
x)))
imobj))))
-(defun pyim-codes-create:rime (imobj scheme-name &optional first-n)
- (pyim-codes-create:xingma imobj scheme-name first-n))
-
(defun pyim-code-search (word scheme-name)
"从 SCHEME-NAME 对应的输入法词库中,搜索 WORD 对应的 code.
@@ -2728,18 +2626,6 @@ IMOBJS 获得候选词条。"
(when (car result)
result))))
-(defun pyim-candidates-create:rime (imobjs scheme-name &optional async)
- "`pyim-candidates-create' 处理 rime 输入法的函数."
- (let* ((code (car (pyim-codes-create (car imobjs) scheme-name)))
- (code-prefix (pyim-scheme-get-option scheme-name :code-prefix))
- (s (replace-regexp-in-string "-" "" code))
- ;; `liberime-search' 搜索的时候不需要 code-prefix, 去除。
- (s (if code-prefix (substring s 1) s))
- (words (liberime-search s (if async
- nil
- (* pyim-page-length 2)))))
- words))
-
(defun pyim-candidates-create:quanpin (imobjs scheme-name &optional async)
"`pyim-candidates-create' 处理全拼输入法的函数."
(unless async
@@ -3168,15 +3054,6 @@ minibuffer 原来显示的信息和 pyim 选词框整合在一起显示
(reverse result)
(or separator " "))))
-(defun pyim-page-preview-create:rime (&optional separator)
- (let* ((preedit (or (liberime-get-preedit)
- (pyim-entered-get 'point-before))))
- (pyim-with-entered-buffer
- (if (equal 1 (point))
- (concat "|" preedit)
- (concat (replace-regexp-in-string (concat separator "'") "'" preedit)
- " |" (buffer-substring-no-properties (point) (point-max)))))))
-
(defun pyim-page-preview-create:xingma (&optional separator)
(let* ((scheme-name (pyim-scheme-name)))
(cl-flet* ((segment (x)
@@ -3400,10 +3277,11 @@ minibuffer 原来显示的信息和 pyim 选词框整合在一起显示
(progn
(pyim-outcome-handle 'last-char)
(pyim-terminate-translation))
- (cl-case (pyim-scheme-get-option (pyim-scheme-name) :class)
- (rime (call-interactively #'pyim-page-select-word:rime))
- (xingma (call-interactively #'pyim-page-select-word:xingma))
- (t (call-interactively #'pyim-page-select-word:pinyin)))))
+ (let* ((class (pyim-scheme-get-option (pyim-scheme-name) :class))
+ (func (intern (format "pyim-page-select-word:%S" class))))
+ (if (and class (functionp func))
+ (funcall func)
+ (call-interactively #'pyim-page-select-word:pinyin)))))
(defun pyim-page-select-word:pinyin ()
"从选词框中选择当前词条,然后删除该词条对应拼音。"
@@ -3495,124 +3373,6 @@ minibuffer 原来显示的信息和 pyim 选词框整合在一起显示
;; pyim 使用这个 hook 来处理联想词。
(run-hooks 'pyim-page-select-finish-hook)))
-(defvar pyim-liberime-code-log nil)
-(defvar pyim-liberime-word-log nil)
-(defun pyim-page-select-word:rime ()
- "从选词框中选择当前词条,然后删除该词条对应拼音。"
- (interactive)
- (pyim-outcome-handle 'candidate)
- (let* ((entered (pyim-entered-get 'point-before))
- (word (string-remove-prefix
- (or (pyim-outcome-get 1) "") (pyim-outcome-get)))
- (code (pyim-liberime-get-code word entered))
- (to-be-translated
- (string-remove-prefix code entered)))
- (push code pyim-liberime-code-log)
- (push word pyim-liberime-word-log)
- (if (or (> (length to-be-translated) 0) ;是否有光标前未转换的字符串
- (> (length (pyim-entered-get 'point-after)) 0)) ;是否有光标后字符串
- (progn
- (pyim-with-entered-buffer
- (delete-region (point-min) (point))
- (insert to-be-translated)
- (goto-char (point-max)))
- (pyim-entered-refresh))
- ;; 在 rime 后端造词和调整瓷瓶词频
- (pyim-liberime-create-word
- (reverse pyim-liberime-code-log)
- (reverse pyim-liberime-word-log))
- ;; 使用 rime 的同时,也附带的优化 quanpin 的词库。
- (let ((pyim-default-scheme 'quanpin))
- (if (member (pyim-outcome-get) pyim-candidates)
- (pyim-create-pyim-word (pyim-outcome-get) t)
- (pyim-create-pyim-word (pyim-outcome-get))))
- (setq pyim-liberime-code-log nil)
- (setq pyim-liberime-word-log nil)
- (pyim-terminate-translation)
- ;; pyim 使用这个 hook 来处理联想词。
- (run-hooks 'pyim-page-select-finish-hook))))
-
-(defun pyim-liberime-create-word (codes words)
- "通过 CODES 和 WORDS 的信息,在 rime 后端重新造词和调整词频。
-比如:
-
-1. CODES -> (\"nihao\" \"ma\")
-2. WORDS -> (\"你好\" \"吗\")
-
-在 rime 后端将生成 “你好吗” 这个词条。"
- (when (and (listp codes)
- (listp words)
- (not (cl-find-if-not #'stringp codes))
- (not (cl-find-if-not #'stringp words)))
- (liberime-clear-composition)
- (dolist (key (string-to-list (mapconcat #'identity codes "")))
- (liberime-process-key key))
- (let (word)
- (while (setq word (pop words))
- (let ((status t))
- (while status
- (let* ((context (liberime-get-context))
- (menu (alist-get 'menu context))
- (last-page-p (alist-get 'last-page-p menu))
- (candidates (alist-get 'candidates menu))
- (pos (cl-position word candidates :test #'equal)))
- (cond
- (pos (liberime-select-candidate pos)
- (setq status nil))
- ((or last-page-p
- (not menu))
- (setq status nil)
- (setq words nil))
- (t (liberime-process-key 65366))))))))))
-
-(defun pyim-liberime-get-code (word input &optional _limit)
- "Get the code of WORD from the beginning of INPUT.
-`liberime-search' with LIMIT argument is used internal.
-
-NOTE: This is a hacky approach, the better way is let librime
-provide an API.
-
-Please see: https://github.com/rime/librime/issues/349"
- (cond
- ;; 处理基于语音的输入法,比如:拼音,这类输入法 preedit 一般用空格
- ;; 分隔,与汉字一一对应。
- ((string-match-p
- (mapconcat #'identity
- '("pinyin" "luna" "terra" "bopomofo" "stenotype"
- "jyut6ping3" "wugniu" "soutzoe" "zyenpheng"
- "sampheng" "clover")
- "\\|")
- (alist-get 'schema_id (liberime-get-status)))
- (unless (liberime-get-preedit)
- (liberime-search input 1))
- (let* ((n (length word))
- (preedit (split-string (liberime-get-preedit) "[ ']+"))
- (preedit-list (cl-subseq preedit 0 (min n (length preedit))))
- (i (min (length input) (* n 5)))
- str)
- (while (> i 0)
- (setq str (substring input 0 i))
- (liberime-search str 1)
- (if (equal preedit-list (split-string (liberime-get-preedit) "[ ']+"))
- (setq i 0)
- (setq i (- i 1))))
- str))
- ((string-match-p
- (mapconcat #'identity
- '("wubi86" "wubi98")
- "\\|")
- (alist-get 'schema_id (liberime-get-status)))
- (let ((lst (split-string (liberime-get-preedit) "[ ']+"))
- (str "")
- words)
- (while lst
- (setq str (concat str (pop lst)))
- (setq words (liberime-search str 20))
- (when (member word words)
- (setq lst nil)))
- (or str input)))
- ;; 找不到通用的处理方式的话就不做截取处理。
- (t input)))
(defun pyim-page-select-word-by-number (&optional n)
"使用数字编号来选择对应的词条。"
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [elpa] externals/pyim fb287f2: Split rime support to pyim-liberime.el,
Feng Shu <=