module Doing::PromptInput
Methods for requesting user text input
Public Instance Methods
Request single-line input
@param prompt [String] The prompt @param default_response [String] The default response returned if :default_answer is true
@return [String] The user response
@deprecated Use {#read_line} instead
# File lib/doing/prompt/input.rb, line 19 def enter_text(prompt, default_response: '') $stdin.reopen('/dev/tty') return default_response if @default_answer print "#{yellow(prompt).sub(/:?$/, ':')} #{reset}" $stdin.gets.strip end
Request single-line input using Readline. Allows for control sequences and tab completions
@param prompt [String] The prompt @param completions [Array] Array
of tab completions @param default_response [String] The default response returned if :default_answer is true
@return [String] User input string
# File lib/doing/prompt/input.rb, line 41 def read_line(prompt: 'Enter text', completions: [], default_response: '') $stdin.reopen('/dev/tty') return default_response if @default_answer unless completions.empty? completions.sort! comp = proc { |s| completions.grep(/^#{Regexp.escape(s)}/) } Readline.completion_append_character = ' ' Readline.completion_proc = comp end begin Readline.readline("#{yellow(prompt).sub(/:?$/, ':')} #{reset}", true).strip rescue Interrupt raise UserCancelled end end
Request multi-line input using Readline. Allows for control sequences and tab completion
@param prompt [String] The prompt @param completions [Array] Array
of tab completions @param default_response [String] The default response returned if :default_answer is true
@return [String] Multi-line result, joined with newlines
# File lib/doing/prompt/input.rb, line 73 def read_lines(prompt: 'Enter text', completions: [], default_response: '') $stdin.reopen('/dev/tty') return default_response if @default_answer completions.sort! comp = proc { |s| completions.grep(/^#{Regexp.escape(s)}/) } Readline.completion_append_character = ' ' Readline.completion_proc = comp puts format(['%<promptcolor>s%<prompt>s %<textcolor>sEnter a blank line', '(%<keycolor>sreturn twice%<textcolor>s)', 'to end editing and save,', '%<keycolor>sCTRL-C%<textcolor>s to cancel%<reset>s'].join(' '), { promptcolor: boldgreen, prompt: prompt.sub(/:?$/, ':'), textcolor: yellow, keycolor: boldwhite, reset: reset }) res = [] begin while (line = Readline.readline('> ', true)) break if line.strip.empty? res << line.chomp end rescue Interrupt return nil end res.join("\n").strip end
Request multi-line input
@param prompt [String] The prompt @param default_response [String] The default response, returned if :default_answer is true
@deprecated Use {#read_lines} instead
# File lib/doing/prompt/input.rb, line 113 def request_lines(prompt: 'Enter text', default_response: '') $stdin.reopen('/dev/tty') return default_response if @default_answer ask_note = [] reader = TTY::Reader.new(interrupt: -> { raise Errors::UserCancelled }, track_history: false) puts "#{boldgreen(prompt.sub(/:?$/, ':'))} #{yellow('Hit return for a new line, ')}#{boldwhite('enter a blank line (')}#{boldyellow('return twice')}#{boldwhite(') to end editing')}" loop do res = reader.read_line(green('> ')) break if res.strip.empty? ask_note.push(res) end ask_note.join("\n").strip end