输出到控制台,同时保留ruby中的用户输入

时间:2010-03-03 19:30:32

标签: ruby input console

我有一个ruby脚本,它同时和异步地从服务器接收和显示消息,并允许用户在控制台上输入。当收到消息时,它当前正在用户正在键入的内容中写入。输入本身没有乱码,但看起来很糟糕。理想情况下,它会保存用户当前输入,输出消息,然后在下一行恢复输入。我通过拦截每一个击键来完成这个,但我记得的是,这是一个很大的麻烦。我对红宝石很新,所以我不确定是否有一个很好的方法来做到这一点,或者如何做到这一点。

示例:用户正在输入>abcde,消息hello进来,用户输入fgh。控制台现在显示:

>abcdehellofgh

用户可以在最后继续输入。我希望它能显示出来:

hello
>abcdefgh

2 个答案:

答案 0 :(得分:2)

我提案的两个重要部分是:
1. system(“stty raw -echo”)#即可立即获得与
组合的任何类型字符 2.使用STDIN.getc和string-var作为输入缓冲区来重新打印用户输入。

按9(&布尔变量incoming_message)用于服务器消息的超简单模拟。
(更加现实会使这个例子膨胀而不会增加太多,因为无论如何你必须适应你的场景。)

按x退出。

示例输出:

$ ruby simultaneous_input_and_output.rb
Hello World!9
The incoming message is: true
Hello World!9x

You entered:
Hello World!9x
End!



#!/usr/bin/ruby

$input_buffer = "";  
incoming_message = false

begin  
  system("stty raw -echo")  

  begin   
    str = STDIN.getc  
    print str.chr  

    $input_buffer = $input_buffer + str.chr  
    if str.chr == '9'  
      incoming_message = true  
    end  
    if incoming_message   
      puts "\nThe incoming message is: " + incoming_message.to_s  
      print $input_buffer  
      incoming_message = false  
    end  
  end while (str.chr != 'x')  
ensure  
  system("stty -raw echo")  
end  

puts "\n\nYou entered:"   
puts $input_buffer  
puts "End!"    

P.S .: for system(“stty raw -echo”)见(用户周杰伦) How to get a single character without pressing enter?

答案 1 :(得分:1)

我将面临几乎相同的问题。

我决定改变方法。我打算写一个简单的客户端,底部有一个文本输入框,屏幕的其余部分有一个消息窗口。

客户端和服务器将使用某种消息格式交换数据 - 可能是YAML,因为它与Ruby一起工作得很好,但它可能会相当简单。

(但我不确定这只是你问题的答案。)