2010-02-25 13 views
29

जब आप git clone चलाते हैं, तो यह स्थान पर प्रगति अद्यतन करता है। उदाहरण के लिए, वस्तुओं का प्रतिशत जगह में परिवर्तन प्राप्त हुआ।टर्मिनल या कंसोल में प्रगति आउटपुट

[email protected]:~/cloj/src$ git clone git://git.boinkor.net/slime.git 
Initialized empty Git repository in /home/user/cloj/src/slime/.git/ 
remote: Counting objects: 15936, done. 
remote: Compressing objects: 100% (5500/5500), done. 
Receiving objects: 28% (4547/15936), 3.16 MiB | 165 KiB/s 

यह कैसे पूरा किया जाता है? क्या यह बैकस्पेस वर्णों और नियमित चरित्र आउटपुट के कुछ संयोजन की तरह, ncurses या कुछ भी सरल का उपयोग करता है?

मुझे विशेष रूप से दिलचस्पी है कि रूबी से इस तरह के कंसोल आउटपुट को कैसे पूरा किया जा सकता है।

EDIT

मेरा मूल प्रश्न उत्तर दिया गया है। लेकिन यहां एक परिशिष्ट है। जब आप MPlayer का उपयोग करते हैं, उदाहरण के लिए, यह न केवल वर्तमान प्रगति दिखाने के लिए एक लाइन को अपडेट करता है, बल्कि पिछला लाइन (उदा। जब आप रोकें दबाते हैं)।

===== PAUSE ===== 
A: 79.9 (01:19.9) of 4718.0 (1:18:38.0) 0.3% 

आप आउटपुट के दो लाइनों को कैसे अपडेट करेंगे?

+1

इसके अलावा http://stackoverflow.com/questions/613305/infinite-yields-from-an-iterator – vladr

+0

पर एक नज़र डालें, यह प्रश्न और संबंधित उत्तर ठीक है जो स्टैक ओवरफ़्लो महान बनाता है। उनके लिए धन्यवाद। – num1

उत्तर

36

कैरिज रिटर्न का उपयोग करें। '\ r' आमतौर पर काम करना चाहिए।

+9

यहां एक उदाहरण दिया गया है: '10. टाइम्स {| i | STDOUT.write "\ r # {i}"; नींद 1} ' –

+0

धन्यवाद। लेकिन यूनिक्स में \ r का प्रभाव क्यों है? – dan

+1

@dan: शायद इसका उत्तर है: http://en.wikipedia.org/wiki/Carriage_return –

0

रूबी के लिए कई शाप पुस्तकालय हैं। मुझे विश्वास है कि आरबीबीसीआर सबसे ज्यादा बनाए रखा है।

7

git/progress.c

... 
     eol = done ? done : " \r"; 
... 
       fprintf(stderr, "...%s", ..., eol); 
       fflush(stderr); 

Git बस एक गाड़ी वापसी और कोई लाइन फीड, जो टर्मिनल "पहले कॉलम में ले जाएँ" के रूप में व्याख्या उत्सर्जन करता है।

4

आपको दो पंक्तियों को अद्यतन करने के लिए एक और विधि (जैसे शापित) का उपयोग करना होगा।

ablogaboutcode.com | web.archive.org

... और ...

http://www.ruby-doc.org/stdlib-1.9.3/libdoc/curses/rdoc/Curses.html

+0

ब्लॉग आलेख का लिंक मर चुका है। कृपया वेब लिंक के साथ अपने लिंक लपेटें। – Overbryd

+1

@ ओवरब्रिड, यह मर चुका नहीं है। लेकिन इसका व्यवहार अनुमानित नहीं है। –

+0

कूल, बहुत बहुत धन्यवाद। वास्तव में उस लेख की आवश्यकता है। – Overbryd

1

मैं बहु उत्पादन अद्यतन के लिए थोड़ा वर्ग ने लिखा है:

class ConsoleReset 
    # Unix 
    # Contains a string to clear the line in the shell 
    CLR = "\e[0K" 
    # ANSI escape sequence for hiding terminal cursor 
    ESC_CURS_INVIS = "\e[?25l" 
    # ANSI escape sequence for showing terminal cursor 
    ESC_CURS_VIS = "\e[?25h" 
    # ANSI escape sequence for clearing line in terminal 
    ESC_R_AND_CLR = "\r#{CLR}" 
    # ANSI escape sequence for going up a line in terminal 
    ESC_UP_A_LINE = "\e[1A" 

    def initialize 
    @first_call = true 
    end 

    def reset_line(text = '') 
    # Initialise ANSI escape string 
    escape = "" 

    # The number of lines the previous message spanned 
    lines = text.strip.lines.count - 1 

    # Clear and go up a line 
    lines.times { escape += "#{ESC_R_AND_CLR}#{ESC_UP_A_LINE}" } 

    # Clear the line that is to be printed on 
    # escape += "#{ESC_R_AND_CLR}" 

    # Console is clear, we can print! 
    STDOUT.print escape if [email protected]_call 
    @first_call = false 
    print text 
    end 

    def hide_cursor 
    STDOUT.print(ESC_CURS_INVIS) 
    end 

    def show_cursor 
    STDOUT.print(ESC_CURS_VIS) 
    end 

    def test 
    hide_cursor 

    5.times do |i| 
     line = ['==========================================='] 
     (1..10).each do |num| 
     line << ["#{num}:\t#{rand_num}"] 
     end 
     line << ['==========================================='] 
     line = line.join("\n") 
     reset_line(line) 
     sleep 1 
    end 

    show_cursor 

    puts '' 
    end 

    private 
    def rand_num 
     rand(10 ** rand(10)) 
    end 
end 

prydonius/spinning_cursor से प्रेरित होकर। उदाहरण के उपयोग के लिए test विधि देखें।

संबंधित मुद्दे