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

cap*_*aig 5 ruby console input

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

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

>abcdehellofgh
Run Code Online (Sandbox Code Playgroud)

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

hello
>abcdefgh
Run Code Online (Sandbox Code Playgroud)

use*_*727 2

我的建议的两个重要部分是:
1. system("stty raw -echo") # 立即获取任何键入的字符
2. 使用 STDIN.getc 和 string-var 作为输入缓冲区来重新打印用户输入。

按 9(和布尔变量传入消息)用于对服务器消息进行超简单的模拟。
(更现实会在不增加太多内容的情况下使示例变得臃肿,因为无论如何你都必须根据你的场景调整这个想法。)

按 x 退出。

示例输出:

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

You entered:
Hello World!9x
End!
Run Code Online (Sandbox Code Playgroud)



#!/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!"    
Run Code Online (Sandbox Code Playgroud)

PS:对于系统(“stty raw -echo”)请参阅(用户Jay) 如何在不按回车键的情况下获取单个字符?