【发布时间】:2014-11-20 17:23:15
【问题描述】:
我正在使用 node.js 编写一个生成单元测试文件的命令行界面。我一直在使用查询器来获取用户输入,但是有一个字段,用户很可能想要复制粘贴和/或编辑大型多行 JSON 数据块。因此,我的目标是: 在 CLI 中打开 vim @ 某个点 -> 允许输入 -> 关闭 vim -> 写出到 tmp 文件 -> 处理结果。
问题是 vim 的输入也进入父标准输入,当按下返回键时,程序在 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),但我不能将它们分开,因此,程序出现问题
如果有什么我可以澄清的,请告诉我。 谢谢!
【问题讨论】:
-
为什么不像 Git、Subversion 或 Mercurial 那样做呢?将您希望您的用户编辑的内容写入一个临时文件,使用该文件打开 Vim,编辑其内容,写入,相当,使用该临时文件的内容进行下一步。
-
这与我想要做的非常相似。问题是我如何获取他们的输入,因为它在另一个程序中运行,并且可以说流非常纠结。另外,他们会输入文字,我不会给他们编辑的东西
标签: node.js vim stdio child-process piping