ruby - EventMachine 如何编写对按键使用react的键盘处理程序

标签 ruby eventmachine

我使用 EventMachine LineText2 协议(protocol),我想在每次按下键盘上的字符时触发 receive_line 方法,而不仅仅是在输入新行时触发。有没有办法改变这种默认行为?

class KeyboardHandler < EM::Connection
  include EM::Protocols::LineText2

  def initialize(q)
    @queue = q
  end

  def receive_line(data)
    @queue.push(data)
  end
end

EM.run {
  q = EM::Queue.new

  callback = Proc.new do |line|
    # puts on every keypress not on "\n"
    puts line
    q.pop(&callback)
  end
  q.pop(&callback)

  EM.open_keyboard(KeyboardHandler, q)
}

最佳答案

如果你想从终端接收无缓冲的输入,你应该关闭标准输入的规范模式。 (我还关闭了 echo 以使屏幕更易于阅读。)在您的代码调用 #open_keyboard 之前或在您的处理程序初始化程序中添加:

require 'termios'
# ...
attributes = Termios.tcgetattr($stdin).dup
attributes.lflag &= ~Termios::ECHO # Optional.
attributes.lflag &= ~Termios::ICANON
Termios::tcsetattr($stdin, Termios::TCSANOW, attributes)

例如:

require 'termios'
require 'eventmachine'

module UnbufferedKeyboardHandler
  def receive_data(buffer)
    puts ">>> #{buffer}"
  end
end

EM.run do
  attributes = Termios.tcgetattr($stdin).dup
  attributes.lflag &= ~Termios::ECHO
  attributes.lflag &= ~Termios::ICANON
  Termios::tcsetattr($stdin, Termios::TCSANOW, attributes)

  EM.open_keyboard(UnbufferedKeyboardHandler)
end

关于ruby - EventMachine 如何编写对按键使用react的键盘处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14474266/

相关文章:

ruby - 在 Padrino 中设置时区

ruby - MRI Ruby 和 jRuby 的性能差异

ruby-on-rails - 在 Rails 3 (3.0.3) 中设置 Shoulda under Test/Unit

mysql - 无法将字符串转换为整数 - 从散列中的散列中提取值

ruby - 使用 postgresql gem 异步

ruby - EventMachine HTTP 请求无法通过 HTTPS 在代理后面连接

html - 我如何/应该在 YAML 文件中声明冒号(标点符号)?

ruby - 想了解 EM-Synchrony 、em-http-request 和 Fiber 之间的关系吗?

ruby - 可延迟与回调接口(interface)

ruby - EventMachine:定时器和回调在主线程中运行吗?