class IRB::RelineInputMethod

def show_doc_dialog_proc

def show_doc_dialog_proc
  doc_namespace = ->(matched) {
    preposing, _target, postposing, bind = @completion_params
    @completor.doc_namespace(preposing, matched, postposing, bind: bind)
  }
  ->() {
    dialog.trap_key = nil
    alt_d = [
      [Reline::Key.new(nil, 0xE4, true)], # Normal Alt+d.
      [27, 100], # Normal Alt+d when convert-meta isn't used.
      [195, 164], # The "ä" that appears when Alt+d is pressed on xterm.
      [226, 136, 130] # The "∂" that appears when Alt+d in pressed on iTerm2.
    ]
    if just_cursor_moving and completion_journey_data.nil?
      return nil
    end
    cursor_pos_to_render, result, pointer, autocomplete_dialog = context.pop(4)
    return nil if result.nil? or pointer.nil? or pointer < 0
    name = doc_namespace.call(result[pointer])
    options = {}
    options[:extra_doc_dirs] = IRB.conf[:EXTRA_DOC_DIRS] unless IRB.conf[:EXTRA_DOC_DIRS].empty?
    driver = RDoc::RI::Driver.new(options)
    if key.match?(dialog.name)
      begin
        driver.display_names([name])
      rescue RDoc::RI::Driver::NotFoundError
      end
    end
    begin
      name = driver.expand_name(name)
    rescue RDoc::RI::Driver::NotFoundError
      return nil
    rescue
      return nil # unknown error
    end
    doc = nil
    used_for_class = false
    if not name =~ /#|\./
      found, klasses, includes, extends = driver.classes_and_includes_and_extends_for(name)
      if not found.empty?
        doc = driver.class_document(name, found, klasses, includes, extends)
        used_for_class = true
      end
    end
    unless used_for_class
      doc = RDoc::Markup::Document.new
      begin
        driver.add_method(doc, name)
      rescue RDoc::RI::Driver::NotFoundError
        doc = nil
      rescue
        return nil # unknown error
      end
    end
    return nil if doc.nil?
    width = 40
    right_x = cursor_pos_to_render.x + autocomplete_dialog.width
    if right_x + width > screen_width
      right_width = screen_width - (right_x + 1)
      left_x = autocomplete_dialog.column - width
      left_x = 0 if left_x < 0
      left_width = width > autocomplete_dialog.column ? autocomplete_dialog.column : width
      if right_width.positive? and left_width.positive?
        if right_width >= left_width
          width = right_width
          x = right_x
        else
          width = left_width
          x = left_x
        end
      elsif right_width.positive? and left_width <= 0
        width = right_width
        x = right_x
      elsif right_width <= 0 and left_width.positive?
        width = left_width
        x = left_x
      else # Both are negative width.
        return nil
      end
    else
      x = right_x
    end
    formatter = RDoc::Markup::ToAnsi.new
    formatter.width = width
    dialog.trap_key = alt_d
    mod_key = RUBY_PLATFORM.match?(/darwin/) ? "Option" : "Alt"
    message = "Press #{mod_key}+d to read the full document"
    contents = [message] + doc.accept(formatter).split("\n")
    contents = contents.take(preferred_dialog_height)
    y = cursor_pos_to_render.y
    Reline::DialogRenderInfo.new(pos: Reline::CursorPos.new(x, y), contents: contents, width: width, bg_color: '49')
  }
end