━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ PYIM 是一个 EMACS 中文输入法,支持全拼,双 拼,五笔,仓颉 和 RIME 等 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1 不兼容更新 ════════════ 1.1 <2022-06-15 Wed> Do not require popup in pyim-page.el ────────────────────────────────────────────────────────── popup 是一个非 gnu elpa 包,pyim-page.el 不应该 require 它,需要用户自 己手动require, 使用 popup tooltip 的用户需要在配置中添加: ┌──── │ (require 'popup) └──── 1.2 <2022-06-13 Mon> pyim-dcache-backend 所需的 package 需要用户手工加载了。 ───────────────────────────────────────────────────────────────────────────── 以前 pyim 可以根据 pyim-dcache-backend 的取值自动加载需要的 package, 这样做虽然方便,但代码特别容易出现问题,考虑到 pyim 未来支持的后端不会 有太大变化,我删除了这个功能,为了向后兼容,pyim 目前会自动加载 pyim-dregcache 包, 但这个兼容代码未来可能会删除,所以使用 pyim-dregcache 的用户,建议给自己的配置中添加: ┌──── │ (require 'pyim-dregcache) └──── 1.3 <2022-05-29 Sun> pyim-cregexp-utils, pyim-cstring-utils 和 pyim-dict-manager 需要用户手动 require. ─────────────────────────────────────────────────────────────────────────────────────────────────────── 为降低 pyim 代码的复杂度,减少 pyim 依赖包的数量,下面三个包不会自动加 载,需要用户手动 require. 1. pyim-cregexp-utils 2. pyim-cstring-utils 3. pyim-dict-manager (使用 elpa 安装词库,或者手动管理 pyim-dicts 变量 的用户不需要这个包) 1.4 <2021-04-28 Wed> 五笔输入法和仓颉输入法的不兼容更新 ──────────────────────────────────────────────────────── 五笔输入法和仓颉输入法原来使用一个标点符号作为 code-prefix, 现在使用 "wubi/" 和"cangjie/" 这种形式的 code-prefix, 这样可以减少不同输入法误 用同一个 code-prefix带来的词库冲突。 五笔输入法的 scheme 设置已经移到 pyim-wbdict 包,仓颉输入法的 scheme 设置已经移到 pyim-cangjie5dict 包。 使用上述两个包的用户,此次变更不受影响,因为两个包使用新的 code-prefix. 受影响的是自己维护五笔和仓颉词库用户,这些用户需要做以下更新: 1. 五笔用户 1. 需要 (require 'pyim-wbdict), 加载五笔 scheme 设置。 2. 需要将自己的五笔词库文件中的 code-prefix "." 替换为 "wubi/". 3. 运行 `pyim-upgrade' 命令,升级 icode2word 词库缓存。 2. 仓颉用户 1. 需要 (require 'pyim-cangjie5dict), 加载仓颉 scheme 设置。 2. 需要将自己的五笔词库文件中的 code-prefix "@" 替换为 "cangjie/". 2 截图 ══════ 3 简介 ══════ pyim 是 Emacs 环境下的一个中文输入法,最初这个输入法只支持全拼输入,后 来根据同学的提议,添加了五笔等输入法的支持,“pyim” 现在可以理解为: (Peng You input method) 4 背景 ══════ pyim 源于 Emacs-eim。 Emacs-eim 是 Emacs 环境下的一个中文输入法框架, 支持拼音,五笔,仓颉, 二笔等多种输入法,但遗憾的是,2008 年之后它就停止了开发。 虽然外部输入法功能强大,但不能和 Emacs 默契的配合,这一点极大的损害了 Emacs 那种*行云流水* 的感觉。而本人在使用 Emacs-eim 的过程中发现: 1. *当 Emacs-eim 词库词条很大时,选词频率大大降低,中文体验增强。* 2. *随着使用时间的延长,Emacs-eim 会越来越好用(个人词库的积累)。* 于是我 fork 了 Emacs-eim 输入法的部分代码, 创建了新项目:pyim。 5 目标 ══════ pyim 的目标是: *尽最大的努力成为一个好用的 Emacs 中文输入法* ,具体可 表现为三个方面: 1. Fallback: 当外部输入法不能使用时,比如在 console 或者 cygwin 环境下, 尽最大可能让 Emacs 用户不必为输入中文而烦恼。 2. Integration: 尽最大可能减少输入法切换频率,让中文输入不影响 Emacs 的体验。 3. Exchange: 尽最大可能简化 pyim 使用其他优秀输入法的词库的难度和复杂 度。 6 特点 ══════ 1. pyim 支持全拼,双拼,五笔和仓颉等输入法,其中对全拼的支持最好。 2. pyim 通过添加词库的方式优化输入法。 3. pyim 使用文本词库格式,方便处理。 4. pyim 可以作为 rime 的前端使用。 7 安装 ══════ 1. M-x package-install RET pyim RET 2. 在 Emacs 配置文件中(比如: ~/.emacs)添加如下代码: ┌──── │ (require 'pyim) │ (require 'pyim-basedict) ; 拼音词库设置,五笔用户 *不需要* 此行设置 │ (pyim-basedict-enable) ; 拼音词库,五笔用户 *不需要* 此行设置 │ (setq default-input-method "pyim") └──── 8 配置 ══════ 8.1 配置实例 ──────────── 对 pyim 感兴趣的同学,可以看看本人的 pyim 配置,但要注意不要乱抄探针配 置。 ┌──── │ (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-" 将光标前的 regexp 转换为可以搜索中文的 regexp. │ (define-key minibuffer-local-map (kbd "C-") '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) └──── 8.2 添加词库文件 ──────────────── pyim 默认使用 pyim-basedict 词库, 这个词库的词条量8万左右,是一个 *非 常小* 的拼音词库,源于:libpinyin 项目 如果 pyim-basedict 不能满足需求,用户可以使用其他方式为 pyim 添加拼音 词库,具体方式请参考 小结。 8.3 激活 pyim ───────────── ┌──── │ (setq default-input-method "pyim") │ (global-set-key (kbd "C-\\") 'toggle-input-method) └──── 9 使用 ══════ 9.1 常用快捷键 ────────────── ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 输入法快捷键 功能 ─────────────────────────────────────────────────── 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 以词定字 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.2 使用云输入法 ──────────────── pyim 可以使用搜索引擎提供的云输入法服务,比如: ┌──── │ (setq pyim-cloudim 'baidu) │ ;; (setq pyim-cloudim 'google) └──── 9.3 使用双拼模式 ──────────────── pyim 支持双拼输入模式,用户可以通过变量 `pyim-default-scheme' 来设定: ┌──── │ (pyim-default-scheme 'pyim-shuangpin) └──── 注意: 1. pyim 支持微软双拼(microsoft-shuangpin)和小鹤双拼 (xiaohe-shuangpin)。 2. 用户可以使用函数 `pyim-scheme-add' 添加自定义双拼方案。 3. 用户可能需要重新设置 `pyim-outcome-trigger'。 9.4 使用 rime 输入法 ──────────────────── 具体安装和使用方式请查看 pyim-liberime 包的 Commentary 部分。 9.5 使用型码输入法 ────────────────── 1. 五笔输入法可以参考: 2. 仓颉输入法可以参考: 3. 三码郑码(至至郑码)输入法可以参考: 如果用户在使用型码输入法的过程中,忘记了某个字的编码,可以按 TAB 键临 时切换到辅助输入法来输入,辅助输入法可以通过 `pyim-assistant-scheme' 来设置。 9.6 让选词框跟随光标 ──────────────────── 用户可以通过下面的设置让 pyim 在 *光标处* 显示一个选词框: 1. 使用 popup 或者 popon 包来绘制选词框 (emacs overlay 机制) ┌──── │ (require 'popup) │ (setq pyim-page-tooltip 'popup) └──── ┌──── │ (require 'popon) │ (setq pyim-page-tooltip 'popon) └──── 2. 使用 posframe 来绘制选词框 ┌──── │ (require 'posframe) │ (setq pyim-page-tooltip 'posframe) └──── 注意:pyim 不会自动安装 posframe, 用户需要手动安装这个包, 3. 按照优先顺序自动选择一个可用的 tooltip ┌──── │ (setq pyim-page-tooltip '(posframe popup minibuffer)) └──── 9.7 调整 tooltip 选词框的显示样式 ───────────────────────────────── pyim 的选词框默认使用 *双行显示* 的样式,在一些特殊的情况下(比如: popup 显示的菜单错位),用户可以使用 *单行显示*的样式: ┌──── │ (setq pyim-page-style 'one-line) └──── 9.8 设置模糊音 ────────────── 可以通过设置 `pyim-pinyin-fuzzy-alist' 变量来自定义模糊音。 9.9 使用魔术转换器 ────────────────── 用户可以将待选词 “特殊处理” 后再 “上屏”,比如 “简体转繁体” 或者 “输入 中文,上屏英文” 之类的。 用户需要设置 `pyim-outcome-magic-converter', 比如:下面这个例子实现, 输入 “二呆”,“一个超级帅的小伙子” 上屏 :-) ┌──── │ (defun my-converter (string) │ (if (equal string "二呆") │ "“一个超级帅的小伙子”" │ string)) │ (setq pyim-outcome-magic-converter #'my-converter) └──── 9.10 切换全角标点与半角标点 ─────────────────────────── 1. 第一种方法:使用命令 `pyim-punctuation-toggle',全局切换。这个命令 主要用来设置变量: `pyim-punctuation-translate-p', 用户也可以手动设 置这个变量, 比如: ┌──── │ (setq-default pyim-punctuation-translate-p '(yes)) ;使用全角标点。 │ (setq-default pyim-punctuation-translate-p '(no)) ;使用半角标点。 │ (setq-default pyim-punctuation-translate-p '(auto)) ;中文使用全角标点,英文使用半角标点。 └──── 2. 第二种方法:使用命令 `pyim-punctuation-translate-at-point' 只切换光 标处标点的样式。 3. 第三种方法:设置变量 `pyim-outcome-trigger' ,输入变量设定的字符会 切换光标处标点的样式。 9.11 手动加词和删词 ─────────────────── 1. `pyim-convert-string-at-point' 金手指命令,可以比较方便的添加和删除 词条,比如: 1. 在 "你好" 后面输入2, 然后运行金手指命令,可以将 “你好” 加入个人 词库。 2. 在 “你好” 后面输入2-, 然后运行金手指命令,可以将 “你好” 从个人词 库删除。 3. 如果用户选择了一个词条,则运行金手指命令可以将选择的词条加入个人 词库。 2. `pyim-create-Ncchar-word-at-point' 这是一组命令,从光标前提取N个汉 字字符组成字符串,并将其加入个人词库。 3. `pyim-outcome-trigger' 以默认设置为例:在 “我爱吃红烧肉” 后输入 “5v”,可以将“爱吃红烧肉”这个词条保存到用户个人词库。 4. `pyim-create-word-from-selection', 选择一个词条,运行这个命令后,就 可以将这个词条添加到个人词库。 5. `pyim-delete-word' 从个人词库中删除当前高亮选择的词条。 9.12 pyim 输入状态指示器 ──────────────────────── pyim 输入状态指示器可以帮助用户快速了解当前 pyim 是处于英文输入状态还 是中文输入状态,因为 pyim probe 探针功能可以让中英文输入状态动态切换, 所以快速了解当前中英文输入状态有时候显得很重要。 pyim 当前内置两种指示器实现方式: 1. 改变光标颜色: pyim-indicator-with-cursor-color, 用户可以使用变量 pyim-indicator-cursor-color 来配置两种输入状态对应的光标颜色。 2. 使用 modeline 显示状态字符串:pyim-indicator-with-mode-line, 用户可 以使用变量pyim-indicator-modeline-string 来配置两种状态对应的显示字 符串。 设置默认启用的指示器有两个,用户可以使用下面的变量调整: ┌──── │ (setq pyim-indicator-list (list #'pyim-indicator-with-cursor-color #'pyim-indicator-with-modeline)) └──── 注意事项: 1. 用户切换 emacs 主题之后,最好重启 pyim 一下。 2. pyim-indicator-with-cursor-color 这个 indicator 很容易和其它设置 cursor 颜色的包冲突,因为都调用 set-cursor-color,遇到这种情况后, 用户需要自己解决冲突,pyim-indicator 提供了一个简单的机制: ┌──── │ (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")))) └──── 9.13 pyim 高级功能 ────────────────── 1. 根据环境自动切换到英文输入模式,使用 pyim-english-input-switch-functions 配置。 2. 根据环境自动切换到半角标点输入模式,使用 pyim-punctuation-half-width-functions 配置。 3. 如果想在某种环境下强制输入中文,可以使用 pyim-force-input-chinese-functions来配置,这个设置可以屏蔽掉 pyim-english-input-switch-functions 的设置。 注意:上述两个功能使用不同的变量设置, *千万不要搞错* 。 9.13.1 根据环境自动切换到英文输入模式 ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 探针函数 功能说明 ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── pyim-probe-program-mode 如果当前的 mode 衍生自 prog-mode,那么仅仅在字符串和 comment 中开启中文输入模式 ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── pyim-probe-org-speed-commands 解决 org-speed-commands 与 pyim 冲突问题 pyim-probe-isearch-mode 使用 isearch 搜索时,强制开启英文输入模式 注意:想要使用这个功能,pyim-isearch-mode 必须激活 ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── pyim-probe-org-structure-template 使用 org-structure-template 时,关闭中文输入模式 ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── 1. 当前字符为中文字符时,输入下一个字符时默认开启中文输入 pyim-probe-dynamic-english 2. 当前字符为其他字符时,输入下一个字符时默认开启英文输入 3. 使用命令 pyim-convert-string-at-point 可以将光标前的拼音字符串强制转换为中文。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 激活方式: ┌──── │ (setq-default pyim-english-input-switch-functions │ '(probe-function1 probe-function2 probe-function3)) └──── 注意事项: 1. 上述函数列表中,任意一个函数的返回值为 t 时,pyim 切换到英文输入模 式。 2. [Emacs-rime] 和 [smart-input-source] 也有类似探针的功能,其对应函数 可以直接或者简单包装后作为 pyim 探针使用,有兴趣的同学可以了解一下。 [Emacs-rime] [smart-input-source] 9.13.2 根据环境自动切换到半角标点输入模式 ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 探针函数 功能说明 ────────────────────────────────────────────────────────────────────── pyim-probe-punctuation-line-beginning 行首强制输入半角标点 ────────────────────────────────────────────────────────────────────── pyim-probe-punctuation-after-punctuation 半角标点后强制输入半角标点 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 激活方式: ┌──── │ (setq-default pyim-punctuation-half-width-functions │ '(probe-function4 probe-function5 probe-function6)) └──── 注:上述函数列表中,任意一个函数的返回值为 t 时,pyim 切换到半角标点输 入模式。 10 开发 ═══════ 请参考 [Development.org] 文档 [Development.org] 11 试用 ═══════ 在pyim项目根目录运行shell命令 `make runemacs' 试用最新的pyim。 只有pyim和其依赖的包被载入。用户自己的emacs配置不会被载入。 指定运行的Emacs版本用以下命令, ┌──── │ EMACS=~/my-whatever-directory/bin/emacs make runemacs └──── Emacs启动后 "M-x toggle-input-method" 或按 "C-\\" 打开输入法。 12 Tips ═══════ 12.1 pyim 有时候会出现卡顿,如何处理。 ────────────────────────────────────── 可以将云搜词和当前 buffer 搜词功能关闭试试看。 ┌──── │ (setq pyim-cloudim nil) │ (setq pyim-candidates-search-buffer-p nil) └──── 12.2 如何快速切换 scheme ──────────────────────── 可以试试 pyim-default-scheme 命令。 12.3 关闭输入联想词功能 (默认开启) ────────────────────────────────── ┌──── │ (setq pyim-enable-shortcode nil) └──── 12.4 如何将个人词条相关信息导入和导出? ─────────────────────────────────────── 1. 导入使用命令: pyim-dcache-import 2. 导出使用命令: pyim-dcache-export 12.5 pyim 出现错误时,如何开启 debug 模式 ───────────────────────────────────────── ┌──── │ (setq debug-on-error t) └──── 12.6 将光标处的拼音或者五笔字符串转换为中文 (与 vimim 的 “点石成金” 功能类似) ───────────────────────────────────────────────────────────────────────────── ┌──── │ (global-set-key (kbd "M-i") 'pyim-convert-string-at-point) └──── 12.7 如何使用其它字符翻页 ───────────────────────── ┌──── │ (define-key pyim-mode-map "." 'pyim-page-next-page) │ (define-key pyim-mode-map "," 'pyim-page-previous-page) └──── 12.8 如何用 ";" 来选择第二个候选词 ────────────────────────────────── ┌──── │ (define-key pyim-mode-map ";" │ (lambda () │ (interactive) │ (pyim-select-word-by-number 2))) └──── 12.9 如何添加自定义拼音词库 ─────────────────────────── pyim 默认没有携带任何拼音词库,用户可以使用下面几种方式,获取质量较好 的拼音词库: 12.9.1 第一种方式 (Windows 用户推荐使用) ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ 使用词库转换工具将其他输入法的词库转化为 pyim 使用的词库:这里只介绍 windows 平台下的一个词库转换软件: 1. 软件名称: imewlconverter 2. 中文名称: 深蓝词库转换 3. 下载地址: 4. 依赖平台: Microsoft .NET Framework (>= 3.5) 使用方式: 如果生成的词库词频不合理,可以按照下面的方式处理(非常有用的功能): 生成词库后, ┌──── │ (require 'pyim-dict-manager) └──── 然后运行 `pyim-dicts-manager' ,按照命令提示,将转换得到的词库文件的信 息添加到`pyim-dicts' 中,完成后运行命令 `pyim-restart' 或者重启emacs。 12.9.2 第二种方式 (Linux & Unix 用户推荐使用) ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ E-Neo 同学编写了一个词库转换工具: [scel2pyim] , 可以将一个搜狗词库转换 为 pyim 词库。 1. 软件名称: scel2pyim 2. 下载地址: 3. 编写语言: C语言 [scel2pyim] 12.9.3 第三种方式 ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ 可以了解: 12.10 如何手动安装和管理词库 ──────────────────────────── 这里假设有两个词库文件: 1. /path/to/pyim-dict1.pyim 2. /path/to/pyim-dict2.pyim 在 ~/.emacs 文件中添加如下一行配置。 ┌──── │ (setq pyim-dicts │ '((:name "dict1" :file "/path/to/pyim-dict1.pyim") │ (:name "dict2" :file "/path/to/pyim-dict2.pyim"))) └──── 注意事项: 1. 只有 :file 是 *必须* 设置的。 2. 必须使用词库文件的绝对路径。 3. 词库文件的编码必须为 utf-8-unix,否则会出现乱码。 12.11 Emacs 启动时加载 pyim 词库 ──────────────────────────────── ┌──── │ (add-hook 'emacs-startup-hook │ (lambda () (pyim-restart-1 t))) └──── 12.12 将汉字字符串转换为拼音字符串 ────────────────────────────────── 下面两个函数可以将中文字符串转换的拼音字符串或者列表,用于 emacs-lisp 编程。 1. `pyim-cstring-to-pinyin' (尽可能处理多音字,但有可能得到多个拼音) 2. `pyim-cstring-to-pinyin-simple' (尽可能处理多音字,但是只从可能的 拼音中获取第一个拼音) 12.13 中文分词 ────────────── pyim-cstring-utils 包含了一个简单的分词函数: `pyim-cstring-split-to-list', 可以将一个中文字符串分成一个词条列表,比 如: ┌──── │ (require 'pyim-cstring-utils) │ (pyim-cstring-split-to-list "我爱北京天安门") └──── 其中,每一个词条列表中包含三个元素,第一个元素为词条本身,第二个元素为 词条相对于字符串的起始位置,第三个元素为词条结束位置。 另一个分词函数是 `pyim-cstring-split-to-string', 这个函数将生成一个新 的字符串,在这个字符串中,词语之间用空格或者用户自定义的分隔符隔开。 注意,上述两个分词函数使用暴力匹配模式来分词,所以,*不能检测出* pyim 词库中不存在的中文词条。 12.14 获取光标处的中文词条 ────────────────────────── pyim-cstring-utils 包含了一个简单的命令: `pyim-cstring-words-at-point', 这个命令可以得到光标处的 *英文* 或者 * 中文* 词条的 *列表*,这个命令依赖分词函数: `pyim-cstring-split-to-list'。 12.15 让 `forward-word' 和 `back-backward’ 在中文环境下正常工作 ─────────────────────────────────────────────────────────────── 中文词语没有强制用空格分词,所以 Emacs 内置的命令 `forward-word' 和 `backward-word' 在中文环境不能按用户预期的样子执行,而是 forward/backward “句子”,pyim自带的两个命令可以在中文环境下正常工作: 1. `pyim-forward-word 2. `pyim-backward-word 用户只需将其绑定到快捷键上就可以了,比如: ┌──── │ (require 'pyim-cstring-utils) │ (global-set-key (kbd "M-f") 'pyim-forward-word) │ (global-set-key (kbd "M-b") 'pyim-backward-word) └──── 12.16 为 isearch 相关命令添加拼音搜索支持 ───────────────────────────────────────── pyim 安装后,可以通过下面的设置开启拼音搜索功能: ┌──── │ (require 'pyim-cregexp-utils) │ (pyim-isearch-mode 1) └──── 注意:这个功能有一些限制,搜索字符串中只能出现 “a-z” 和 “'”,如果有其 他字符(比如 regexp 操作符),则自动关闭拼音搜索功能。 开启这个功能后,一些 isearch 扩展有可能失效,如果遇到这种问题,只能禁 用这个 Minor-mode,然后联系 pyim 的维护者,看有没有法子实现兼容。 用户激活这个 mode 后,可以使用下面的方式 *强制关闭* isearch 搜索框中文 输入(即使在 pyim 激活的时候)。 ┌──── │ (setq-default pyim-english-input-switch-functions │ '(pyim-probe-isearch-mode)) └──── 12.17 创建一个搜索中文的 regexp ─────────────────────────────── ┌──── │ (pyim-cregexp-build ".*nihao.*") └──── 12.18 让 ivy 支持拼音搜索候选项功能 ─────────────────────────────────── ┌──── │ (require 'pyim-cregexp-utils) │ (setq ivy-re-builders-alist │ '((t . pyim-cregexp-ivy))) └──── 12.19 让 avy 支持拼音搜索 ───────────────────────── ┌──── │ (with-eval-after-load 'avy │ (defun my-avy--regex-candidates (fun regex &optional beg end pred group) │ (let ((regex (pyim-cregexp-build regex))) │ (funcall fun regex beg end pred group))) │ (advice-add 'avy--regex-candidates :around #'my-avy--regex-candidates)) └──── 12.20 让 vertico, selectrum 等补全框架,通过 orderless 支持拼音搜索候选项功能。 ─────────────────────────────────────────────────────────────────────────────── ┌──── │ (defun my-orderless-regexp (orig-func component) │ (let ((result (funcall orig-func component))) │ (pyim-cregexp-build result))) │ │ (advice-add 'orderless-regexp :around #'my-orderless-regexp) └────