Me gustaría poder abrir Vim
desde el programa node.js que se ejecuta en el terminal, crear algo de contenido, guardar y salir de Vim
, y luego tomar el contenido del archivo.¿Cómo abro una aplicación de terminal desde node.js?
estoy tratando de hacer algo como esto:
filename = '/tmp/tmpfile-' + process.pid
editor = process.env['EDITOR'] ? 'vi'
spawn editor, [filename], (err, stdout, stderr) ->
text = fs.readFileSync filename
console.log text
Sin embargo, cuando este funciona, simplemente se cuelga el terminal.
También lo probé con exec
y obtuve el mismo resultado.
Actualización:
Esto se complica por el hecho de que este proceso se inicia desde un comando escrito en un símbolo con readline ejecución. Extraje completamente las partes relevantes de mi última versión a un archivo. Aquí es en su totalidad:
{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()
La forma en que funciona como demostración arriba, es que muestra un mensaje para un par de segundos, y luego se lanza en a Vim, pero el TTY está en mal estado. Puedo editar y guardar el archivo, y los contenidos se imprimen correctamente. También hay un montón de basura impresa en el terminal al salir, y la funcionalidad Readline se rompe después (sin flecha arriba/abajo, sin completar la pestaña).
Si elimino el comentario de la línea cli.pause()
, entonces el TTY está bien en Vim, pero estoy atascado en el modo de inserción, y la clave Esc
no funciona. Si toco Ctrl-C
, sale del proceso hijo y principal.
Puede arrojar alguna luz sobre el caso de uso? ¿Desea interactuar con Vim ejecutando sus comandos o simplemente escribiendo un archivo en el disco? –
¿La intención es pedirle a un usuario que use el editor para crear el contenido? ¿O tiene la intención de conducir 'vim' completamente desde' node.js'? – sarnold
Quiero poder abrir 'vim' para que pueda crear contenido, y cuando termine, salga y haga que node capture los contenidos del archivo temporal, que luego enviaré como parte de una solicitud HTTP desde un nodo. – mkopala