2012-01-02 10 views
3

私は、コマンドラインから入力を読み込む小さなスクリプトをRubyで書いています。Rubyスクリプトの矢印キーイベントのキャプチャ

私は上下、左、右矢印信号をキャッチしたいと思います。私はターミナルのように何かしたい。 (あなたが上矢印を押したときに前のコマンドを持っていたら...) どうすればいいですか?あなたがtermiosのようなものを使用することができ、完全にバッファリングされていない入力を行うには

+0

あなたは[GNUのreadlineの](http://www.gnu.org/s/readline/)のような何かをしたいですか?また、どのオペレーティングシステムをターゲットにしていますか? –

+0

Linuxの場合は、http://stackoverflow.com/questions/897687/ruby-keyboard-event-handlingを参照してください。 –

+0

コマンドリピートがすべて必要な場合は、 'gets'がそれを提供すると思います。 – itdoesntwork

答えて

2

。ただし、矢印キーシーケンスを手動で解釈する必要があります。

あなたは、私が以前に述べた、またはRawLineライブラリH3RALDによって同様に、GNUのreadlineのを使用することをお勧め履歴完了のための中間層と一緒に暮らすことができる場合:

http://www.h3rald.com/rawline/
http://www.h3rald.com/articles/real-world-rawline-usage/

例のバッファなし入力はtermios

require 'rubygems' 
require 'termios' 

def with_unbuffered_input 
    old_attrs = Termios.tcgetattr(STDOUT) 

    new_attrs = old_attrs.dup 

    new_attrs.lflag &= ~Termios::ECHO 
    new_attrs.lflag &= ~Termios::ICANON 

    Termios::tcsetattr(STDOUT, Termios::TCSANOW, new_attrs) 

    yield 
ensure 
    Termios::tcsetattr(STDOUT, Termios::TCSANOW, old_attrs) 
end 

with_unbuffered_input do 
    10.times { 
    c = STDIN.getc 
    puts "Got #{c}" 
    } 
end 
-1

ルビ1.9.3以降、io/consoleにはルビーが付属しています。一つは、その#rawがバッファリングされていない入力を達成するために使用することができます。

http://ruby-doc.org/stdlib-2.2.2/libdoc/io/console/rdoc/IO.html#method-i-raw

しかし、矢印キーは、文字の列ではなく、単一の文字で表現されています。このシーケンスは常に"\e"で始まりますが、残念ながらシーケンス終了マーカーはありません。

このような何かが、矢印キーを読み取るために使用することができます。

require 'io/console' 
require 'timeout' 

def readkey 
    c = '' 
    result = '' 
    $stdin.raw do |stdin| 
    c = stdin.getc 
    result << c 
    if c == "\e" 
     begin 
     while (c = Timeout::timeout(0.0001) { stdin.getc }) 
      result << c 
     end 
     rescue Timeout::Error 
     # no action required 
     end 
    end 
    end 
    result 
end 

puts readkey.inspect #=> outputs "\e[D" if left arrow is pressed 
関連する問題