如何从Node.js启动文本编辑器?

3

我正在尝试在Node.js脚本中使用以下命令打开Unix文本编辑器(在此示例中为nano):

  if (process.argv[2] === 'edit') {
    require('child_process').spawn("sudo", ["nano", dbFile], {
      stdio: 'inherit'
    });
    process.exit(); // try to block here in order not to execute rest of code in this file
  }

这会打开nano,但是文本很奇怪,而且我无法输入任何内容。


真的 ("nano " + dbFile).split(' ') 应该是 ["nano", dbFile] - undefined
你说得对,但在这种情况下它们会产生相同的结果。我会相应地更新问题。 - undefined
2
你可能想查看一下这个网址:https://dev59.com/3Wox5IYBdhLWcg3wklCE。其中有关于vi的问题,被接受的答案还谈到了可能遇到的问题,比如需要从父节点进程中捕获输入,并将流导入到nano子进程中。 - undefined
3个回答

1
我稍微修改了一下。在你生成的进程上添加了一个对data事件的监听器。
var dbFile = 'lol.js';
var editorSpawn = require('child_process').spawn("nano", [dbFile], {
  stdio: 'inherit',
  detached: true
});

editorSpawn.on('data', function(data){
  process.stdout.pipe(data);
});

data监听器内部,process.stdout.pipe将nano的输出流传输到终端。
我添加了自己的变量并删除了sudo,因为它给我带来了错误。你应该能够将这个应用到你的代码中。

0

尝试使用 pty.js

你可能想将标准输入设置为 原始模式。这样所有的按键都会被报告为数据事件。否则,你只能得到每次按下 return 键的行。

process.stdin.setEncoding('utf8');
process.stdin.setRawMode(true);      

var pty = require('pty.js');

var nano = pty.spawn('nano', [], {
   name: 'xterm-color',
   cols: process.stdout.columns,
   rows: process.stdout.rows,
   cwd: '.',
   env: process.env
});

nano.pipe(process.stdout);
process.stdin.pipe(nano);

nano.on('close', function () {
    process.exit();
});

0
我接着 @Sgnl 的回答继续说。
const { exit } = require("process");
const { spawn } = require("child_process");

const openConfigWithNano = async (pathToConfig) => {
  var nano = spawn("nano", [pathToConfig], {
    stdio: "inherit",
    detached: true,
  });

  nano.on("error", (err) => {
    console.error("Failed to start nano: ");
    console.error(err);
  });

  nano.on("data", function (data) {
    process.stdout.pipe(data);
  });
  await new Promise((resolve) => {
    nano.on("close", resolve);
  });
  exit();
};

等待"close"事件的发生可以停止父进程。我从这个答案中找到了解决方案:https://dev59.com/NmEh5IYBdhLWcg3wfzpE#69025854

它不起作用。它有一个语法错误 (data: any),即使修复了它,它仍然不起作用。你能运行这段代码吗? - undefined
@ceremcem 现在我修复了语法错误,我可以运行这段代码了。请注意,为了使函数起作用,您需要调用它。 - undefined
在我的这边不起作用,整个.js进程只是启动然后终止了。也许我需要理解代码,然后根据我的需求进行更改。还是谢谢。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接