class Reline::LineEditor

def generate_searcher

def generate_searcher
new do |first_key|
_search_key = first_key
ch_word = String.new(encoding: @encoding)
ibyte_buf = String.new(encoding: 'ASCII-8BIT')
_hit = nil
 first_key
 "\C-r".ord
ompt_name = 'reverse-i-search'
 "\C-s".ord
ompt_name = 'i-search'
 do
y = Fiber.yield(search_word)
arch_again = false
se key
en -1 # determined
Reline.last_incremental_search = search_word
break
en "\C-h".ord, "\C-?".ord
grapheme_clusters = search_word.grapheme_clusters
if grapheme_clusters.size > 0
  grapheme_clusters.pop
  search_word = grapheme_clusters.join
end
en "\C-r".ord, "\C-s".ord
search_again = true if prev_search_key == key
prev_search_key = key
se
multibyte_buf << key
if multibyte_buf.dup.force_encoding(@encoding).valid_encoding?
  search_word << multibyte_buf.dup.force_encoding(@encoding)
  multibyte_buf.clear
end
d
t = nil
 not search_word.empty? and @line_backup_in_history&.include?(search_word)
@history_pointer = nil
hit = @line_backup_in_history
se
if search_again
  if search_word.empty? and Reline.last_incremental_search
    search_word = Reline.last_incremental_search
  end
  if @history_pointer
    case prev_search_key
    when "\C-r".ord
      history_pointer_base = 0
      history = Reline::HISTORY[0..(@history_pointer - 1)]
    when "\C-s".ord
      history_pointer_base = @history_pointer + 1
      history = Reline::HISTORY[(@history_pointer + 1)..-1]
    end
  else
    history_pointer_base = 0
    history = Reline::HISTORY
  end
elsif @history_pointer
  case prev_search_key
  when "\C-r".ord
    history_pointer_base = 0
    history = Reline::HISTORY[0..@history_pointer]
  when "\C-s".ord
    history_pointer_base = @history_pointer
    history = Reline::HISTORY[@history_pointer..-1]
  end
else
  history_pointer_base = 0
  history = Reline::HISTORY
end
case prev_search_key
when "\C-r".ord
  hit_index = history.rindex { |item|
    item.include?(search_word)
  }
when "\C-s".ord
  hit_index = history.index { |item|
    item.include?(search_word)
  }
end
if hit_index
  @history_pointer = history_pointer_base + hit_index
  hit = Reline::HISTORY[@history_pointer]
end
d
se prev_search_key
en "\C-r".ord
prompt_name = 'reverse-i-search'
en "\C-s".ord
prompt_name = 'i-search'
d
 hit
if @is_multiline
  @buffer_of_lines = hit.split("\n")
  @buffer_of_lines = [String.new(encoding: @encoding)] if @buffer_of_lines.empty?
  @line_index = @buffer_of_lines.size - 1
  @line = @buffer_of_lines.last
  @byte_pointer = @line.bytesize
  @cursor = @cursor_max = calculate_width(@line)
  @rerender_all = true
  @searching_prompt = "(%s)`%s'" % [prompt_name, search_word]
else
  @line = hit
  @searching_prompt = "(%s)`%s': %s" % [prompt_name, search_word, hit]
end
last_hit = hit
se
if @is_multiline
  @rerender_all = true
  @searching_prompt = "(failed %s)`%s'" % [prompt_name, search_word]
else
  @searching_prompt = "(failed %s)`%s': %s" % [prompt_name, search_word, last_hit]
end
d