Pyim
一个 emacs 中文输入法,支持全拼,双拼,五笔,仓颉和Rime,pyim 是 GNU elpa 包。
Install / Use
/learn @tumashu/PyimREADME
Created 2021-04-23 Fri 09:25
#+TITLE: PYIM 是一个 Emacs 中文输入法,支持全拼,双拼,五笔,仓颉 和 Rime 等 #+AUTHOR: Feng Shu
#+html: <a href="https://github.com/tumashu/pyim/actions/workflows/test.yml"><img alt="Github Action" src="https://github.com/tumashu/pyim/actions/workflows/test.yml/badge.svg"/></a> #+html: <a href="http://elpa.gnu.org/packages/pyim.html"><img alt="GNU ELPA" src="https://elpa.gnu.org/packages/pyim.svg"/></a> #+html: <a href="http://elpa.gnu.org/devel/pyim.html"><img alt="GNU-devel ELPA" src="https://elpa.gnu.org/devel/pyim.svg"/></a> #+html: <a href="https://melpa.org/#/pyim"><img alt="MELPA" src="https://melpa.org/packages/pyim-badge.svg"/></a>
- 不兼容更新
** <2022-06-15 Wed> Do not require popup in pyim-page.el popup 是一个非 gnu elpa 包,pyim-page.el 不应该 require 它,需要用户自己手动 require, 使用 popup tooltip 的用户需要在配置中添加:
#+begin_src elisp (require 'popup) #+end_src
** <2022-06-13 Mon> pyim-dcache-backend 所需的 package 需要用户手工加载了。
以前 pyim 可以根据 pyim-dcache-backend 的取值自动加载需要的 package, 这样做虽然 方便,但代码特别容易出现问题,考虑到 pyim 未来支持的后端不会有太大变化,我删除了 这个功能,为了向后兼容,pyim 目前会自动加载 pyim-dregcache 包, 但这个兼容代码未 来可能会删除,所以使用 pyim-dregcache 的用户,建议给自己的配置中添加:
#+begin_src elisp (require 'pyim-dregcache) #+end_src
** <2022-05-29 Sun> pyim-cregexp-utils, pyim-cstring-utils 和 pyim-dict-manager 需要用户手动 require.
为降低 pyim 代码的复杂度,减少 pyim 依赖包的数量,下面三个包不会自动加载,需要用 户手动 require.
- pyim-cregexp-utils
- pyim-cstring-utils
- pyim-dict-manager (使用 elpa 安装词库,或者手动管理 pyim-dicts 变量的用户不需要这个包)
** <2021-04-28 Wed> 五笔输入法和仓颉输入法的不兼容更新
五笔输入法和仓颉输入法原来使用一个标点符号作为 code-prefix, 现在使用 "wubi/" 和 "cangjie/" 这种形式的 code-prefix, 这样可以减少不同输入法误用同一个 code-prefix 带来的词库冲突。
五笔输入法的 scheme 设置已经移到 pyim-wbdict 包,仓颉输入法的 scheme 设置已经移 到 pyim-cangjie5dict 包。
使用上述两个包的用户,此次变更不受影响,因为两个包使用新的 code-prefix.
受影响的是自己维护五笔和仓颉词库用户,这些用户需要做以下更新:
- 五笔用户
- 需要 (require 'pyim-wbdict), 加载五笔 scheme 设置。
- 需要将自己的五笔词库文件中的 code-prefix "." 替换为 "wubi/".
- 运行 `pyim-upgrade' 命令,升级 icode2word 词库缓存。
- 仓颉用户
- 需要 (require 'pyim-cangjie5dict), 加载仓颉 scheme 设置。
- 需要将自己的五笔词库文件中的 code-prefix "@" 替换为 "cangjie/".
-
截图 [[file:./snapshots/pyim-linux-x-with-toolkit.png]]
-
简介 pyim 是 Emacs 环境下的一个中文输入法,最初这个输入法只支持全拼输入,后来根据同学 的提议,添加了五笔等输入法的支持,“pyim” 现在可以理解为:
#+begin_center (Peng You input method) #+end_center
- 背景 pyim 源于 Emacs-eim。
Emacs-eim 是 Emacs 环境下的一个中文输入法框架, 支持拼音,五笔,仓颉,二笔等多种 输入法,但遗憾的是,2008 年之后它就停止了开发。
虽然外部输入法功能强大,但不能和 Emacs 默契的配合,这一点极大的损害了 Emacs 那种 行云流水 的感觉。而本人在使用 Emacs-eim 的过程中发现:
- 当 Emacs-eim 词库词条很大时,选词频率大大降低,中文体验增强。
- 随着使用时间的延长,Emacs-eim 会越来越好用(个人词库的积累)。
于是我 fork 了 Emacs-eim 输入法的部分代码, 创建了新项目:pyim。
- 目标 pyim 的目标是: 尽最大的努力成为一个好用的 Emacs 中文输入法 , 具体可表现为三个方面:
- Fallback: 当外部输入法不能使用时,比如在 console 或者 cygwin 环境下,尽最大可 能让 Emacs 用户不必为输入中文而烦恼。
- Integration: 尽最大可能减少输入法切换频率,让中文输入不影响 Emacs 的体验。
- Exchange: 尽最大可能简化 pyim 使用其他优秀输入法的词库的难度和复杂度。
- 特点
- pyim 支持全拼,双拼,五笔和仓颉等输入法,其中对全拼的支持最好。
- pyim 通过添加词库的方式优化输入法。
- pyim 使用文本词库格式,方便处理。
- pyim 可以作为 rime 的前端使用。
- 安装
- M-x package-install RET pyim RET
- 在 Emacs 配置文件中(比如: ~/.emacs)添加如下代码: #+begin_example (require 'pyim) (require 'pyim-basedict) ; 拼音词库设置,五笔用户 不需要 此行设置 (pyim-basedict-enable) ; 拼音词库,五笔用户 不需要 此行设置 (setq default-input-method "pyim") #+end_example
- 配置
** 配置实例 对 pyim 感兴趣的同学,可以看看本人的 pyim 配置,但要注意不要乱抄探针配置。
#+begin_src elisp (require 'pyim) (require 'pyim-basedict) (require 'pyim-cregexp-utils)
;; 如果使用 popup page tooltip, 就需要加载 popup 包。 ;; (require 'popup nil t) ;; (setq pyim-page-tooltip 'popup)
;; 如果使用 pyim-dregcache dcache 后端,就需要加载 pyim-dregcache 包。 ;; (require 'pyim-dregcache) ;; (setq pyim-dcache-backend 'pyim-dregcache)
;; 加载 basedict 拼音词库。 (pyim-basedict-enable)
;; 将 Emacs 默认输入法设置为 pyim. (setq default-input-method "pyim")
;; 显示 5 个候选词。 (setq pyim-page-length 5)
;; 金手指设置,可以将光标处的编码(比如:拼音字符串)转换为中文。 (global-set-key (kbd "M-j") 'pyim-convert-string-at-point)
;; 按 "C-<return>" 将光标前的 regexp 转换为可以搜索中文的 regexp. (define-key minibuffer-local-map (kbd "C-<return>") 'pyim-cregexp-convert-at-point)
;; 设置 pyim 默认使用的输入法策略,我使用全拼。 (pyim-default-scheme 'quanpin) ;; (pyim-default-scheme 'wubi) ;; (pyim-default-scheme 'cangjie)
;; 设置 pyim 是否使用云拼音 ;; (setq pyim-cloudim 'baidu)
;; 设置 pyim 探针 ;; 设置 pyim 探针设置,这是 pyim 高级功能设置,可以实现 无痛 中英文切换 :-) ;; 我自己使用的中英文动态切换规则是: ;; 1. 光标只有在注释里面时,才可以输入中文。 ;; 2. 光标前是汉字字符时,才能输入中文。 ;; 3. 使用 M-j 快捷键,强制将光标前的拼音字符串转换为中文。 ;; (setq-default pyim-english-input-switch-functions ;; '(pyim-probe-dynamic-english ;; pyim-probe-isearch-mode ;; pyim-probe-program-mode ;; pyim-probe-org-structure-template))
;; (setq-default pyim-punctuation-half-width-functions ;; '(pyim-probe-punctuation-line-beginning ;; pyim-probe-punctuation-after-punctuation))
;; 开启代码搜索中文功能(比如拼音,五笔码等) (pyim-isearch-mode 1) #+end_src
** 添加词库文件 pyim 默认使用 pyim-basedict 词库, 这个词库的词条量8万左右,是一个 非常小 的拼 音词库,源于:libpinyin 项目
如果 pyim-basedict 不能满足需求,用户可以使用其他方式为 pyim 添加拼音词库,具体 方式请参考 [[#如何添加自定义拼音词库][如何添加自定义拼音词库]] 小结。
** 激活 pyim
#+begin_example (setq default-input-method "pyim") (global-set-key (kbd "C-\") 'toggle-input-method) #+end_example
- 使用 ** 常用快捷键 | 输入法快捷键 | 功能 | |-----------------------+----------------------------| | C-n 或 M-n 或 + 或 . | 向下翻页 | | C-p 或 M-p 或 - 或 , | 向上翻页 | | C-f | 选择下一个备选词 | | C-b | 选择上一个备选词 | | SPC | 确定输入 | | RET 或 C-m | 字母上屏 | | C-c | 取消输入 | | C-g | 取消输入并保留已输入的中文 | | TAB | 模糊音调整 | | DEL 或 BACKSPACE | 删除最后一个字符 | | C-DEL 或 C-BACKSPACE | 删除最后一个拼音 | | M-DEL 或 M-BACKSPACE | 删除最后一个拼音 | | F1,F2,F3,F4 | 以词定字 | ** 使用云输入法 pyim 可以使用搜索引擎提供的云输入法服务,比如:
#+begin_example (setq pyim-cloudim 'baidu) ;; (setq pyim-cloudim 'google) #+end_example
** 使用双拼模式 pyim 支持双拼输入模式,用户可以通过变量 `pyim-default-scheme' 来设定:
#+begin_example (pyim-default-scheme 'pyim-shuangpin) #+end_example
注意:
- pyim 支持微软双拼(microsoft-shuangpin)和小鹤双拼(xiaohe-shuangpin)。
- 用户可以使用函数 `pyim-scheme-add' 添加自定义双拼方案。
- 用户可能需要重新设置 `pyim-outcome-trigger'。
** 使用 rime 输入法 具体安装和使用方式请查看 pyim-liberime 包的 Commentary 部分。
** 使用型码输入法
- 五笔输入法可以参考: https://github.com/tumashu/pyim-wbdict
- 仓颉输入法可以参考:https://github.com/p1uxtar/pyim-cangjiedict
- 三码郑码(至至郑码)输入法可以参考: https://github.com/p1uxtar/pyim-smzmdict
如果用户在使用型码输入法的过程中,忘记了某个字的编码,可以按 TAB 键临时切换到辅 助输入法来输入,辅助输入法可以通过 `pyim-assistant-scheme' 来设置。
** 让选词框跟随光标 用户可以通过下面的设置让 pyim 在 光标处 显示一个选词框:
-
使用 popup 或者 popon 包来绘制选词框 (emacs overlay 机制) #+begin_example (require 'popup) (setq pyim-page-tooltip 'popup) #+end_example
#+begin_example (require 'popon) (setq pyim-page-tooltip 'popon) #+end_example
-
使用 posframe 来绘制选词框 #+begin_example (require 'posframe) (setq pyim-page-tooltip 'posframe) #+end_example 注意:pyim 不会自动安装 posframe, 用户需要手动安装这个包,
-
按照优先顺序自动选择一个可用的 tooltip #+begin_example (setq pyim-page-tooltip '(posframe popup minibuffer)) #+end_example
** 调整 tooltip 选词框的显示样式 pyim 的选词框默认使用 双行显示 的样式,在一些特殊的情况下(比如:popup 显示的 菜单错位),用户可以使用 单行显示的样式:
#+begin_example (setq pyim-page-style 'one-line) #+end_example
** 设置模糊音 可以通过设置 `pyim-pinyin-fuzzy-alist' 变量来自定义模糊音。
** 使用魔术转换器 用户可以将待选词 “特殊处理” 后再 “上屏”,比如 “简体转繁体” 或者 “输入中文,上屏 英文” 之类的。
用户需要设置 `pyim-outcome-magic-converter', 比如:下面这个例子实现,输入 “二呆”, “一个超级帅的小伙子” 上屏 :-)
#+begin_example (defun my-converter (string) (if (equal string "二呆") "“一个超级帅的小伙子”" string)) (setq pyim-outcome-magic-converter #'my-converter) #+end_example
** 切换全角标点与半角标点
-
第一种方法:使用命令
pyim-punctuation-toggle',全局切换。这个命令主要用来设 置变量:pyim-punctuation-translate-p', 用户也可以手动设置这个变量, 比如:#+begin_example (setq-default pyim-punctuation-translate-p '(yes)) ;使用全角标点。 (setq-default pyim-punctuation-translate-p '(no)) ;使用半角标点。 (setq-default pyim-punctuation-translate-p '(auto)) ;中文使用全角标点,英文使用半角标点。 #+end_example
-
第二种方法:使用命令 `pyim-punctuation-translate-at-point' 只切换光标处标点的 样式。
-
第三种方法:设置变量 `pyim-outcome-trigger' ,输入变量设定的字符会切换光标处 标点的样式。
** 手动加词和删词
- `pyim-convert-string-at-point' 金手指命令,可以比较方便的添加和删除词条,比如:
- 在 "你好" 后面输入2, 然后运行金手指命令,可以将 “你好” 加入个人词库。
- 在 “你好” 后面输入2-, 然后运行金手指命令,可以将 “你好” 从个人词库删除。
- 如果用户选择了一个词条,则运行金手指命令可以将选择的词条加入个人词库。
- `pyim-create-Ncchar-word-at-point' 这是一组命令,从光标前提取N个汉字字符组成字 符串,并将其加入个人词库。
- `pyim-outcome-trigger' 以默认设置为例:在 “我爱吃红烧肉” 后输入 “5v”,可以将 “爱吃红烧肉”这个词条保存到用户个人词库。
- `pyim-create-word-from-selection', 选择一个词条,运行这个命令后,就可以将这个 词条添加到个人词库。
- `pyim-delete-word' 从个人词库中删除当前高亮选择的词条。
** pyim 输入状态指示器 pyim 输入状态指示器可以帮助用户快速了解当前 pyim 是处于英文输入状态还是中文输入 状态,因为 pyim probe 探针功能可以让中英文输入状态动态切换,所以快速了解当前中英 文输入状态有时候显得很重要。
pyim 当前内置两种指示器实现方式:
- 改变光标颜色: pyim-indicator-with-cursor-color, 用户可以使用变量 pyim-indicator-cursor-color 来配置两种输入状态对应的光标颜色。
- 使用 modeline 显示状态字符串:pyim-indicator-with-mode-line, 用户可以使用变量 pyim-indicator-modeline-string 来配置两种状态对应的显示字符串。
设置默认启用的指示器有两个,用户可以使用下面的变量调整: #+begin_example (setq pyim-indicator-list (list #'pyim-indicator-with-cursor-color #'pyim-indicator-with-modeline)) #+end_example
注意事项:
-
用户切换 emacs 主题之后,最好重启 pyim 一下。
-
pyim-indicator-with-cursor-color 这个 indicator 很容易和其它设置 cursor 颜色 的包冲突,因为都调用 set-cursor-color,遇到这种情况后,用户需要自己解决冲突, pyim-indicator 提供了一个简单的机制: #+begin_example (setq pyim-indicator-list (list #'my-pyim-indicator-with-cursor-color #'pyim-indicator-with-modeline))
(defun my-pyim-indicator-with-cursor-color (input-method chinese-input-p) (if (not (equal input-method "pyim")) (progn ;; 用户在这里定义 pyim 未激活时的光标颜色设置语句 (set-cursor-color "red")) (if chinese-input-p (progn ;; 用户在这里定义 pyim 输入中文时的光标颜色设置语句 (set-cursor-color "green")) ;; 用户在这里定义 pyim 输入英文时的光标颜色设置语句 (set-cursor-color "blue")))) #+end_example
** pyim 高级功能
- 根据环境自动切换到英文输入模式,使用 pyim-
