【问题标题】:stdio/piping issues when using vim in child process in node.js在 node.js 的子进程中使用 vim 时的 stdio/管道问题
【发布时间】: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


【解决方案1】:

我知道这已经过时了,但无论如何,在 6 天前,他们发布了 2015.02.06 版本 0.12.0(稳定版)的一个功能,使这变得非常容易。

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

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

如果您在编辑时确实仍然需要异步内容,那么 require("child_process").fork 可能更容易,这样您就不会混淆标准输入/标准输出。我想你可以做一些花哨的事情来删除所有的听众,然后再把它们加回来,但这可能不值得。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 2021-04-23
    相关资源
    最近更新 更多