2

毎秒時間を記録するsetIntervalがあります。STDINを使用してスクリプト内のコマンドを実行したいのですが、入力中にSTDOUTがカーソルを移動し、プロンプトに表示されます。

私はプロンプトの経験があまりなく、これに飛び込み始めたばかりです。

脚本:

setInterval(function(){
    console.log(new Date().toUTCString());
},1000)

var readline = require('readline');

var rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

rl.question("Hi there, how are you?", function(answer) {

});

出力:

Hi there, how are you?Mon, 17 Dec 2012 16:20:34 GMT
fine
Mon, 17 Dec 2012 16:20:35 GMT
Mon, 17 Dec 2012 16:20:36 GMT
Mon, 17 Dec 2012 16:20:37 GMT
Mon, 17 Dec 2012 16:20:38 GMT

このようなことをどのように解決しますか?すべてのSTDOUTをキャッシュし、画面をクリアし、すべてのSTDOUTを書き込み、console.log()がログを記録するたびに再度プロンプトを表示しますか?

はい、出力が入力の上にとどまるようなチャットベースのシステム/コマンドラインインターフェイスを作成したいと思います。

ありがとう!

4

1 に答える 1

3

基本的にあなたが求めているのは、複雑な端末アプリケーションを作成する方法です。このための最も一般的なライブラリは呼び出されncursesここにノード バインディングがあります。残念ながら、私はそれを個人的に使用した経験がありません。

あなたの他のオプションは、あなたが言ったようにして、独自の内部バッファを使用して端末を手動で再レンダリングすることです。ノードのttyモジュールdocs hereを使用して出力端末のサイズを取得し、 ANSI エスケープ コードを使用して端末をクリアし、カーソルを目的の場所に配置してから、目的のprocess.stdout.writeものを印刷するために使用できます。

こちらの他の質問でエスケープコードの使用例を見ることができます

于 2012-12-17T16:48:22.997 に答える