#neovim #bindings #nvim

nvim-oxi

Rust语言对Neovim所有功能的绑定

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 文本编辑器

Download history 63/week @ 2024-04-18 103/week @ 2024-04-25 59/week @ 2024-05-02 60/week @ 2024-05-09 133/week @ 2024-05-16 264/week @ 2024-05-23 123/week @ 2024-05-30 94/week @ 2024-06-06 85/week @ 2024-06-13 381/week @ 2024-06-20 145/week @ 2024-06-27 431/week @ 2024-07-04 133/week @ 2024-07-11 181/week @ 2024-07-18 252/week @ 2024-07-25 99/week @ 2024-08-01

每月下载量 686次

MIT 协议

530KB
14K SLoC

🔗 nvim-oxi

Latest version CI Docs

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