2011-07-24 6 views
1

私はRubyを使用しています。同じ場所に複数行の文字列を複数回印刷するにはどうすればよいですか?

複数の行の文字列があります。私は同じ場所に複数回、複数行の文字列を印刷したい。

私がしたいのは、文字列が何度か更新される情報を表すからです。

どうすればこの問題を解決できますか?オプションとして

+0

予想される入力と予想される出力の例を追加します。あなたがここで探しているものを理解できるとは言えません。 –

+0

@Mauricio:ナッシュの答えをチェックしてください。それが私が達成したい行動です。私は '\ r'を使って1行にしたいことができることを期待していました。そして、はるかにクリーンです。より良い提案ができる場合は、新しい回答を追加してください。 – Nerian

答えて

2

3.times do |i| 
    print str = "string#{i}\nstring#{i}\nstring#{i}\n" 
    sleep 1 # just for test 
    system('clear') 
end 
+0

私はあなたの答えを受け入れることが最も簡単で、どんな文脈でもうまくいきます。 – Nerian

+0

約束どおり、どんな文脈でも「働き」をクリアしますか?私は確信していません。 Windowsでは、システムコール(少なくとも以前はそれ)は 'cls'になります。 – vgoff

1

これは、Mac OS XのライオンにTerminal.appでしかし、各行の1つの文字に動作しますが、終了時にクリアされます。これはTerminal.appのバグだと思う。あなたが使用することができ

CR = "\r" 
CLEAR = "\e[0J" 
RESET = CR + CLEAR 

lines_count = 3 

3.times do |i| 
    puts "First line #{i}" 
    puts "Second line #{i}" 
    puts "Third line #{i}" 
    sleep(1) 
    $stdout.flush 

    lines_count.times do 
    print "\e[1F" 
    print "\e[1K" 
    end 
end 
print "\e[#{lines_count}E" 
1

あなたの出力を処理するためにcursesを使用していますが、それはおそらく、このような単純なもののためにやり過ぎでしょう。

一般的な方法は、最後の文字列の先頭に出力カーソルを再配置するために一連のバックスペースを印刷することです。 "\b"は必ずしも何かを上書きするわけではないので、安全のために最後にスペースを上書きする必要があります。このような何か:

messages = [ 
    'Professionally simplify seamless systems with prospective benefits.', 
    'Dramatically cultivate worldwide testing procedures for robust potentialities.', 
    'Intrinsicly provide access to future-proof testing procedures after superior supply chains.', 
    'Globally matrix multidisciplinary outsourcing vis-a-vis distributed paradigms.', 
    'Compellingly fashion visionary content via functionalized web services.', 
    'Phosfluorescently e-enable e-markets rather than internal or "organic" sources.' 
] 
reposition = '' 
clear_the_end = '' 
(0 ... messages.length).each do |i| 
    if(i > 0) 
     clear_the_end = ' ' * [0, messages[i - 1].length - messages[i].length].max 
    end 
    $stdout.syswrite(reposition + messages[i] + clear_the_end) 
    reposition = "\b" * (messages[i].length + clear_the_end.length) 
    sleep 1 
end 
puts 
あなたがバッファリングを避けるために syswriteを使用することをお勧めします

putsを追加することをいつも"\n"。この種のことは、あなたが出くわす可能性のある端末ではうまくいくはずです。

また、代わりにバックスペースの束のキャリッジリターン("\r")を使用することができます

# `reposition = "\b" * (messages[i].length + clear_the_end.length)` becomes 
resposition = "\r" 

しかし、あなたはまだあなたが最後の行のすべてを上書きすることを確認するためにいじるすべてclear_the_endが必要になります。