2013-02-19 64 views
4

我希望能夠輸出兩行到終端,然後刪除它們兩個。我知道你可以做這樣的事情使用ruby刪除多行終端輸出

print "\b"*whatever 

做一個,但我希望做更多的東西是這樣的:

[1, 2, 3, 4, 5].each do |item| 
    # code to delete the previous two lines 
    print item.to_s + "\nHello!" 
end 

輸出會很快經過以下所有

1 
Hello! 
2 
Hello! 
3 
Hello! 
4 
Hello! 
5 
Hello! 

但最後,最後的迭代將是你所看到的。

回答

11

好吧,對於簡單的事情,如果你可以假設一個兼容ANSI的終端(通常是一個不錯的選擇),你可以直接輸出ANSI codes。例如,

5.times do |item| 
    print "\r" + ("\e[A\e[K"*3) if item > 0 
    puts "#{item+1}\nHello!" 
end 

\r將光標移動到該行的開始,\e[A將光標上移一行,並\e[K從光標位置到行的末尾被清除。如果你不需要屏幕上的任何東西,只要你把光標放在你想要的位置,你也可以發送\e[J;一直清除到屏幕的最後。

對於更復雜的東西,您可以先看看the Highline gem