输入法的奇妙冒险: neovim 之风

01 Feb 2025 2398 words 8 minutes BY-SA 4.0
develop ime

你最喜欢的输入法——现在在 neovim 中可以使用了! rime.nvim

IME inside Vim

插件开发

我们在上一篇文章中讨论了 NeoVim 插件开发的一些方案。大体上分类如下:

用 vim script 开发插件简单入门。但随着需求的变化很多问题暴露出来:

在引入其他编程语言开发 Vim 插件前,社区也进行了一些有限但貌似徒劳的尝试:

在引入其他编程语言后,一个非常棒的例子是 coc.nvim:

在 Neovim 社区, lua 很快成了官方强推的插件开发语言:

那么,一个类似 coc.nvim 但使用 lua 来解决上述难题的方案已经呼之欲出:

rocks.nvim

rocks.nvim 完成了:

除此外, rocks.nvim 还引入了 rocks.toml 让用户用 Cargo.toml 的语法声明需要安装的 Vim 插件。

作为一个尝试, rocks.nvim 面临和 coc.nvim 一样的问题:

生态。很多 Vim 插件并未被发布到 luarocks.org 上。所以该作者发起 nurr 来将一些 Vim 插件发布到 luarocks.org 上。

打个比喻:先有充电桩还是先有电动汽车呢?如果我们担忧 luarocks.org 上没有足够多的 Vim 插件而拒绝将 luarocks 带入到 Vim 插件开发社区,那么我们永远也不会享受到 luarocks 带来的好处~

基于 lua 的 NeoVim 插件开发

Vim 插件的常见目录:

作为一个输入法插件,我们只需要在 lua/ 中放置一个 lua 模块。然后让用户在配置中导入即可:

vim.keymap.set('i', '<C-^>', require('rime.nvim').toggle)

rime.nvim 实际上是 lua/rime/nvim/init.lua ……所有与 vim 运行时有关的代码都放在 lua/rime/nvim/ 下了 QAQ

当用户按下 Ctrl + 6 时,输入法会被切换到 rime 模式。

Neovim 提供了一些 API vim.api.nvim_open_win() 创建一个浮动窗口。我们在浮动窗口内绘制输入法的菜单界面。

然后是和前面相同的算法逻辑。

其他

一些奇特的地方:

用 C 语言开发 lua 的模块: lua 的栈设计太奇特了。这个恐怕只有体验过的开发者才能 get 到其中含义 ^_^

以上。我们成功地为 rime 增加了一堆命令行的前端。因为大多数算法逻辑是完全一样的,所以从第二篇文章开始后面就省略了这部分,侧重于每个平台移植的不同难点。

最后,贴上佛振本人的评价:

interesting

https://user-images.githubusercontent.com/32936898/199681341-1c5cfa61-4411-4b67-b268-7cd87c5867bb.png https://user-images.githubusercontent.com/32936898/199681363-1094a0be-85ca-49cf-a410-19b3d7965120.png https://user-images.githubusercontent.com/32936898/199681368-c34c2be7-e0d8-43ea-8c2c-d3e865da6aeb.png