如何从 Node.js 打开终端应用程序?

2024-03-24

我希望能够打开Vim从终端中运行的node.js程序中,创建一些内容,保存并退出Vim,然后抓取文件的内容。

我正在尝试做这样的事情:

filename = '/tmp/tmpfile-' + process.pid

editor = process.env['EDITOR'] ? 'vi'
spawn editor, [filename], (err, stdout, stderr) ->

  text = fs.readFileSync filename
  console.log text

然而,当它运行时,它只是挂起终端。

我也尝试过exec并得到相同的结果。

Update:

由于此过程是通过在提示符下键入的命令启动的,因此情况变得复杂readline http://nodejs.org/docs/latest/api/readline.html跑步。我将最新版本的相关部分完全提取到一个文件中。全文如下:

{spawn} = require 'child_process'
fs = require 'fs'
tty = require 'tty'
rl = require 'readline'

cli = rl.createInterface process.stdin, process.stdout, null
cli.prompt()

filename = '/tmp/tmpfile-' + process.pid

proc = spawn 'vim', [filename]

#cli.pause()
process.stdin.resume()

indata = (c) ->
    proc.stdin.write c
process.stdin.on 'data', indata

proc.stdout.on 'data', (c) ->
    process.stdout.write c

proc.on 'exit', () ->
    tty.setRawMode false
    process.stdin.removeListener 'data', indata

    # Grab content from the temporary file and display it
    text = fs.readFile filename, (err, data) ->
        throw err if err?  
        console.log data.toString()

        # Try to resume readline prompt
        cli.prompt()

它的工作方式如上所示,它会显示几秒钟的提示,然后启动到 Vim,但 TTY 混乱了。我可以编辑并保存文件,并且内容可以正确打印。退出时也会在终端上打印一堆垃圾,并且 Readline 功能随后被破坏(没有向上/向下箭头,没有制表符完成)。

如果我取消注释cli.pause()行,那么 Vim 中的 TTY 就可以了,但我陷入了插入模式,并且Esc钥匙不起作用。如果我打Ctrl-C它退出子进程和父进程。


您可以从主进程继承stdio。

const child_process = require('child_process')
var editor = process.env.EDITOR || 'vi';

var child = child_process.spawn(editor, ['/tmp/somefile.txt'], {
    stdio: 'inherit'
});

child.on('exit', function (e, code) {
    console.log("finished");
});

更多选项在这里:http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 Node.js 打开终端应用程序? 的相关文章

随机推荐