我们的目标是:
- 性能优先:
- 用纯 lua 编写的 neovim 插件可能存在性能瓶颈。
不同于之前的 neovim 中文输入改进计划 。
我们鼓励利用各种现成的 C/C++/rust/go 等库实现 lua binding 来缓解性能问题。
代价是需要额外的编译。我们鼓励将插件构建打包为 rocks 格式。目前支持安装 rocks
安装包的 neovim 插件管理器有:
- lazy.nvim: 项目的根目录下需要存在
*-1.rockspec - rocks.nvim: 需要将
*.rockspec上传到 https://luarocks.org/ 。比起 lazy.nvim ,可以从 https://lux.lumen-labs.org/rocks-binaries/
- lazy.nvim: 项目的根目录下需要存在
- 减少开销。调用命令行接口会带来进程 fork 的开销。
- 用纯 lua 编写的 neovim 插件可能存在性能瓶颈。
不同于之前的 neovim 中文输入改进计划 。
我们鼓励利用各种现成的 C/C++/rust/go 等库实现 lua binding 来缓解性能问题。
代价是需要额外的编译。我们鼓励将插件构建打包为 rocks 格式。目前支持安装 rocks
安装包的 neovim 插件管理器有:
- 接近原生 vim 功能:尽可能接近原生 vim 体验。比如 vim 的 w/b/e/ge 不支持中文分词。 支持中文分词的 vim 插件也应该默认提供 w/b/e/ge 快捷键,而不是覆盖 W/B/E/gE 。 同时也要支持 vim 的 count 用法: 3w 。
- 鼓励复用。
- 不重复造轮子。充分利用已有的 lua 库作为依赖,让插件管理器来安装依赖。
- 鼓励将插件分离为不依赖 neovim 的纯 lua 库,以供其他 lua 项目复用。
neovim 提供了标准 lua 没有的 vim 模块。可以考虑用
https://github.com/rimeinn/rime.nvim/tree/main/packages/vim
作为兼容层。以 rime.nvim 为例:
- https://github.com/rimeinn/rime.nvim/tree/main/lua/rime: 该目录下除
nvim/外的代码均可在标准 lua 下运行。 - https://github.com/rimeinn/rime.nvim/tree/main/lua/rime/nvim: 该目录下 的代码需要 neovim 。
- https://github.com/rimeinn/rime.nvim/tree/main/lua/rime: 该目录下除
- 清晰文档。
- 在 Binding 中提供库的使用方法。
- 在 Related Projects 中列出已有的解决方法以及其不足之处。如能给出性能的 test bench 会更好
- 在 Similar Projects 中列出相似项目以供参考。
中文输入法的介绍。太长不看的总结如下:
- 不建议使用单模式输入法。 相比多模式输入法, 单模式输入法的使用体验和系统输入法差异很大。如果坚持使用,建议使用 LSP 。因为 LSP 的跨编辑器性,可能会 得到更好的维护。
- 对于系统输入法,注意到 GNU/Linux 下的 ibus/fcitx 等均支持 dbus 通信协议。使用 ime.nvim 性能更好。对于 macOS/Windows 输入法,目前没有通信协议或 lua binding 的支持。只能使用 命令行。
- 对于 Vim 的嵌入式输入法,
推荐:
- rime.nvim:使用 librime 的 lua binding
- fcitx5-ui.nvim:使用 dbus 和 fcitx 通信
在 vim 中输入 /pinyin 搜索到 拼音 。
这里有一些 插件 。
替代方案是直接用中文输入法输入汉字选中后搜索。
参见 jieba.nvim 。
现在主流的 linter/formatter 都是基于 LSP 的实现。但基本都只支持英文。 这里有一些非 LSP 的中文 linter/formatter 。
vi -u NONE test.txt:set fileencoding=cp936
:put ='你好我是一个中国人'
:wqvi -u NONE test.txtExpected behaviour:
你好我是一个中国人
Actual behaviour:
ÄãºÃÎÒÊÇÒ»¸öÖйúÈË
在 vim 中 :edit ++filencoding=ENCODING test.txt 会用 ENCODING 编码打开
test.txt 。如果用户没有显式传入 ++filencoding ,则按照 :set fileencodings
的顺序查找。这可能会使用错误的编码导致乱码。注意到中文中有很多高频汉字,例如“的”、“是”,
所以可以通过查找高频汉字的编码来预测字符编码。
tellenc 使一个基于此原理来预测字符编码的
软件。 tellenc 不能保证预测一定正确,所以一旦预测失败,仍然需要通过
:edit ++filencoding=ENCODING test.txt 手动干预。
- vim-fencview: 通过命令行调用 tellenc
- 本项目。提供了:
- 一个 tellenc 的 lua binding
- neovim 插件
:Rocks install tellenc.nvim~/.config/nvim/rocks.toml:
[plugins]
"tellenc.nvim" = "scm"Then
:Rocks syncor:
$ luarocks --lua-version 5.1 --local --tree ~/.local/share/nvim/rocks install tellenc.nvim
# ~/.local/share/nvim/rocks is the default rocks tree path
# you can change it according to your vim.g.rocks_nvim.rocks_pathrequire("lazy").setup {
spec = {
{ "rimeinn/tellenc.nvim", lazy = false },
},
}local tellenc = require "tellenc".tellenc
print(tellenc "abc")
-- ascii
print(tellenc "你好")
-- utf-8