4 个版本

0.31.32 2024 年 8 月 15 日
0.31.31 2024 年 8 月 15 日
0.31.3 2024 年 8 月 15 日
0.1.0 2024 年 8 月 11 日

#244 in 命令行界面

Download history 65/week @ 2024-08-05 208/week @ 2024-08-12

273 每月下载量

MIT 许可证

20KB
300

ragout - 终端原始模式输入处理器

ragout 是一个库 crate,在终端原始模式下提供 shell 功能。

特性

  • 输入移动
    • 移动到输入行的开始/结束
    • 移动到下一个/上一个项目(基本上是一个单词)
  • 输入删除
    • 删除整个输入行
    • 删除光标左右的所有输入
  • 历史记录
    • 在用户提交时(按回车键)将输入保存到输入历史记录中
    • 使用上下键导航保存的历史记录条目
  • 退出 程序使用 CTRL-C(使用 std::process::exit())



示例

基本用法



$ cargo run --example basic



use ragout::{init, run};

fn main() {
    // enter raw mode and initialize necessary variables
    // the string literal argument will be the value of the prompt
    let (mut sol, mut i, mut h, mut ui) = init("some prompt 🐱 ", true);

    'main: loop {
        let input = run(&mut i, &mut h, &mut sol, &mut ui);
        if !input.is_empty() {
            // do some stuff with the user input
        }
    }
}



使用宏



$ cargo run --example macro --no-default-features --features custom_events



use ragout::ragout_custom_events;

ragout_custom_events! {
    KeyCode::F(5), 0x0, TestF(u8),
    || {
        let date = std::process::Command::new("date")
            .output()
            .unwrap()
            .stdout.into_iter()
            .map(|u| u as char)
            .collect::<String>()
            .replacen("\"", "", 2);


        self.overwrite_prompt(date
            .trim_end_matches('\n'));
        self.write_prompt(sol);
        // TODO: sol.write input, should be called from inside input.write_prompt() right before
        // sol.flush() at the end
    };
    KeyCode::Esc, 0x0, TestPrintScreen,
    || {
        // requires that the grim cli tool (or something similar, replace as needed) is installed
        let cmd = std::process::Command::new("grim").arg("target/screenshot.png").output().unwrap();

        let inst = std::time::Instant::now();

        let temp = self.prompt.drain(..).collect::<String>();
        self.overwrite_prompt("saved screenshot to target/screenshot.png> ");
        self.write_prompt(sol);

        let notify =  std::thread::spawn(move || loop {
                if inst.elapsed() > std::time::Duration::from_secs(3) {

                    break true;
                }
        });

        let notify = notify.join().unwrap();
        if notify {
            self.overwrite_prompt(&temp);
            self.write_prompt(sol);
        }

    };
}

fn main() {
    let (mut sol, mut i, mut h, mut ui) = init("some prompt 🐭 ", true);

    'main: loop {
        let input = run(&mut i, &mut h, &mut sol, &mut ui);
        if !input.is_empty() {
            // do some stuff with the user input
        }
    }
}



许可证

MIT 许可证 下许可。



版本管理

遵循 SemVer 规范。在版本达到 1.0.0 之前,仓库将遵循以下规则进行版本管理 x.y.z

  • x 是常量 0。
  • 除了少数例外,增加 y 的更改伴随着里程碑的创建,即新里程碑的第一个 pr 增加了 y。
  • 其他所有内容都增加 z。连续的小更改可能被合并为单个 z 的增加。
  • 上述三个规则不一定总是受到尊重。



警告:此 crate 仍然是不稳定的,如果有什么问题,或者您想要一个功能,请随时打开一个问题。

依赖关系

~2–11MB
~127K SLoC