2010-02-25 32 views
29

Khi bạn chạy git clone, nó sẽ cập nhật tiến trình tại chỗ. Ví dụ, tỷ lệ phần trăm của các đối tượng nhận được thay đổi tại chỗ.Đầu ra tiến độ tại chỗ trong thiết bị đầu cuối hoặc bảng điều khiển

[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 

Điều này đã hoàn thành như thế nào? Liệu nó có sử dụng ncurses hoặc một cái gì đó thậm chí đơn giản hơn, giống như một số kết hợp của các ký tự backspace và đầu ra ký tự thường xuyên?

Tôi đặc biệt quan tâm đến cách loại đầu ra bàn điều khiển này có thể được hoàn thành từ Ruby.

EDIT

Câu hỏi ban đầu của tôi được trả lời. Nhưng đây là phụ lục. Ví dụ: khi bạn sử dụng MPlayer, nó không chỉ cập nhật một dòng để hiển thị tiến độ hiện tại, mà còn là dòng trước đây (ví dụ: khi bạn nhấn tạm dừng).

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

Bạn sẽ cập nhật hai dòng đầu ra tại chỗ như thế nào?

+1

Ngoài ra, hãy xem http://stackoverflow.com/questions/613305/infinite-yields-from-an-iterator – vladr

+0

Câu hỏi này và câu trả lời được liên kết chính xác là điều khiến Stack tràn tuyệt vời. Cảm ơn bạn vì họ. – num1

Trả lời

36

Sử dụng phương tiện chuyên chở. '\ r' thường hoạt động.

+9

Đây là một ví dụ: '10.times {| i | STDOUT.write "\ r # {i}"; ngủ 1} ' –

+0

Cảm ơn. Nhưng tại sao \ r có hiệu ứng trong Unix? – dan

+1

@dan: Có lẽ điều này có câu trả lời: http://en.wikipedia.org/wiki/Carriage_return –

0

Có một số curses librbaries cho Ruby. Tôi tin rằng rbbcurse được duy trì nhiều nhất.

7

git/progress.c

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

Git chỉ đơn giản là phát ra một vận chuyển trở lại và không có thức ăn đường, mà nhà ga giải thích là "di chuyển tới cột đầu tiên".

4

Bạn sẽ phải sử dụng một phương pháp khác (như Curses) để cập nhật hai dòng tại chỗ.

ablogaboutcode.com | web.archive.org

... và ...

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

+0

Liên kết tới bài viết trên blog đã chết. Vui lòng đóng các liên kết của bạn với lưu trữ web. – Overbryd

+1

@Overbryd, nó không chết. Nhưng hành vi của nó không thể đoán trước được. –

+0

Tuyệt vời, cảm ơn rất nhiều. Thực sự cần bài viết đó. – Overbryd

1

tôi đã viết ít lớp để cập nhật sản lượng multiline:

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 

Lấy cảm hứng từ prydonius/spinning_cursor. Xem phương pháp test để sử dụng ví dụ.

Các vấn đề liên quan