当在node.js中的subprocess中使用vim时,stdio /pipe道问题

我正在使用node.js编写一个命令行界面来生成unit testing文件。 我一直在使用查询器获取用户input,但是有一个字段,用户很可能希望复制粘贴和/或编辑JSON数据的大型多行块。 因此,我的目标是:在CLI中打开vim @某个点 – >允许input – >closuresvim – >写出tmp文件 – >处理结果。

问题是vim的input也会转到父标准input,当返回键被input时,程序继续在vim(混乱)之上。 我很确定stdio / in / out / err没有正确设置,但我似乎无法find确切的解决scheme。 我操纵stream的每一次迭代似乎更接近,但是我知道有一个小的缺失的连接。

我已经尝试了很多东西:

var vim = child_process.spawn('vim', [path], {stdin: 'pipe', stdout: 'pipe', stderr: 'pipe'});

var vim = child_process.spawn('vim', [path], {stdio: 'inherit'}); //{stdio: ['pipe','pipe','pipe']}

最后,我从这个例子中跟踪了很多stdio操作, 我如何从node.js打开一个terminal应用程序? ,但仍然有一些小的缺失的链接,我需要帮助

笔记:

  • 我99%确定我的asynchronous承诺是有序的。
  • 它不一定是vim,因为我正在首先检查编辑器的ENV
  • 我把它比作git commit,在编辑器popup并允许input之前closures
  • 在一个小的testing程序中,我可以得到完美的function,但是当试图通过另一个过程来做到这一点时,它不会很好

tl; dr:我想忽略父进程而input只去vim(child_process),但我不能让他们分开,正因为如此,程序去haywire

如果有什么我可以澄清,请让我知道。 谢谢!

我知道这是旧的,但无论如何,6天前他们发布了一个function与2015.02.06版本0.12.0(稳定),使这很容易。

 var spawnSync=require("child_process").spawnSync; spawnSync("vim",[__filename],{stdio:"inherit"}); 

它当然会阻止事件循环,但在这种情况下,您可能需要等待用户。 否则,在编辑时,最终可能会有节点写入标准输出和读取标准input,这显然是非常混乱的,这是您遇到的问题。

如果你在编辑的时候仍然需要asynchronous的东西,那么可能需要更简单一些(“child_process”),所以你不要混淆stdin / stdout。 我想你可以做一些花哨的东西来删除所有的听众,并在稍后添加它们,但这可能是不值得的。