开发者

How can I print a multiline string in the same place multiple times?

I am using Ruby.

I have a string with multiple lines. I want to print that multiple-lines-string in the same place multiple times.

The reason I want t开发者_如何学Pythono do that is because the string represents information that is going to be updated several times.

How can I accomplish this?


As an option:

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


You could use uses curses to handle your output but that would probably be overkill for something simple like this.

The usual way is to print out a bunch of backspaces to reposition the output cursor at the beginning of your last string; be aware that "\b" doesn't necessarily overwrite anything so you'll have to overwrite the end with spaces to be safe. Something like this:

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

You'll want to use syswrite to avoid buffering and the usual "\n" that puts appends. This sort of thing should work in any terminal that you're likely to come across.

You could also use a carriage return ("\r") instead of a bunch of backspaces:

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

But you'll still need all the clear_the_end fiddling to make sure you overwrite all of the last line.


This will work however in Terminal.app on Mac OS X Lion the 1 character of each line is cleared on exit. I think this is a bug of 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"
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