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

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

示例:用户正在键入>abcde ,并且消息hello进入,用户键入fgh之后。 控制台现在显示:

 >abcdehellofgh 

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

 hello >abcdefgh 

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

按9(&boolean variable 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!" 

PS:对于系统(“stty raw -echo”)看(用户周杰伦) 如何在不按回车的情况下获得单个角色?

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

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

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

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