Чтобы сделать небуферизованный ввод, вы можете использовать что-то вроде termios
. Однако вам придется интерпретировать последовательности клавиш со стрелками вручную.
Если вы можете жить со средним слоем для завершения истории, я предлагаю использовать GNU readline , как упоминалось ранее, или библиотеку RawLine от H3RALD:
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