13个不稳定版本 (4个破坏性更新)
0.5.1 | 2024年6月23日 |
---|---|
0.5.0 | 2024年5月28日 |
0.4.2 | 2024年1月29日 |
0.4.1 | 2023年12月16日 |
0.1.3 | 2022年7月17日 |
#57 in 文本编辑器
每月下载量 686次
530KB
14K SLoC
🔗 nvim-oxi
nvim-oxi为Neovim文本编辑器暴露的丰富API提供了安全且符合Rust风格的Rust绑定。
该项目主要面向插件开发者,尽管最终用户也可以用Rust编写他们的Neovim配置。
如何使用
编写Neovim插件的传统方式是使用除了“内置”语言(如Vimscript或Lua)之外的语言,即通过RPC通道。这种方法有一些限制,主要是因为需要将所有内容序列化为MessagePack编码的消息,这阻止了像给键映射附加回调或安排函数这样的操作。
nvim-oxi采用了不同的方法。它利用Rust的外部函数接口(FFI)支持直接挂钩到Neovim的C代码,允许与“进程内”插件具有相同的功能性,同时也避免了需要额外的IO层。
这个Neovim论坛帖子对感兴趣的人提供了更多细节。
为什么
既然Neovim已经把Lua作为一等公民,为什么还要这样做?主要有两个原因:
-
访问Rust生态系统:Lua是一种优秀且精简的脚本语言,但在编写更复杂的插件时也可能有限制。相比之下,Rust是一种功能齐全的静态类型语言,具有庞大的生态系统,包括用于(反)序列化、网络、IO、绿色线程等的crate;
-
nvim-oxi提供了一个完全类型化的API:从可选函数字段到回调参数,所有内容都在编译时进行检查。这允许插件开发者花费更少的时间阅读帮助文档,更多的时间通过
cargo check
进行迭代。
示例
示例目录包含了一些使用nvim-oxi的示例。它还包含了如何设置你的Rust crate、放置编译后的工件以及从Neovim加载最终插件的说明。
如果你对某些内容仍然不确定,请随时提交一个新问题,我可能会添加一个新示例来记录你的用例(如果可以做到)。
测试
测试功能标志 test
启用了 #[nvim_oxi::test]
进程宏。此宏替换了常规的 #[test]
注释,并可用于在 Neovim 实例内部使用 Rust 的优秀测试框架测试一段代码。
例如
use nvim_oxi::{self as oxi, api};
#[oxi::test]
fn set_get_del_var() {
api::set_var("foo", 42).unwrap();
assert_eq!(Ok(42), api::get_var("foo"));
assert_eq!(Ok(()), api::del_var("foo"));
}
然后 cargo test
将启动一个带有空配置的新 Neovim 进程,运行该代码并退出。有几个需要注意的地方
-
修改代码后,在可以使用
cargo test
测试之前,必须先运行cargo build
; -
即使它们属于不同的模块,也不能有两个具有相同名称的测试函数。例如,以下不会工作
mod a {
#[nvim_oxi::test]
fn foo() {}
}
mod b {
#[nvim_oxi::test]
fn foo() {}
}
依赖关系
~0.4–2.3MB
~40K SLoC