首页 > 解决方案 > 使用 child_process.spawn() 在原始模式下打开 VIM 会导致它冻结

问题描述

请注意以下脚本:

const child_process = require('child_process');

process.stdin.setRawMode(true);
process.stdin.on("data", (data) => {});

var child = child_process.spawn("vim", ["README.md"], {stdio: "inherit"});
child.on("exit", (e, code) => {
  process.exit();
});

它设置原始模式,然后README.md打开vim。输入几秒钟后,VIM 完全停止响应。按键什么都不做,唯一的恢复方法是关闭选项卡。这个问题是通过删除on("data")回调来解决的。我在 macOS Catalina 上使用 iTerm,节点版本v13.10.1。这个脚本是错误的,还是 Node.js、VIM 或 iTerm 上的错误?

标签: javascriptnode.jsmacosvimiterm

解决方案


这似乎是在process.stdin.on("data")活动时引起的,这导致 Node.js 挂起等待输入。这可以通过process.stdin.pause在产生子进程之前使用来解决,然后process.stdin.resume在内部继续监听child.on("exit")


推荐阅读