在Rust(vim)中运行命令

5
std::process::Command::new("/usr/bin/sh")
    .arg("-c")
    .arg("vim")
    .arg("file")
    .spawn()
    .expect("Error: Failed to run editor");

当我运行这段代码时,会启动一个vim进程来编辑文件,但它并没有在终端中打开(不确定确切术语),有什么办法可以让vim在终端中打开吗?

小细节:sh 通常是 /bin/sh,而不是 /usr/bin/sh。顺便问一下,用 shell 运行 vim 真的有必要吗?为什么不直接运行 vim file 呢?可以使用 std::process::Command::new("vim").arg("file")... - phd
@phd 是的,我刚刚意识到有关sh位置的问题,当我在我的机器上运行which sh时,它显示为/usr/bin/sh,但在大多数其他机器上,包括我的测试电脑,则为/bin/sh。至于在shell中运行的必要性,如果您不使用shell运行vim〜/foo,那么它将尝试查找~目录,而不是主目录。 - isocseles
你的 /bin 是一个符号链接到 /usr/bin,就像许多现代 Linux 发行版一样。 - phd
1个回答

7
当我运行你的代码时,vim 确实在终端中打开了,但我的shell也在同一个终端中运行,而且vim和shell互相争夺屏幕显示,并且它们都接收我键入的任何键。如果你也遇到了这个问题,你需要在子进程上使用wait方法:
std::process::Command::new("/usr/bin/sh")
    .arg("-c")
    .arg("vim")
    .arg("file")
    .spawn()
    .expect("Error: Failed to run editor")
    .wait()
    .expect("Error: Editor returned a non-zero status");

1
谢谢,这回答了我的问题,我不得不添加.wait(),另外值得注意的是,我必须将“vim文件”作为它自己的.arg()使用,而不是分为两个。 - isocseles

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接