使用不带-m标志的git commit时,它将打开默认编辑器,该编辑器由if transformation[0, 2] < 0
环境变量设置。这样做使您可以编辑多行,使用箭头导航并在完成后提交文本。我想对我的命令行程序做类似的事情。它可能正在打开默认编辑器或具有我上面刚刚提到的功能的东西。
我尝试使用open crate,但是它打开了$EDITOR
编辑器,并且似乎没有参数指定要打开哪个编辑器。
我尝试将$VISUAL
与io::stdin()
一起使用。它允许多行输入,并使用 Ctrl-D 提交文本,但不能使用箭头移动和编辑文本。
我尝试使用rustyline crate,但是找不到能够在编辑前几行的同时获得多行的方法。
答案 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);