rimel 基于 liberime 的轻量级 Emacs Rime 输入法

  • 使用 read-event 循环,与 Emacs 内置 quail 完全相同的模式
  • 不借助 pre-command-hook/post-self-insert-hook 等hook
  • 合成过程自包含:函数进入时开始,返回时结束,无状态泄露
  • 适合想要最简单可用的 rime 输入法的用户
  • 基本是AI 写出来的代码
  • :package: 单文件:仅 rimel.el 一个文件,约 700 行
  • :electric_plug: 依赖少:仅依赖 liberime(无需额外 C 模块)
  • :building_construction: 原生集成:使用 Emacs 内置 input-method-function + register-input-method
  • :clipboard: 候选展示:echo area(默认)或 posframe 浮动窗口
  • :pencil: 光标处编码 overlay:输入时在光标处显示 preedit
  • :page_facing_up: 翻页:支持 C-f/C-bPgDn/PgUp 等(完全可配置)
  • Enter 英文上屏:按 Enter 直接提交原始英文输入
  • :1234: 数字键/空格选候选
  • :keyboard: 所有按键可配置:翻页、确认、取消、退格、选择键均可自定义 see rimel-keymap
  • :brain: Predicates 断言:根据上下文自动切换中/英文(代码区、字母后、evil 状态等)

创建的初衷是 使用 emacs-rime 的时候 空格上屏在我的linux上有bug , 上屏后看不到上屏的中文,需要移动下光标才行,想让AI试着修,都无从描述bug, 干脆 让AI 参考了 pyim emacs-rime 及emacs自带输入法,让它自已写了一个。

有兴趣的可以试试,反响好的话我就提melpa 没什么反馈就这样放着算了。

Update:

