我正在使用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?,但仍然存在一些我需要帮助的小缺失链接
注意:
tl; dr:我想忽略父进程,而输入只发送到vim(child_process),但我无法将它们分开,因此,程序变得混乱
如果有任何我可以澄清的内容,请告诉我。 谢谢!
答案 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。我想你可以做一些花哨的东西来删除所有听众并稍后再添加它们,但它可能不值得努力。