#vim #channel #bindings #text #properties #plugin #object

vii

绑定到 Vim 对象,例如文本属性、通道,以及使用 Rust 与 Vim 交互的方式

10 个版本

0.0.19 2022 年 8 月 7 日
0.0.18 2022 年 5 月 20 日
0.0.6 2022 年 4 月 28 日

#154 in 文本编辑器

MIT/Apache

30KB
436

pre-commit Coverage

cargo.io License

rust badge

绑定到 Vim 对象和使用 Rust 与 Vim 交互的方式,例如文本属性、通道。

使用此库,您可以编写标准插件,全部在 Rust 中编写,就像 Vim 插件通常会运行一样。

安装

将此行添加到您的 Cargo.toml 文件的依赖项部分。

vii= "0.0"

当前接口非常不稳定。

功能

默认版附带许多有用的功能,但还有许多其他功能可供选择,以提高您程序的质量。

用法

如果可能,直接使用文档中的示例,因为它们更清晰且经过测试。

插件

  • 注意:尚未实现服务器插件或持久插件。
  • 注意:尚未实现 FiletypePlugin,用于 Vim 文件类型插件。

使用 Rust 创建 Vim 插件。可以使用 Vim 插件 rust-plug 进行安装和运行。

几乎与 Vim 插件完全一样。它在启动时运行,执行其代码。例外情况包括添加 pythonx 代码,autoload 目录,但它仍然可以创建函数、命令、全局变量,并从 Vim 本身读取。

  • 使用 PluginConfig 结构体添加配置支持。
  • 使用 Plugin 特性创建插件。
    • get_config - 获取配置结构体。
    • plugin - 插件,重要信息。

以下是一个示例,取自 rust-plug 验证概念

# Cargo.toml
[package]
name = "rust-plug-poc"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at http://doc.rust-lang.net.cn/cargo/reference/manifest.html

[dependencies]
vii = "0.0"
// src/main.rs
use std::env;
use std::net::TcpStream;

use vii::plugin::Plugin;
use vii::plugin::PluginConfig;

struct MyPlugin{
    ip: String,
    port: String,
}

/// Make your struct, MyPlugin, into a Plugin ready for Vim.
impl Plugin for MyPlugin {
    fn get_config(&self) -> PluginConfig {
        PluginConfig::new("127.0.0.1".to_string(), "8765".to_string())
    }
    fn plugin(&mut self, _stream: &mut TcpStream) -> Result<(), String> {
        Ok(())
    }
}

fn main() {

  // Environment Variable, to communicate with rust-plug
  let port = env::var("VII_PLUGIN_PORT").unwrap();
  let mut plugin = MyPlugin {
    ip: "127.0.0.1".to_string(),
    port,
  };

  // Run your plugin.
  //
  // Here you can run your plugin as many times as you'd like, create multiple plugins, etc.
  plugin.run();
}

数据类型

与 Vim 数据类型一起工作。

请参阅文档以了解支持的数据类型。

use vii::DataType;

// Using a Vim data type
let vim_float = DataType::Float(3.14);
// Serializing for transmission to Vim
let serialized_float = vim_float.to_string();  // "3.14"

let vim_string = DataType::String("Hello World!".to_string());
let serialized_string = vim_string.to_string();  // "\"Hello World!\""

文本属性

与 Vim 文本属性一起工作(请参阅 Vim 中的 :help textprop.txt)。

注意:这是一个低级 API。

use vii::textprop::{
    TextProperty,
    PropertyType,
};
use vii::textprop::PropertyTypeBuilder;

// Create New Property

let prop = TextProperty { id: 0, r#type: "number".to_string() };

// Create New Property Type

let prop_type = PropertyTypeBuilder::default().highlight("Constant".to_string()).build();

通道

与 Vim 通道一起工作(请参阅 Vim 中的 :help channel.txt)。

注意:这是一个低级API。最终的高级API应该看起来像这样:let expr = Expr::from("line('$')");

use vii::channel::{
    ChannelCommand,
    Call,
    Expression,
};

// Number of Lines in Current Buffer
// ["expr","line('$')"]
let expression = ChannelCommand::Expr(
    Expression {
        expression: "line('$')".to_string(),
    },
    None,
);

// Number of Lines in Current Buffer
// ["call", "line", ["$"]]
let call = ChannelCommand::Call(
    Call {
        function: "line".to_string(),
        args: vec![DataType::String("$")],
    },
    None,
);


println!("{}", expression.to_string());
// ["expr","line('$')"]
println!("{}", call.to_string());
// ["call", "line", ["$"]]

贡献

如果您希望添加任何功能,发现任何潜在的错误,或者有任何问题,请随时创建一个问题。

测试

cargotest

单元测试位于测试文件中,紧邻它们所测试的单元(底部)。集成测试位于/tests/

许可证

根据以下任一许可证授权:

任由您选择。

贡献

除非您明确声明,否则您有意提交给作品以包含在内的任何贡献,根据Apache-2.0许可证的定义,将按照上述方式双重许可,不附加任何额外的条款或条件。

依赖项

~0–305KB