3

receive_lineEventMachine LineText2プロトコルを使用しており、新しい行を入力するときだけでなく、キーボードの文字を押すたびにメソッドを起動したいと思います。そのデフォルトの動作を変更する方法はありますか?

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)
}
4

3 に答える 3

6

端末からバッファリングされていない入力を受け取りたい場合は、標準入力で canonical-mode をオフにする必要があります。(画面を読みやすくするために 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
于 2013-01-31T09:42:48.243 に答える
0

以前に EventMachine を使用したことはありませんが、EventMachine wiki のこのページは、LineText2バッファリングされた行が必要ないように聞こえるため、プロトコルを使用しないことを示しているようです。

彼らはこの例を挙げています:

module MyKeyboardHandler
  def receive_data(keystrokes)
    puts "I received the following data from the keyboard: #{keystrokes}"
  end
end

EM.run {
  EM.open_keyboard(MyKeyboardHandler)
}

それはあなたが望むものをあなたに与えますか?

于 2013-01-29T23:09:19.177 に答える