如何使用 Rust 打开用户的默认编辑器并获取编辑的内容?

Pol*_*ear 4 linux rust

当您使用没有 -m 标志的 git commit 时,它会打开您的默认编辑器,该编辑器由$EDITOR环境变量设置。这样做使您可以编辑多行、使用箭头导航并在完成后提交文本。我想用我的命令行程序做类似的事情。它可能是打开默认编辑器或具有我刚才提到的功能的东西。

我尝试使用open crate,但它打开了$VISUAL编辑器,并且似乎没有参数来指定要打开的编辑器。

我尝试使用io::stdin()with read_to_end()。它允许多行输入和Ctrl-D用于提交文本,但不能使用箭头移动和编辑文本。

我尝试使用rustyline crate,但我找不到如何在能够编辑前几行的同时获得多行。

Pet*_*aro 7

我可能是错的,但我认为它的工作方式git commit是创建一个临时文件 ( .git/COMMIT_EDITMSG),然后作为子进程在用户中打开该文件$EDITOR,然后等待编辑器的进程退出/返回。只有当用户关闭他们的编辑器时才会发生这种情况。这基本上意味着他们可以使用他们选择的编辑器的全部功能,即在文件中导航、保存更改等。

因此,在 Rust 中,您可以使用std::process::Command来打开用户的编辑器,您可以通过std::env::var. 如果您的应用程序有一个临时文件(如或的.git目录等),您可以将临时文件存储在特定位置,或者您可以在系统的临时目录中创建一个临时文件,由. (或者你可以使用优秀的第三方箱子只能直接创建一个临时文件:)git~/.config/<your-app>/<your-file>std::env::temp_dirtempfile

这是使用上述技术的工作示例:

use std::{
    env::{temp_dir, var},
    fs::File,
    io::Read,
    process::Command,
};

fn main() {
    let editor = var("EDITOR").unwrap();
    let mut file_path = temp_dir();
    file_path.push("editable");
    File::create(&file_path).expect("Could not create file");

    Command::new(editor)
        .arg(&file_path)
        .status()
        .expect("Something went wrong");

    let mut editable = String::new();
    File::open(file_path)
        .expect("Could not open file")
        .read_to_string(&mut editable);

    println!("File content:\n{}", editable);
}
Run Code Online (Sandbox Code Playgroud)

  • 为了进一步模仿 git,您可能需要检查编辑器的退出代码并在操作不成功时中止操作。 (2认同)