Мне хотелось бы открыть 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. Я полностью извлек соответствующие части моей последней версии в файл. Вот оно целиком:
{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 перепутано. Я могу редактировать и сохранять файл, и содержимое печатается правильно. На выходе также есть куча нежелательной печати, которая также выводится на терминал, а после этого функция Breakline прерывается (стрелка вверх/вниз, не заполняется вкладкой).
Если я раскомментирую строку cli.pause()
, тогда TTY в порядке, в Vim, но я застрял в режиме вставки, а ключ Esc
не работает. Если я ударил Ctrl-C
, он прекратит дочерний процесс и родительский процесс.