Vorrei poter aprire Vim
dal programma node.js in esecuzione nel terminale, creare del contenuto, salvare e uscire da Vim
e quindi prelevare il contenuto del file.Come posso aprire un'applicazione terminale da node.js?
sto cercando di fare qualcosa di simile:
filename = '/tmp/tmpfile-' + process.pid
editor = process.env['EDITOR'] ? 'vi'
spawn editor, [filename], (err, stdout, stderr) ->
text = fs.readFileSync filename
console.log text
Tuttavia, quando questo viene eseguito, si blocca solo il terminale.
Ho anche provato con exec
e ho ottenuto lo stesso risultato.
Aggiornamento:
Questo è complicato dal fatto che questo processo viene lanciato da un comando digitato al prompt con readline esecuzione. Ho completamente estrapolato le parti rilevanti della mia ultima versione in un file. Qui è nella sua interezza:
{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()
Il modo in cui funziona come esposizione qui sopra, è che mostra una richiesta per un paio di secondi, e poi lancia a Vim, ma il TTY è incasinato. Posso modificare, e salvare il file, e il contenuto è stampato correttamente. C'è anche un po 'di junk stampato sul terminale in uscita, e la funzionalità Readline è rotta dopo (nessuna freccia su/giù, nessun tab).
Se annullo la riga cli.pause()
, il TTY è OK in Vim, ma sono bloccato in modalità di inserimento e la chiave Esc
non funziona. Se colpisco Ctrl-C
si chiude il processo figlio e genitore.
Puoi far luce sul caso d'uso? Vuoi interagire con Vim eseguendo i suoi comandi o semplicemente scrivendo un file su disco? –
L'intenzione è chiedere a un utente di utilizzare l'editor per creare il contenuto? O intendi guidare 'vim' completamente da' node.js'? – sarnold
Voglio poter aprire 'vim' in modo che possa creare contenuto, e al termine, uscire e fare in modo che il nodo acquisisca il contenuto del file temporaneo, che invierò come parte di una richiesta HTTP dal nodo. – mkopala