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 char` or part of CSI sequence (matching).
`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