Как открыть терминальное приложение из node.js?

Я хотел бы иметь возможность открыть 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 и получил тот же результат.

Обновление:

Дело осложняется тем, что этот процесс запускается из команды, набранной в приглашении с запущенным readline. Я полностью извлек соответствующие части моей последней версии в файл. Вот он полностью:

{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 после этого нарушена (нет стрелок вверх/вниз, нет завершения Tab).

Если я раскомментирую строку cli.pause(), то TTY работает нормально в Vim, но я застрял в режиме вставки, и клавиша Esc не работает. Если я нажимаю Ctrl-C, то выхожу из дочернего и родительского процесса.

24
задан mkopala 3 February 2012 в 19:20
поделиться