From: Gregory Brown Date: 2007-08-04T08:01:31+09:00 Subject: Re: HighLine and Readline On 8/3/07, Ari Brown wrote: > Hey, > > Good news: > > In my quest for buffer a user's input serverside, I have found an > answer (which is rather easy). > Oh, and I got HighLine working over sockets. > > I need to use HighLine::Question with the Readline attribute. > > But unfortunately, according to the documentation I found, using the > readline attribute will make readline be a ruby-rebel and use it's > own input and output streams ($stdin and $stdout, I assume). > > So my question is this: How can I make the readline attribute use > specific input and output streams? > > I'm imaging something like this (it is probably waaaaaaay wrong): > > a = HighLine.new(@sock, @sock) > a.ask("monkey? ") {|q| q.readline(@sock, @sock) } Here's the relevant source, as you can see it ignores your input stream. I'll leave it to James to comment further, but I'm sure we wouldn't mind making it easier to handle what you're trying to do if it can be done easily enough. # # Read a line of input from the input stream and process whitespace as # requested by the Question object. # # If Question's _readline_ property is set, that library will be used to # fetch input. *WARNING*: This ignores the currently set input stream. # # Raises EOFError if input is exhausted. # def get_line( ) if @question.readline require "readline" # load only if needed # capture say()'s work in a String to feed to readline() old_output = @output @output = StringIO.new say(@question) question = @output.string @output = old_output # prep auto-completion completions = @question.selection.abbrev Readline.completion_proc = lambda { |string| completions[string] } # work-around ugly readline() warnings old_verbose = $VERBOSE $VERBOSE = nil answer = @question.change_case( @question.remove_whitespace( Readline.readline(question, true) ) ) $VERBOSE = old_verbose answer else raise EOFError, "The input stream is exhausted." if @input.eof? @question.change_case(@question.remove_whitespace(@input.gets)) end end