class Reline::Core
def add_dialog_proc(name_sym, p, context = nil)
def add_dialog_proc(name_sym, p, context = nil) raise ArgumentError unless name_sym.instance_of?(Symbol) if p.nil? @dialog_proc_list.delete(name_sym) else raise ArgumentError unless p.respond_to?(:call) @dialog_proc_list[name_sym] = DialogProc.new(p, context) end end
def ambiguous_width
def ambiguous_width may_req_ambiguous_char_width unless defined? @ambiguous_width @ambiguous_width end
def auto_indent_proc=(p)
def auto_indent_proc=(p) raise ArgumentError unless p.respond_to?(:call) or p.nil? @auto_indent_proc = p end
def basic_quote_characters=(v)
def basic_quote_characters=(v) @basic_quote_characters = v.encode(encoding) end
def basic_word_break_characters=(v)
def basic_word_break_characters=(v) @basic_word_break_characters = v.encode(encoding) end
def completer_quote_characters=(v)
def completer_quote_characters=(v) @completer_quote_characters = v.encode(encoding) end
def completer_word_break_characters=(v)
def completer_word_break_characters=(v) @completer_word_break_characters = v.encode(encoding) end
def completion_append_character=(val)
def completion_append_character=(val) if val.nil? @completion_append_character = nil elsif val.size == 1 @completion_append_character = val.encode(encoding) elsif val.size > 1 @completion_append_character = val[0].encode(encoding) else @completion_append_character = nil end end
def completion_case_fold
def completion_case_fold @config.completion_ignore_case end
def completion_case_fold=(v)
def completion_case_fold=(v) @config.completion_ignore_case = v end
def completion_proc=(p)
def completion_proc=(p) raise ArgumentError unless p.respond_to?(:call) or p.nil? @completion_proc = p end
def completion_quote_character
def completion_quote_character @completion_quote_character end
def dialog_proc(name_sym)
def dialog_proc(name_sym) @dialog_proc_list[name_sym] end
def dig_perfect_match_proc=(p)
def dig_perfect_match_proc=(p) raise ArgumentError unless p.respond_to?(:call) or p.nil? @dig_perfect_match_proc = p end
def emacs_editing_mode
def emacs_editing_mode config.editing_mode = :emacs nil end
def emacs_editing_mode?
def emacs_editing_mode? config.editing_mode_is?(:emacs) end
def encoding
def encoding io_gate.encoding end
def filename_quote_characters=(v)
def filename_quote_characters=(v) @filename_quote_characters = v.encode(encoding) end
def get_screen_size
def get_screen_size io_gate.get_screen_size end
def initialize
def initialize self.output = STDOUT @mutex = Mutex.new @dialog_proc_list = {} yield self @completion_quote_character = nil end
def inner_readline(prompt, add_history, multiline, rprompt: nil, &confirm_multiline_termination)
def inner_readline(prompt, add_history, multiline, rprompt: nil, &confirm_multiline_termination) ['RELINE_STDERR_TTY'] o_gate.win? tderr = File.open(ENV['RELINE_STDERR_TTY'], 'a') tderr.reopen(ENV['RELINE_STDERR_TTY'], 'w') err.sync = true err.puts "Reline is used by #{Process.pid}" config.test_mode or config.loaded? ig.read ate.set_default_key_bindings(config) io_gate.prep q_ambiguous_char_width roke.encoding = encoding ditor.reset(prompt) tiline _editor.multiline_on lock_given? ne_editor.confirm_multiline_termination_proc = confirm_multiline_termination _editor.multiline_off ditor.completion_proc = completion_proc ditor.completion_append_character = completion_append_character ditor.output_modifier_proc = output_modifier_proc ditor.prompt_proc = prompt_proc ditor.auto_indent_proc = auto_indent_proc ditor.dig_perfect_match_proc = dig_perfect_match_proc ditor.rprompt = rprompt&.encode(encoding) put_hook&.call Reline::IOGate.dumb? log_proc_list.each_pair do |name_sym, d| ne_editor.add_dialog_proc(name_sym, d.dialog_proc, d.context) ditor.update_dialogs ditor.rerender _editor.set_signal_handlers do ad_io(config.keyseq_timeout) { |inputs| inputs.each do |key| case key.method_symbol when :bracketed_paste_start # io_gate is Reline::ANSI because the key :bracketed_paste_start is only assigned in Reline::ANSI key = Reline::Key.new(io_gate.read_bracketed_paste, :insert_multiline_text) when :quoted_insert, :ed_quoted_insert char = io_gate.read_single_char(config.keyseq_timeout.fdiv(1000)) key = Reline::Key.new(char || '', :insert_raw_char) end line_editor.set_pasting_state(io_gate.in_pasting?) line_editor.update(key) end line_editor.finished? line_editor.render_finished break se line_editor.rerender d ate.move_cursor_column(0) Errno::EIO ybe the I/O has been closed. _editor.finalize ate.deprep(otio)
def input=(val)
def input=(val) raise TypeError unless val.respond_to?(:getc) or val.nil? if val.respond_to?(:getc) && io_gate.respond_to?(:input=) io_gate.input = val end end
def io_gate
def io_gate Reline::IOGate end
def may_req_ambiguous_char_width
def may_req_ambiguous_char_width uous_width = 1 if io_gate.dumb? || !STDIN.tty? || !STDOUT.tty? if defined? @ambiguous_width e.move_cursor_column(0) ut.write "\u{25bd}" Encoding::UndefinedConversionError NG=C iguous_width = 1 iguous_width = io_gate.cursor_pos.x == 2 ? 2 : 1 e.move_cursor_column(0) e.erase_after_cursor
def output=(val)
def output=(val) raise TypeError unless val.respond_to?(:write) or val.nil? @output = val io_gate.output = val end
def output_modifier_proc=(p)
def output_modifier_proc=(p) raise ArgumentError unless p.respond_to?(:call) or p.nil? @output_modifier_proc = p end
def pre_input_hook=(p)
def pre_input_hook=(p) @pre_input_hook = p end
def prompt_proc=(p)
def prompt_proc=(p) raise ArgumentError unless p.respond_to?(:call) or p.nil? @prompt_proc = p end
def read_io(keyseq_timeout, &block)
`ESC` is ambiguous because it can be a standalone ESC (matched) or part of
is considered as matched.
If the next character does not arrive within the specified timeout, input
ambiguous whether it is matching or matched.
GNU Readline watis for "keyseq-timeout" milliseconds when the input is
def read_io(keyseq_timeout, &block) = [] = KeyStroke::MATCHING o out = status == KeyStroke::MATCHING_MATCHED ? keyseq_timeout.fdiv(1000) : Float::INFINITY io_gate.getc(timeout) .nil? || c == -1 status == KeyStroke::MATCHING_MATCHED status = KeyStroke::MATCHED sif buffer.empty? # io_gate is closed and reached EOF block.call([Key.new(nil, nil, false)]) return se status = KeyStroke::UNMATCHED d ffer << c atus = key_stroke.match_status(buffer) tatus == KeyStroke::MATCHED || status == KeyStroke::UNMATCHED panded, rest_bytes = key_stroke.expand(buffer) st_bytes.reverse_each { |c| io_gate.ungetc(c) } ock.call(expanded) turn
def readline(_prompt = '', _add_history = false, prompt: _prompt, add_history: _add_history, rprompt: nil)
def readline(_prompt = '', _add_history = false, prompt: _prompt, add_history: _add_history, rprompt: nil) @mutex.synchronize do io_gate.with_raw_input do inner_readline(prompt, add_history, false, rprompt: rprompt) end line = line_editor.line.dup line.taint if RUBY_VERSION < '2.7' if add_history and line and line.chomp("\n").size > 0 Reline::HISTORY << line.chomp("\n") end line_editor.reset_line if line_editor.line.nil? line end end
def readmultiline(_prompt = '', _add_history = false, prompt: _prompt, add_history: _add_history, rprompt: nil, &confirm_multiline_termination)
def readmultiline(_prompt = '', _add_history = false, prompt: _prompt, add_history: _add_history, rprompt: nil, &confirm_multiline_termination) @mutex.synchronize do unless confirm_multiline_termination raise ArgumentError.new('#readmultiline needs block to confirm multiline termination') end io_gate.with_raw_input do inner_readline(prompt, add_history, true, rprompt: rprompt, &confirm_multiline_termination) end whole_buffer = line_editor.whole_buffer.dup whole_buffer.taint if RUBY_VERSION < '2.7' if add_history and whole_buffer and whole_buffer.chomp("\n").size > 0 Reline::HISTORY << whole_buffer end if line_editor.eof? line_editor.reset_line # Return nil if the input is aborted by C-d. nil else whole_buffer end end end
def special_prefixes=(v)
def special_prefixes=(v) @special_prefixes = v.encode(encoding) end
def vi_editing_mode
def vi_editing_mode config.editing_mode = :vi_insert nil end
def vi_editing_mode?
def vi_editing_mode? config.editing_mode_is?(:vi_insert, :vi_command) end