【问题标题】:Output to console while preserving user input in ruby输出到控制台,同时在 ruby​​ 中保留用户输入
【发布时间】:2011-01-23 09:03:55
【问题描述】:

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

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

>abcdehellofgh

并且用户可以在最后继续输入。我希望它显示:

hello
>abcdefgh

【问题讨论】:

  • 你能接受使用 ncurses 库的解决方案吗?
  • 当然。我不熟悉那个包,但我愿意看一个例子。
  • 更深入地查看 ncurses,它确实看起来像我需要的,我只是不知道如何实现这一点。该库非常复杂,并且没有很好地记录 ruby​​ 绑定。

标签: ruby input console


【解决方案1】:

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

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

客户端和服务器将使用某种消息格式交换数据——可能是 YAML,因为它与 Ruby 配合得非常好,但它可能会简单得多。

(不过,我不确定这是否正是您问题的答案。)

【讨论】:

  • 这是一个很好的解决方法,我同意它可能是一个更好的设计,但我目前只能这样做。
【解决方案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!"    

附: 对于系统(“stty raw -echo”),请参见(用户 Jay) How to get a single character without pressing enter?

【讨论】:

  • 我是为一个为网络课程编写的聊天程序做的。效果很好。
猜你喜欢
  • 2016-05-10
  • 2019-08-20
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
  • 2015-07-19
  • 2013-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多