2012-05-14 1 views
17

Ho visto questa demo una volta che ha stampato un paragrafo di testo (come avresti ottenuto digitando some-command --help), quindi è tornato su un paio di parole chiave nel testo e ha cambiato il colore del testo, dopo che era già stato stampato nel terminale.Come si modifica il testo esistente (e si sposta il cursore) nel terminale?

Questo mi sembra pazzesco. Come hanno fatto?

Iniziando a pensarci, immagino che stdout e stdin siano tecnicamente un "flusso IO", quindi forse è una variabile persistente che tiene traccia della posizione di un cursore? Ricordo di aver fatto qualcosa del genere quando costruivo un parser per la lingua.

L'obiettivo sarebbe questo: diciamo di digitare quanto segue nella console, e restituisce una matrice vuota perché in Node.js, è tutto asincrono e non vogliamo scrivere la funzione asincrona ogni volta nella console:

$ node app.js 
> App.User.all() 
=> [] 

Poi, quando il callback asincrona esegue, si torna indietro e modificare il => [] per includere il risultato:

$ node app.js 
> App.User.all() 
=> [#<User id:1>, #<User id:2>...] 

sarebbe fantastico per almeno sapere come implementare, anche se ci sono un molte altre questioni su cui lavorare (non correlate a questa domanda. E so che puoi definire un callback globale e fare qualcosa come App.User.all(_c)).

Come si modifica l'uscita del terminale dopo che è già stato stampato?

risposta

39

finalmente trovato che "demo":

+0

È anche importante notare che gli ultimi 2 codici (Salva posizione del cursore e ripristina posizione del cursore) non sono supportati ovunque. Come indicato nella seconda fonte da voi fornita: "Questi ultimi due codici NON sono onorati da molti emulatori di terminali. Gli unici che sono a conoscenza di ciò sono xterm e nxterm - anche se la maggior parte degli emulatori di terminale sono basati sul codice xterm. – GGG

+2

Non può essere utilizzato in stringhe di modelli o in modalità rigorosa, ma è possibile sostituire l'ottale ' \ 033' con hex '\ x1b' o unicode' \ u001b'. –

0

Se si sta lavorando in Mac OX X, credo che il programma Eddie faccia qualcosa come "modificare l'output del terminale dopo che è già stato stampato". (vedi "Eddie (editor di testo) su Wikipedia").

Sotto il menu file, selezionare "Nuovo" e quindi in "Impostazioni/Impostazioni documento ..." selezionare "Finestra Shell". Quindi prova un paio di comandi Unix: date, ls, cal, ecc. Quindi metti il ​​cursore e modifica questi.

Avrei provato con Node ma non ho potuto installarlo (nodo) su Mac OS X 10.5.8.