(defcustom rimel-highlight-first nil
  "When non-nil, move the highlighted candidate to the first position.
For example, if candidates are [a b c d e] and c is highlighted,
display as [c d e a b]."
  :type 'boolean
  :group 'rimel)

新增了一个选项 C-n 选择下一个时,自动将其展示在第1个,类似 icomplete 的 icomplete-forward-completions

更新: 已经放到 melpa 了。

9 个赞

我输入中文不多,平时用系统输入法fcitx. 想问下你这个和系统输入法相比,有什么不同吗?

非要说 有什么特别的优点的话, 是 rimel-disable-predicates 的功能,能够根据你光标所在位置的context 判断是否自动切换到英文状态, 比如

  1. 在代码片段中(非 comment及string内部时) .
  2. evil-mode normal/motion state时

这部分功能是 fork 自 emacs-rime 及pyim 的。

我平时也不用eamcs 中的输入法, 最近 尝试 ezemtsov/ewm: EWM - Emacs Wayland Manager - Codeberg.org 这个项目,它的思路是把emacs 的输入法给所有app 用, 但是现在还没有完全实现,我就想尝试下 集成pyim 或 emacs-rime , 给我的感受是 pyim 功能大而全,相对较重,我不是很喜欢, emacs-rime 的实现是通过各种hook 实现的输入法状态管理,跟内置的输入法实现机制差别很大 ewm集成它的时候比较麻烦。 且我用的时候 上屏的时候有bug(当然也可能跟linux compositor 有关 (我在ewm 与niri 下都能复现) 于是才有了这款输入法。

4 个赞

谢谢解释

这个感觉好啊 不错

哈哈,我一直认为 pyim 是个小项目呢,当时我还年轻,精力比较好,所以有什么自己认为好的想法就做进去了,其实后续观察这些功能用的也不多,现在年龄大了,整天就想着躺在床上刷手机,所以现在 pyim 基本上就是维护状态,新功能除非有明确的迹象是必要的,才考虑添加。

3 个赞

我是 Emacs Rime 用户。试用了一下 Rimel,感觉非常有潜力。感谢楼主!

优势:

  • 兼容 isearch。(Emacs Rime 不支持 isearch
  • 切换输入法时不卡顿。Emacs Rime 在我这里首次切换时会卡一两秒,不确定是不是我的配置有问题。

目前发现的问题:

  1. 编译动态库的 Makefile 不太完善,或者文档不够详细,我手动编辑 Makefile 才编译成功。
  2. 五笔支持问题:无法自动顶字上屏。
  3. 无法输入中文标点。
  4. 不支持完全隐藏候选窗。(硬核五笔用户,完全不想看到候选窗)
2 个赞

1的问题 不在我这,是liberime 的问题。

2 3 4 都修好了, 4 (setq rimel-show-candidate nil)

emacs-rime的c模块安装的时候就能自动处理了,而且不依赖liberime,liberime本身就是个c模块 :melting_face:,还不好安装

liberime 也提供了 自动编译

(setq liberime-auto-build t)

只是有可能他边界没处理好,遇到的问题,可以试着提个bug看看作者反应。 现在 pyim 也是利用的 liberime 理论上安装过程是一样的。

神速!非常感谢!

不过,中文标点还有一点小问题,好像缺少省略号,只有 ^。

另外,方不方便支持内嵌首选项?对应 Rime 里的 style/inline_candidate: true。效果如下:

output

省略号你是按哪个键 出的。

更新下:

(setq rimel-inline-preedit 'candidate)  ;此为默认值

lib e rime这个名字实在是和 librime 太像了,之前着实让我困扰了一番

S-6,和 ^ 符号相同方法,只是在中文键盘下。

更新:内嵌首选项可用了。距离理想状态越来越近!

试过用github action编译liberime,然后将ldd的所有dll打包放到路径里,发现也无法加载liberime-core.dll

标点的 可以再试试, 还有遗漏 可以尝试 将 按键 加到这个函数里面,生效后报给我 我再补上。

(defun rimel--composable-key-p (key)
  "Return non-nil if KEY should start a rime composition.
Includes lowercase letters and common Chinese punctuation marks."
  (and (integerp key)
       (or (and (>= key ?a) (<= key ?z))
           (memq key '(?+ ?= ?- ?_ ?\( ?\) ?* ?& ?\^ ?% ?$ ?# ?@ ?! ?` ?~ 
                          ?\[  ?\]  ?{  ?}  ?\\  ?|
                          ?\: ?\; ?\'  ?\"
                          ?, ?. ?<  ?>  ?/ ?\?  
                          ?\,  ?。 ?…  ?—  ?·  ?~  ?、)))))

pyim让我在wsl中用emacs不需要自己折腾输入法,而且输入体验和辅助输入法也很好用,开箱即用的体验真的很好。

1 个赞

试了最新版,以及这里贴的函数,都还是不能输入省略号,只能输入 ^

另外,又发现一个问题:M-x spatial-window-select (来自 spatial-window)激活窗口选择界面之后,字母按键应该被用作窗口选择按键,但现在字母键仍然会被 Rimel 输入法劫获,导致无法切换窗口。Emacs 自带的 chinese-py 和 Emacs Rime 都没有这个问题。

更新:avy 似乎也会遇到类似问题。例如,M-x avy-goto-char-timer 之后,Emacs 内置输入法可以直接输入中文,而 rimel 会劫获键盘输入,avy 读不到任何输入,最后按空格后,avy 退出,而且输入法的首选项也不会上屏。

直觉上这个问题可能和 rimel 底层工作机制有关。

1 个赞

你们都能正常安装吗?为啥我安装的时候报错?

Compiling internal form(s) at Wed Apr  8 16:48:59 2026
Leaving directory ‘/home/user/.config/emacs/elpa/rimel’

Compiling file /home/user/.config/emacs/elpa/rimel/rimel.el at Wed Apr  8 16:48:59 2026
Entering directory ‘/home/user/.config/emacs/elpa/rimel/’
rimel.el:66:12: Warning: custom-declare-variable ‘rimel-inline-preedit’
    docstring has wrong usage of unescaped single quotes (use \=' or different
    quoting such as `...')
rimel.el:112:12: Warning: custom-declare-variable ‘rimel-keymap’ docstring
    wider than 80 characters
rimel.el: Error: End of file during parsing:  *Compiler Input*

这几个问题应该修复了。