Rimel 是一个轻量级的 Emacs 中文输入法,直接基于 liberime 动态模块,
使用 Emacs 内置的 input-method-function 接口和 read-event 循环(与 quail 相同的模式)。
- 📦 单文件:仅
rimel.el一个文件,约 700 行 - 🔌 依赖少:仅依赖 liberime(无需额外 C 模块)
- 🏗️ 原生集成:使用 Emacs 内置
input-method-function+register-input-method - 📋 候选展示:echo area(默认)或 posframe 浮动窗口
- ✏️ 光标处编码 overlay:输入时在光标处显示 preedit
- 📄 翻页:支持
C-f/C-b、PgDn/PgUp等(完全可配置) - ⏎ Enter 英文上屏:按 Enter 直接提交原始英文输入
- 🔢 数字键/空格选候选
- ⌨️ 所有按键可配置:翻页、确认、取消、退格、选择键均可自定义 see rimel-keymap
- 🧠 Predicates 断言:根据上下文自动切换中/英文(代码区、字母后、evil 状态等)
;; 如果通过 melpa 等方式 安装的,应该不需要此部分
(add-to-list 'load-path "/path/to/rimel")
(add-to-list 'load-path "/path/to/liberime")
;; 如果自定义了用户数据,可通过此配置定制
;;(setq liberime-user-data-dir "") ;
;; 自动编译liberime 模块 详见 https://github.com/merrickluo/liberime
;;(setq liberime-auto-build t)
(require 'rimel)
(setq default-input-method "rimel")
;; 可选:指定输入方案
(setq rimel-schema "luna_pinyin_simp")
;; 可选:使用 posframe 展示候选(如果安装了 posframe,默认会使用 posframe)
(setq rimel-show-candidate 'posframe)
;; 像 icomplete/ido 一样 C-n 选择下一个时,将其提到第1位
(setq rimel-highlight-first t)
;; horizontal or vertical
(setq rimel-posframe-style 'horizontal)
;; 自定义 posframe 属性 (可选)
(setq rimel-posframe-properties '(:left-fringe 10 :right-fringe 10))| 按键 | 功能 | 配置变量 |
|---|---|---|
a-z |
输入拼音 | — |
1-9 |
选择对应候选 | rimel-select-label-keys |
Space |
选择第一个候选 | rimel-keymap |
Enter |
英文上屏 / 首选上屏 | rimel-keymap |
C-f PgDn |
下一页 | rimel-keymap |
C-b PgUp |
上一页 | rimel-keymap |
C-p C-n |
上/下一个 | rimel-keymap |
C-k |
send Shift+delete(从用户词典中删除) | rimel-keymap |
Backspace |
删除最后一个字符 | rimel-keymap |
Escape/C-g |
取消输入 | rimel-keymap |
| 其他键 | 退出输入法并执行原按键 | — |
;; 使用 C-v / M-v 翻页
(add-to-list 'rimel-keymap '("C-v" . "<next>"))
(add-to-list 'rimel-keymap '("M-v" . "<prior>"))
;; 双拼用户可能需要的一次删除两个字符
(add-to-list 'rimel-keymap '("C-<backspace>" . "<backspace><backspace>"))
Predicates 是一组函数,在每次按键时检查上下文,决定是否跳过中文输入直接输出英文。
配置 rimel-disable-predicates 列表,任一函数返回非 nil 即禁用中文。
| 断言 | 说明 | 推荐度 |
|---|---|---|
rimel-predicate-prog-in-code-p |
在代码中(非注释/字符串)自动英文 | ★★★ |
rimel-predicate-after-alphabet-char-p |
光标前是英文字母时自动英文 | ★★★ |
rimel-predicate-current-uppercase-letter-p |
输入大写字母时自动英文 | ★★★ |
rimel-predicate-evil-mode-p |
evil normal/visual/motion 状态自动英文 | ★★★ |
rimel-predicate-after-ascii-char-p |
光标前是 ASCII 字符时自动英文 | ★★ |
rimel-predicate-org-in-src-block-p |
在 Org 源码块中自动英文 | ★★ |
rimel-predicate-org-latex-mode-p |
在 Org LaTeX 片段中自动英文 | ★ |
rimel-predicate-tex-math-or-command-p |
在 TeX 数学环境中自动英文 | ★ |
;; 推荐配置:代码区 + 字母后 + 大写字母
(setq rimel-disable-predicates
'(rimel-predicate-prog-in-code-p
rimel-predicate-after-alphabet-char-p
rimel-predicate-current-uppercase-letter-p))
;; Evil 用户推荐
(setq rimel-disable-predicates
'(rimel-predicate-prog-in-code-p
rimel-predicate-after-alphabet-char-p
rimel-predicate-current-uppercase-letter-p
rimel-predicate-evil-mode-p))
;; Org 用户可以额外添加
(add-to-list 'rimel-disable-predicates 'rimel-predicate-org-in-src-block-p)断言函数签名与 emacs-rime 和 pyim 一致(无参数、返回 t/nil), 因此可以直接使用它们的断言函数:
;; 使用 emacs-rime 的断言(需加载 rime-predicates)
(setq rimel-disable-predicates
'(rime-predicate-prog-in-code-p
rime-predicate-after-alphabet-char-p))
;; 使用 pyim 的探针(需加载 pyim-probe)
(setq rimel-disable-predicates
'(pyim-probe-program-mode))与 emacs-rime、pyim 的对比
| Rimel | emacs-rime | pyim + pyim-liberime | |
|---|---|---|---|
| 依赖 | liberime | 自带 C 模块 (lib.c) | pyim 框架 + liberime |
| 代码量 | ~700 行 | ~1200 行 (rime.el) + C | ~6000 行 (pyim) + 326 行桥接 |
| C 模块 | 无(复用 liberime) | 自带 lib.c | 无(复用 liberime) |
| 输入法接口 | input-method-function + read-event 循环 |
input-method-function + minor mode |
input-method-function + 独立框架 |
| 候选展示 | nil/echo area/posframe | minibuffer/popup/posframe/sidewindow | posframe/popup/minibuffer |
| 按键处理 | read-event 循环(类似 quail) |
overriding-terminal-local-map |
独立事件系统 |
Rimel — 极简主义
- 一个文件、一个依赖、无 C 代码
- 使用
read-event循环,与 Emacs 内置 quail 完全相同的模式 - 不借助 pre-command-hook/post-self-insert-hook 等hook
- 合成过程自包含:函数进入时开始,返回时结束,无状态泄露
- 适合想要最简单可用的 rime 输入法的用户
emacs-rime — 功能完备
- 自带 C 动态模块(lib.c),独立于 liberime
- 支持 5 种候选展示方式(minibuffer/message/popup/posframe/sidewindow)
- 支持 predicates 系统(自动根据上下文切换中英文)
- 支持 inline ASCII 模式
- 使用 minor mode +
overriding-terminal-local-map处理合成期间按键 - 适合需要深度定制和高级功能的用户
pyim + pyim-liberime — 框架化
- pyim 是完整的输入法框架,liberime 只是其中一个后端
- 支持多种输入方案(全拼、双拼、五笔等),rime 只是其一
- 有独立的词频管理、词库、云输入等功能
- pyim-liberime 仅 326 行,本质是
liberime-search()的薄包装 - 适合需要多输入法统一管理的用户
| 功能 | Rimel | emacs-rime | pyim |
|---|---|---|---|
| 基本中文输入 | ✅ | ✅ | ✅ |
| 候选翻页 | ✅ | ✅ | ✅ |
| Enter 英文上屏 | ✅ | ✅ | ✅ |
| 多种候选展示 | echo area / posframe | 5 种 | 3 种 |
| Predicates 自动切换 | ✅ (8 个内置) | ✅ (20 个) | ✅ (probe) |
| Inline ASCII | ❌ | ✅ | ❌ |
| 多输入方案后端 | ❌ | ❌ | ✅ |
| 词频学习 | rime 内置 | rime 内置 | rime + pyim |
| 自定义按键 | ✅ 全部可配 | 部分 | 部分 |
| 零额外 C 代码 | ✅ | ❌ | ✅ |
| 安装复杂度 | 低 | 中 | 高 |
- 想要最简单、最轻量的 rime 体验(含 predicates) → Rimel
- 需要 inline ASCII、多种候选 UI(5 种) → emacs-rime
- 需要多输入法后端(五笔+拼音+rime)统一管理 → pyim
GPL-3.0