2013-07-02 6 views
5

की एकाधिक पंक्तियों पर डेटा को अपडेट करने के लिए मैं कंसोल की दो पंक्तियों पर डेटा प्रदर्शित करना चाहता हूं। मैं बस हर बार दो लाइनों को अद्यतन करना चाहता हूं।कंसोल

क्या मैं अब तक किया है -

var _logInline = function(alpha, bravo) { 
    process.stdout.cursorTo(0, 0); 
    process.stdout.clearLine(); 
    process.stdout.cursorTo(0); 
    process.stdout.write(alpha.toString()); 
    process.stdout.write('\n'); 
    process.stdout.clearLine(); 
    process.stdout.cursorTo(0); 
    process.stdout.write(bravo.toString()); 
    process.stdout.write('\n'); 

}; 

var delay = 1000; 
var time = 0; 
setInterval(function() { 
    time++; 
    _logInline('alpha-' + time, 'bravo-' + time * time); 
}, delay); 

इस समाधान के साथ स्पष्ट समस्या यह है कि कर्सर खिड़की के शीर्ष के लिए चला जाता है। मुझे यह नहीं चाहिए, इसके बजाय इसे उस सामग्री को प्रदर्शित करना चाहिए जहां कभी कर्सर इस समय है। शायद मुझे अपने तर्क में पहले वर्तमान कर्सर की स्थिति प्राप्त करने की आवश्यकता है। क्या ऐसा करने के लिए कोई रास्ता है?

वैकल्पिक और सबसे पसंदीदा समाधान एक lib जो एक ही बात

संपादित कर सकते हैं पाने के लिए होगा: मैं जो नई लाइन के बिना प्रवेश करने का विकल्प देने के stackoverflow पर कुछ सवाल को देखा है लेकिन वास्तव में यह नहीं है मैं क्या चाहता हूँ। मुझे एकाधिक नो-न्यू-लाइन लॉगिंग चाहिए।

+0

आप कर्सर की स्थिति प्राप्त कर सकते हैं ([यह देखो गीस्ट] (https://gist.github.com/viatropos/3765464)) बैश के साथ लेकिन विंडोज़ में काम नहीं करता है। सबसे आसान समाधान मैंने पाया है: http://pastebin.com/y69by2QE (लेकिन 'कर्सर (0, 0)' का उपयोग करें)। –

उत्तर

0

ncurses सबसे शक्तिशाली पुस्तकालय मैं टर्मिनल को नियंत्रित करने के लिए प्रयोग किया जाता है, वहाँ MSCDEX से एक उत्कृष्ट NPM पैकेज कि ग पुस्तकालय को बांधता है https://npmjs.org/package/ncurses

लेकिन हो सकता है यह आपकी आवश्यकताओं के लिए थोड़ा overkill है, यहाँ है

this gist के आधार पर मैं एक साथ रख दिया निम्नलिखित कोड अपने उदाहरण के लिए अनुकूलित, आप download it from gist या इसे यहाँ पढ़ सकते हैं, भूल नहीं है करने के लिए कार्यकारी अनुमतियाँ देने के लिए: कोई वैकल्पिक समाधान लेकिन यह एक bash स्क्रिप्ट का उपयोग शामिल है बैश स्क्रिप्ट के साथ:

chmod +x cursor-position.sh 

कर्सर-position.js

module.exports = function(callback) { 
    require('child_process').exec('./cursor-position.sh', function(error, stdout, stderr){ 
    callback(error, JSON.parse(stdout)); 
    }); 
} 

cursor-position.sh

#!/bin/bash 
# based on a script from http://invisible-island.net/xterm/xterm.faq.html 
# http://stackoverflow.com/questions/2575037/how-to-get-the-cursor-position-in-bash 
exec < /dev/tty 
oldstty=$(stty -g) 
stty raw -echo min 0 
# on my system, the following line can be replaced by the line below it 
echo -en "\033[6n" > /dev/tty 
# tput u7 > /dev/tty # when TERM=xterm (and relatives) 
IFS=';' read -r -d R -a pos 
stty $oldstty 
# change from one-based to zero based so they work with: tput cup $row $col 
row=$((${pos[0]:2} - 1)) # strip off the esc-[ 
col=$((${pos[1]} - 1)) 
echo \{\"row\":$row,\"column\":$col\} 

index.js

var getCursorPosition = require('./cursor-position'); 

var _logInline = function(row, msg) { 
    if(row >= 0) row --; //litle correction 
    process.stdout.cursorTo(0, row); 
    process.stdout.clearLine(); 
    process.stdout.cursorTo(0, row); 
    process.stdout.write(msg.toString()); 
}; 

var delay = 1000; 
var time = 0; 

//Start by getting the current position 
getCursorPosition(function(error, init) { 
    setInterval(function() { 
     time++; 
     _logInline(init.row, 'alpha-' + time); 
     _logInline(init.row + 1, 'bravo-' + time * time); 
    }, delay); 
});