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

时间:2019-05-06 20:23:01

标签: linux rust

使用不带-m标志的git commit时,它将打开默认编辑器,该编辑器由if transformation[0, 2] < 0环境变量设置。这样做使您可以编辑多行,使用箭头导航并在完成后提交文本。我想对我的命令行程序做类似的事情。它可能正在打开默认编辑器或具有我上面刚刚提到的功能的东西。

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

我尝试将$VISUALio::stdin()一起使用。它允许多行输入,并使用 Ctrl-D 提交文本,但不能使用箭头移动和编辑文本。

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

2 个答案:

答案 0 :(得分:4)

我可能是错的,但是我认为git commit的工作方式是创建一个临时文件(.git/COMMIT_EDITMSG),然后作为子进程,它在用户的{{1 }},然后等待编辑器的过程退出/返回。只有在用户关闭其编辑器时才会发生这种情况。这基本上意味着他们可以充分利用自己选择的编辑器的全部功能,即浏览文件,保存更改等。

因此,在Rust中,您可以使用std::process::Command打开用户的编辑器,您可以通过std::env::var获得该编辑器。如果您的应用程序有一个临时文件(例如$EDITOR.git等的git目录,则可以将临时文件存储在一个特定的位置),也可以在系统的内部创建一个临时文件。 std::env::temp_dir返回给您的临时目录。 (或者,您可以使用出色的第三方箱仅直接创建一个临时文件:tempfile

这是使用上述技术的一个有效示例:

~/.config/<your-app>/<your-file>

答案 1 :(得分:2)

现在有一个提供此功能的板条箱:https://docs.rs/edit/0.1.2/edit/

从文档中:

let template = "Fill in the blank: Hello, _____!";
let edited = edit::edit(template)?;
println!("after editing: '{}'", edited);