使用 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();
});

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

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

最新更新