私はRubyを使用しています。同じ場所に複数行の文字列を複数回印刷するにはどうすればよいですか?
複数の行の文字列があります。私は同じ場所に複数回、複数行の文字列を印刷したい。
私がしたいのは、文字列が何度か更新される情報を表すからです。
どうすればこの問題を解決できますか?オプションとして
私はRubyを使用しています。同じ場所に複数行の文字列を複数回印刷するにはどうすればよいですか?
複数の行の文字列があります。私は同じ場所に複数回、複数行の文字列を印刷したい。
私がしたいのは、文字列が何度か更新される情報を表すからです。
どうすればこの問題を解決できますか?オプションとして
これは、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"
あなたの出力を処理するために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
が必要になります。
予想される入力と予想される出力の例を追加します。あなたがここで探しているものを理解できるとは言えません。 –
@Mauricio:ナッシュの答えをチェックしてください。それが私が達成したい行動です。私は '\ r'を使って1行にしたいことができることを期待していました。そして、はるかにクリーンです。より良い提案ができる場合は、新しい回答を追加してください。 – Nerian