在node.js中的子进程中使用vim时出现stdio / piping问题

时间:2014-11-20 17:23:15

标签: node.js vim stdio child-process piping

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

问题是输入到vim也会转到父stdin,当命中返回键时,程序继续在vim(混乱)之上。我很确定stdio / in / out / err没有正确设置,但我似乎无法在任何地方找到确切的解决方案。我操纵流的每次迭代看起来都比较接近,但我知道有一个小的缺失链接。

我尝试过很多方面的事情:

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操作How do I open a terminal application from node.js?,但仍然存在一些我需要帮助的小缺失链接

注意:

  • 我99%确定我的异步承诺是有序的。
  • 它不一定是vim,因为我正在检查ENV 首先是编辑
  • 我把它比作git commit,其中一个编辑器弹出并允许输入 在结束之前
  • 在一个小型测试程序中,我可以获得完美的功能,但何时 试图在另一个过程中执行此操作,它并不顺利

tl; dr:我想忽略父进程,而输入只发送到vim(child_process),但我无法将它们分开,因此,程序变得混乱

如果有任何我可以澄清的内容,请告诉我。 谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

它当然会阻止事件循环,但在这种情况下,您可能希望等待用户。否则,您可能最终会在编辑时将节点写入stdout并读取stdin,这显然非常令人困惑,并且是您遇到的问题。

如果您在编辑时仍然需要异步内容,则可能更容易要求(" child_process")。fork,这样您就不会混淆stdin / stdout。我想你可以做一些花哨的东西来删除所有听众并稍后再添加它们,但它可能不值得努力。