当您使用没有 -m 标志的 git commit 时,它会打开您的默认编辑器,该编辑器由$EDITOR环境变量设置。这样做使您可以编辑多行、使用箭头导航并在完成后提交文本。我想用我的命令行程序做类似的事情。它可能是打开默认编辑器或具有我刚才提到的功能的东西。
我尝试使用open crate,但它打开了$VISUAL编辑器,并且似乎没有参数来指定要打开的编辑器。
我尝试使用io::stdin()with read_to_end()。它允许多行输入和Ctrl-D用于提交文本,但不能使用箭头移动和编辑文本。
我尝试使用rustyline crate,但我找不到如何在能够编辑前几行的同时获得多行。
我可能是错的,但我认为它的工作方式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)