私は、コマンドラインから入力を読み込む小さなスクリプトをRubyで書いています。Rubyスクリプトの矢印キーイベントのキャプチャ
私は上下、左、右矢印信号をキャッチしたいと思います。私はターミナルのように何かしたい。 (あなたが上矢印を押したときに前のコマンドを持っていたら...) どうすればいいですか?あなたがtermios
のようなものを使用することができ、完全にバッファリングされていない入力を行うには
私は、コマンドラインから入力を読み込む小さなスクリプトをRubyで書いています。Rubyスクリプトの矢印キーイベントのキャプチャ
私は上下、左、右矢印信号をキャッチしたいと思います。私はターミナルのように何かしたい。 (あなたが上矢印を押したときに前のコマンドを持っていたら...) どうすればいいですか?あなたがtermios
のようなものを使用することができ、完全にバッファリングされていない入力を行うには
。ただし、矢印キーシーケンスを手動で解釈する必要があります。
あなたは、私が以前に述べた、または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.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
あなたは[GNUのreadlineの](http://www.gnu.org/s/readline/)のような何かをしたいですか?また、どのオペレーティングシステムをターゲットにしていますか? –
Linuxの場合は、http://stackoverflow.com/questions/897687/ruby-keyboard-event-handlingを参照してください。 –
コマンドリピートがすべて必要な場合は、 'gets'がそれを提供すると思います。 – itdoesntwork